我正在开发一个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事件一次又一次地应用于同一个链接,最终导致崩溃。“
答案 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() {
...
});