我使用的是jQuery的.on()
事件处理程序,它仅在我使用$(document)
时才有效。
这有效:
$(function() {
$(document).on("click", ".search .remove", function(e) {
console.log("clicked");
});
});
这不起作用:
$(function() {
$(".search .remove").on("click", function(e) {
console.log("clicked");
});
});
第二个没有任何事情......没有错误或任何事情。它只是没有发射。
答案 0 :(得分:3)
您使用两种不同的.on语法,它们有两种非常不同的结果。
你的第一个是:
$(context).on("event","targetselector",handler)
这会将事件绑定到上下文,任何event
类型的事件都会触发context
e.target
,targetselector
可以使用e.target
选择$(targetselector).on("event",handler)
处理程序targetselector
作为上下文。这通常称为事件委托。
您的第二种语法是
.bind
在这种情况下,事件直接绑定到页面上当前与{{1}}匹配的元素,而不是未来的元素。这与旧的{{1}}基本相同。
答案 1 :(得分:2)
您的第二个示例不起作用,因为您的元素是动态创建的。将.on()
与动态插入元素一起使用时,必须通过未动态插入的元素(即加载时页面上存在的元素)绑定它。
您可以继续使用document
作为祖先元素,但就性能而言,您可能希望在DOM中找到更接近".search .remove"
的元素。
来自.on()
上的jQuery docs:
事件处理程序仅绑定到当前选定的元素;他们 在您的代码调用.on()时页面上必须存在。 要确保元素存在且可以选择,请执行事件 绑定在文档就绪处理程序中的元素 页面上的HTML标记。如果将新HTML注入页面, 选择元素并在新HTML之后附加事件处理程序 放入页面。或者,使用委派事件来附加事件 处理程序,如下所述。 委托事件的优势在于它们可以处理事件 稍后添加到文档中的后代元素。通过 选择一个保证在当时存在的元素 委托事件处理程序附加,您可以使用委托事件 避免频繁附加和删除事件处理程序的需要。这个 element可以是a中视图的容器元素 例如,模型 - 视图 - 控制器设计,或者如果事件是文档 handler希望监视文档中的所有冒泡事件。该 文档元素在之前的文档头部中可用 加载任何其他HTML,因此可以安全地在那里附加事件 等待文件准备好。
答案 2 :(得分:1)
您的第一种方法是已弃用的方法on()
的等效live()
。可能在页面加载完成后动态插入元素。
您可以像下面一样重写您的代码,它应该可以工作:
$(function() {
$(".search").on("click", ".remove", function(e) {
console.log("clicked");
});
});