【问题标题】:How to avoid setting the on click bind event every time the function is ran如何避免每次运行函数时设置点击绑定事件
【发布时间】:2015-11-04 08:01:04
【问题描述】:

所以我制作了这个叠加功能,并且我还让它在点击叠加时关闭它的自身。问题是我每次运行函数时都会绑定点击事件($overlay.click(function() {...}),我认为这对性能不利。有什么想法吗?

function fluidOverlayShow(action, currentElement) {
  var $overlay = $('#fluid-overlay');
  if (action == 'open') {
    $overlay.click(function() {
      emgFluidOverlayShow('close', currentElement);
    });
    $(currentElement).addClass('fluid-bring-front');
    $overlay.addClass('fluid-anim-overlay');
    $overlay.data('statuson', true);
  } else if (action == 'close') {
    $overlay.removeClass('fluid-anim-overlay');
    $overlay.data('statuson', false);
    $('.fluid-header').find('.fluid-bring-front').removeClass('fluid-bring-front');
  }
}

$('#overlay_test').mouseover(function() {
  fluidOverlayShow('open', '#overlay_test');
});

$('#overlay_test').mouseout(function() {
  fluidOverlayShow('close');
});
#fluid-overlay {
  display: none;
  opacity: 0.3;
  position: fixed;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background: #000;
  z-index: 1000;
}

#overlay_test {
  position: relative;
}
  

#fluid-overlay.fluid-anim-overlay {
    display: block;
    -webkit-animation: fade-in-overlay 0.2s 1;
    -moz-animation:    fade-in-overlay 0.2s 1;
    animation:         fade-in-overlay 0.2s 1;
}

.fluid-bring-front {
    z-index: 1100;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<a href="javascript:;" id="overlay_test">Overlay test</a>
<div id="fluid-overlay"></div>

【问题讨论】:

  • 你为什么不把click事件放在外面?
  • 哦,是的,这可以工作。谢谢!
  • 任何时候..快乐编码..:)

标签: javascript jquery overlay


【解决方案1】:

如果您绝对必须在函数中保留点击事件,请使用.on().off(),然后在定义on("click") 之前定义.off("click"),如下所示:

$overlay.off("click").on("click", function() {
  emgFluidOverlayShow('close', currentElement);
});

这将在添加事件绑定之前删除它。

您甚至可以像这样命名点击事件,这样它只会删除该点击实例(以防其他事件被添加到其他地方):

$overlay.off("click.fluidOverlayClose").on("click.fluidOverlayClose", function() {
  emgFluidOverlayShow('close', currentElement);
});

或者...

...按照 Guruprasad Rao 的建议进行操作,并将其移出函数(这是一种更好的处理方式)。

【讨论】:

    【解决方案2】:

    另一种实现使用jQuery's .on() method combined with event delgation。他的意思是,您允许单击事件通过 DOM 冒泡到始终存在的父元素,该元素将捕获并处理事件,而不是每次创建时都必须将其重新绑定到动态元素。

    这看起来像

     $("body").on("click","#fluid-overlay",function() {
         //code goes here
        });
    

    【讨论】:

    • 我认为 .on 对性能的影响几乎一样 :) 还是我错了?
    • 这取决于你走多远的 DOM 树以及你附加 on 事件有多少子元素。如果您只上升一到两个级别,并且该元素只有少数可以触发事件的子元素,那么开销很小,如果您确实上升到正文并且页面有成千上万的子元素那么您可能会遇到一些性能问题。
    • 谢谢你的回答,它澄清了很多关于jquery .on :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    相关资源
    最近更新 更多