我总是使用delegate()将事件绑定到最初加载DOM时不存在的元素。我理解on()应该替换委托,但是我不明白jquery网站上的文档我将如何将以下代码翻译成on()
$(document).delegate(
".Course_Name, .Start_Date, .Book_Title, .Book_Author, .Book_Isbn",
"click",
function()
{
var whichButton = $(this).attr("class");
make_table(whichButton);
fillISBN();
});
答案 0 :(得分:4)
$(document).on("click",
".Course_Name, .Start_Date, .Book_Title, .Book_Author, .Book_Isbn",
function()
{
var whichButton = $(this).attr("class");
make_table(whichButton);
fillISBN();
});
不太难,是吗?
现在的内部.delegate
只是对.on
的引用。 .delegate
实现为
function (selector, types, data, fn) {
return this.on(types, selector, data, fn);
}
答案 1 :(得分:2)
Benamin告诉你该怎么做。以下是为什么的解释。
基本上,原则是不是将侦听器直接附加到选择器,而是将其附加到选择器的某个父对象,并利用事件冒泡。很多人对body
或document
执行此操作,因为所有对象都位于其下方。因此,您将事件侦听器附加到DOM中的某个高级对象,以便您要处理的所有当前和未来元素都在其中,并且单击事件会冒泡到该对象。然后.on()
的第二个参数是选择器,其作用类似于过滤器。
所以IOW而不是:
.delegate()
- 将侦听器附加到此选择器的实例...然后基本上继续寻找这些实例(这是性能下降)。订单是选择>连接。
你有
.on()
- 将一个侦听器附加到这个高级别事物上,然后仅对与选择器匹配的子元素(增强的性能)执行操作。这有效地使它适用于未来的元素,因为更高级别的对象始终存在,而这就是事件附加到的对象。订单是附件>选择。性能提升是因为使用此方法,jQuery不必继续查找将事件附加到的选择器的新实例。