带有上下文传递的jQuery选择器

时间:2011-05-09 23:58:09

标签: jquery

我正在开发一个jQuery教程,有些东西我不太明白为什么。以下是我从教程中删除的部分。粗体句是我不理解的部分,希望有专家向我解释。非常感谢!

“通过Ajax加载内容时遇到的一个非常常见的问题是:在文档中添加也应用于加载内容的事件处理程序时,必须在加载内容后应用这些处理程序。为防止代码重复,你可以委托给一个函数。例如:

 function addClickHandlers() {
   $("a.remote", this).click(function() {
     $("#target").load(this.href, addClickHandlers);
   });
 }

(文档)$。就绪(addClickHandlers); 现在,当DOM准备就绪时,addClickHandlers会被调用一次,然后每当用户点击远程类的链接并且内容已经完成加载时,就会调用它。

请注意$(“a.remote”,this)查询,它作为上下文传递:对于文档就绪事件,它引用文档,因此它在整个文档中搜索具有类远程的锚点。 当addClickHandlers用作load()的回调时,这指的是另一个元素:在示例中,id为target的元素。这可以防止click事件一次又一次地应用于同一个链接,最终导致崩溃。“

2 个答案:

答案 0 :(得分:3)

function addClickHandlers() {
    // this is window
    $("a.remote", this).click(function() {
        // this is a <a class="remote">
        $("#target").load(this.href, addClickHandlers);
    });
}

一般情况下,函数中的this上下文为window,除非使用new关键字调用它,或者它被称为obj.method()(在这种情况下它是obj }})。

因为调用函数addClickHandlers()实际上会调用window.addClickHandlers(),这意味着this值的范围是window

jQuery本身将范围this作为您使用内部回调函数的元素。

.click(function() { ... }) this中将引用被点击的对象。

答案 1 :(得分:1)

为什么你不能只执行live()处理程序绑定,如下所示:

$('#target .elements').live('click', function() {
  ...
});