jquery’Click’事件的奇怪行为
我有一个锚标记
Click me Click me Click me
我想通过点击锚标签执行一些代码。我使用过
$('a').click(function(){ //do something.. });
但它没有成功。 所以我用过
$('a').on('click',function(){ //do something.. });
我也用过
$('a').bind('click',function(){ //do something.. });
但他们也没有用。 对我有用的是
$('a').live('click',function(){ //do something.. });
为什么会这样……当所有人都应该表现出同样的行为时。
.click
和.bind
没有事件委托。 您在将元素加载到DOM之前执行它们。 将.click
移动到锚点下方或将其添加到DOM ready事件中:
$(document).ready(function() { $('a').click(function(){ //do something.. }); });
要么
$(function() { $('a').click(function(){ //do something.. }); });
以上两者都有相同的结果,使用您发现更易读/可维护的任何一个。
.live
现在正在使用,因为它使用事件委托,根据外行人的观点,类似于
$(document).on('click', 'a', function(){ //do something.. });
请注意, .live
在jQuery 1.7+中已弃用,因此您应该更喜欢.on
方法进行事件委派。 另请注意, .on
仅在传递后代selector
参数的父元素绑定时才具有事件委托效果。
这是$(document).ready()
的小提琴 。
编辑:根据OP的评论,由于您要动态添加锚标签,因此您有两个选项:事件委派(推荐)或每次添加新内容时重新绑定事件。
在jQuery 1.7+中,您应该使用.on()
进行事件委派:
$('#AnchorsDivID').on('click', 'a', function(){ //do something.. });
这是一个带有.on
事件委托和Ajax的全function现场演示:
的jsfiddle
在jQuery <= 1.6.4中,您必须使用.delegate()
或.live()
。 在.live()
jQuery API页面中显示了哪个为每个版本提供了更好的可用性和性能。
对于jQuery> = 1.4.3 <1.7:
$('#AnchorsDivID').delegate('a', 'click', function(){ //do something.. });
这段代码与你的html完全一致:
$(document).ready(function(){ $('a').on('click', function(e){ console.log('some action.'); }); });
PS此代码将在所有链接上运行!