以下问题的灵感来自ajaxian.com和this blog entry的this comment by paul irish。
这是一种声明直播活动的方法。
$("li a").live(...)
根据this blog entry,我的理解是,直播活动只不过是文档层面的所有内容。任何一直冒泡到顶部的事件都被实时事件捕获,如果选择器匹配则调用该函数。
我的理解是,如果我调用
,请准备好文档$("li a").live('click', ..)
然后所有jQuery应该做的就是将文字选择器'li a'放在内存中。现在当点击发生时,如果点击一直到顶部,那么live应该检查目标元素是什么。如果目标元素满足'li a'规则,那么应该触发该函数,否则忽略这个冒泡的事件。
基于我打电话时对文件准备的假设
$("li a").live('click', ..)
然后理想情况下jQuery实际上不应该寻找匹配'li a'的所有元素,因为jquery不会对这些元素做任何事情。我确信当前存在于匹配'li a'的文档中的元素没有绑定到任何事件处理程序。
如果所有jQuery必须做的是将文字'li a'放在文档根级别,那么为什么要在文档就绪上寻找符合条件'li a'的元素。但基于我在顶部提到的评论链接,似乎jQuery实际上是在寻找文档准备好的元素。
我的问题是为什么live方法在没有对它们做任何事情时应该找到所有'li a'方法。我想实时语法应该是
$.live('li a', 'click', function(){})
我在这里错过了什么吗?
答案 0 :(得分:5)
我理解为什么它从DOM中获取所有元素是因为这是$()函数的作用,然后在它选择DOM元素后它执行函数live()。
在这种情况下,您需要使用答案中其他地方建议的解决方法之一。
答案 1 :(得分:2)
我通过覆盖find()来解决这个问题:
jQuery.fn.find = function(old) {
return function() {
var m = arguments[0].match(/^lazy:(.*)/);
if(m) {
this.selector = m[1];
return this;
}
return old.apply(this, arguments);
}
} (jQuery.fn.find);
// this will select elements...
$("input").live("click", function() {
// this won't
$("lazy:input").live("click", function() {
答案 2 :(得分:2)
live
只是一种向不易理解的人提供事件授权的方法。
您熟悉概念并需要性能。我建议明确地使用事件委托而不是live
。
$(document).bind('click', function(event)
{
var $target = $(event.target);
if( $target.is('li a') )
{
// Do something with $target
}
});
答案 3 :(得分:0)
目前有一种无证的方式可以在没有预先选择元素的情况下工作
jQuery.fn.selector="p";
jQuery.fn.live('click',function(){
alert('clicked');
});
这允许你设置实时处理程序,而不使用jQuery匹配它当前忽略的DOM中的元素。