我有以下内容:
$("#menu, #home").on('click', 'a', function() {
// javascript code
});
但是里面的文件还没准备好?即使#menu 或#home 还不是DOM 的一部分,它还能正常工作吗?
我有以下内容:
$("#menu, #home").on('click', 'a', function() {
// javascript code
});
但是里面的文件还没准备好?即使#menu 或#home 还不是DOM 的一部分,它还能正常工作吗?
是的,只要您使用 jQuery 1.7+,这将起作用(如果您将调整选择器),而无需等待 DOM 准备好,因为这种形式的事件绑定是使用live
或delegate
在以前的 jQuery 版本中实现的:
请参阅文档live
从 jQuery 1.7 开始,不推荐使用 .live() 方法。使用 .on() 附加事件处理程序。旧版本 jQuery 的用户应该使用 .delegate() 而不是 .live()。
$(document).on('click', '#menu a, #home a', function() {
// javascript code
});
不,它不起作用(见这里:http: //jsfiddle.net/BkxqY/)。您附加的处理程序需要存在的元素。但是,您始终可以委托给执行脚本时确实存在的 DOM 中更高的元素。F.ex,这不起作用:
<script>
$('#menu').on('click', function(e) {
console.log(e);
});
</script>
<a id="menu" href="#">click</a>
但这将:
<div id="menu">
<script>
$('#menu').on('click', 'a', function(e) {
console.log(e);
});
</script>
<a href="#">click</a>
</div>
document
无论何时附加处理程序,您都可以随时委托给,因为document
应该始终可用,f.ex:
<script>
$(document).on('click', '#menu a', function(e) {
console.log(e);
});
</script>
<div id="menu">
<a href="#">click</a>
</div>
与其他答案状态相反,除非所选元素已经存在于dom中,否则它将不起作用。如果它们还没有任何锚元素并且这些元素是在点击事件之前添加的,它将起作用
你可以很容易地尝试一下。在 chrome 中打开开发控制台并输入
$(".hopscoth").on("click","div",function(){alert("I've been clicked");});
$("body").prepend("<div class='hopscoth'><div> text </div></div>");
text
然后点击页面顶部新插入的
然后再次执行第一行并再次单击text
。警报第二次触发,但不是第一次触发
换句话说,第一个选择器必须存在。在您的情况下,必须存在#menu
and元素。#home
在触发事件之前,辅助选择器不必匹配任何内容。因此,您可以在使用 .on 附加事件处理程序之后添加锚元素
不,不需要。如果您希望在页面加载结束时执行脚本,则需要它。
您可以在此处查看此函数的示例,该示例未在 上$(document).ready(function()
执行。
在您的脚本中,有#menu, #home
. 如果您希望脚本按您想要的方式执行,则需要存在具有这些 ID 的元素。
如果代码放在元素之后#menu
而#home
不是之前没有准备好的事件块,则将起作用
带有 2 个点击处理程序的演示,一个在 DOM 中放置的元素之前,一个在 http://jsfiddle.net/hhkKE/之后