【问题标题】:Does attaching event handler with a class selector affects dynamically added elements of that class?使用类选择器附加事件处理程序会影响该类的动态添加元素吗?
【发布时间】:2012-04-09 03:00:51
【问题描述】:

我正在使用 jQuery 将一个函数附加到整个类的单击事件。例如:

$(".clickDiv").click(function(){
   $(this).hide();
});

在我的客户端 javascript 上,我动态创建了更多 .clickDiv 实例。
我需要再次调用$(".clickDiv).click(function...),还是新实例会自动将该函数绑定到点击事件?

【问题讨论】:

  • 不,我做了类似的事情,但新实例不会自动绑定,我必须使用 .live() 函数绑定它们。您可以在 jQuery 网站上查看api.jquery.com/live
  • @anuragsn7。 live 够了!阅读我更新的答案。太多人在使用遗留代码...on,on,on,on,on,on,on,on,on,@987654335 on,on,on,on !!!

标签: javascript jquery delegates


【解决方案1】:

是的,除非您使用delegate event

像这样:

$('#container').on('click', '.clickDiv',  function() {
   $(this).hide();
});

ondocs:

如果选择器被省略或为空,则事件处理程序被称为直接或直接绑定。每次在所选元素上发生事件时都会调用处理程序,无论是从后代(内部)元素的元素或气泡直接发生。

当提供选择器时,事件处理程序被称为委托。当事件直接发生在绑定元素上时,不会调用处理程序,而只会调用与选择器匹配的后代(内部元素)。 jQuery 将事件从事件目标冒泡到附加处理程序的元素(即从最内到最外的元素),并为匹配选择器的路径上的任何元素运行处理程序。

事件处理程序仅绑定到当前选定的元素;当您的代码调用 .on() 时,它们必须存在于页面上。为确保元素存在并且可以被选择,请在页面 HTML 标记中的元素的文档就绪处理程序内执行事件绑定。如果将新 HTML 注入页面,请在将新 HTML 放入页面后选择元素并附加事件处理程序。或者,使用委托事件来附加事件处理程序,如下所述。

委托事件的优点是它们可以处理来自以后添加到文档的后代元素的事件。通过选择在附加委托事件处理程序时保证存在的元素,您可以使用委托事件来避免频繁附加和删除事件处理程序的需要。例如,此元素可以是模型-视图-控制器设计中视图的容器元素,或者如果事件处理程序想要监视文档中的所有冒泡事件,则可以是文档。在加载任何其他 HTML 之前,文档元素在文档头部是可用的,因此在此处附加事件是安全的,而无需等待文档准备好。


仅仅因为这里有太多人建议你应该使用livelive 已被弃用,因为版本1.7on 取代,并在版本1.4.3 中被delegate 取代

$(selector).live(events, data, handler);                // jQuery 1.3+
$(document).delegate(selector, events, data, handler);  // jQuery 1.4.3+
$(document).on(events, selector, data, handler);        // jQuery 1.7+

【讨论】:

  • 谢谢,这是一个很好的答案!我会详细了解委托事件。
  • +1 很好的答案,感谢您引起我的注意(.live 已被弃用 - 我一直在使用它)。但我不会很快改变它(正如我在对另一个答案的评论中所说)
  • 我使用的 jQuery 函数非常有限,所以我使用旧版本的 jQuery 已经有一段时间了。感谢您提供这些有用的信息。
【解决方案2】:
I am attaching an event like : 

$('body').on('click', 'button[data-tracking], a[data-tracking]',

                function(event) { console.log($(event.target));
});

and want to get to the target of element which is set up as :
  <pre> <[]a data-tracking="hello" href="hello">
    \<\span\>test now\<\/span\>
   \<\/a\>
 </pre>
it does work perfectly, but event.target gives me "span" element but what i want is "a" element so that I could get to value of data-tracking attribute. 

【讨论】:

    【解决方案3】:

    这会将事件绑定到所有新实例

    $('.clickDiv').live('click',  function() {
       $(this).hide();
    });
    

    http://api.jquery.com/live/

    【讨论】:

    • 不!又不是live!自 jQuery 1.4.4 起,它已被弃用,不应使用!
    • @gdoron 实际上:As of jQuery 1.7, the .live() method is deprecated. Use .on() to attach event handlers. 你从哪里得到“从 1.4.4 开始”?
    • @gdoron 哦,好吧,我会继续使用.live,因为我在我的所有文件中都使用它,我现在无法更改它,除非它不再起作用我会改变它。 不酷的 jQuery 团队,不酷。
    • @gdoron 好吧,删除一个有用的特性并替换它仍然是 jQuery 团队的错(只是为了节省 2 个字符的文本 - 真的吗?)他们为什么要弃用它?它工作得很好。使用.on.live 有什么好处吗?
    • @gdoron 好的,下次我需要将某些东西绑定到动态元素时,我将使用 on :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    相关资源
    最近更新 更多