为什么需要在jQuery中评估live的表达式

时间:2009-11-05 14:19:27

标签: jquery

以下问题的灵感来自ajaxian.com和this blog entrythis 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(){})

我在这里错过了什么吗?

4 个答案:

答案 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中的元素。