jQuery'单击'自动激发'live'
jQuery 'click' automatically fires 'live'
这里有一段简单的代码:
HTML:
<div id="close">Click me</div>
JS代码:
$("#close").click(function(){
alert("1");
$(this).attr('id','expand');
});
$("#expand").live('click', function(){
alert("2");
$(this).attr('id','close');
});
问题:当我点击"关闭"时,它也会自动调用live()。请参阅jsfiddle:http://jsfiddle.net/uFJkg/
是因为我将同一个元素的id从"关闭"更改为"展开"吗?如何解决此问题?
我试过:
$("#expand").die().live('click', function()
但没有奏效。我尝试了event.stopPropagation(),但也没用。我试着用一个id为"expand"的独立div将其隐藏在document.ready上,但由于某种原因,它也不起作用。
自从我读到live()在jQuery 1.7+中被弃用后,我一直在尝试:
$("#expand").on('click', function(){
但这也不起作用。
有什么想法吗?我想一双新的眼睛将能够发现我所缺少的东西。
谢谢。
在这种情况下,您需要两个委托事件(又名实时)处理程序。因为,您在两个id
之间切换,而这种切换使两个id
对DOM都是动态的。
$("body").on("click", "#close", function(){
alert("1");
$(this).attr('id','expand');
});
$("body").on("click", "#expand", function(){
alert("2");
$(this).attr('id','close');
});
演示
备注
由于live()
已被弃用,因此使用.on()
代替live()
进行委托事件处理。
这与live
附加事件的方式以及事件冒泡的工作方式有关。
.live
将事件处理程序附加到document
。当文档注册一个事件时,它会查看该事件的target
是什么。如果它与传递给.live
的选择器匹配,它就会触发处理程序。
所以,当你点击#close
时,就会发生以下情况:
- 单击
#close
上注册的事件,处理程序将启动 #close
改为#expand
- click事件使DOM冒泡,直到它到达
document
- 单击
document
上的事件寄存器,文档会看到目标元素的ID是#expand
,并启动事件处理程序
解决这个问题的方法是将stopPropagation()
添加到处理程序中:
$("#close").click(function(e){
if(!e) { e = window.event; }
e.stopPropagation();
alert("1");
$(this).attr('id','expand');
});
但是,我建议不要使用live
,而是研究delegate
或on
来处理委派事件。
我还建议不要更改ID。如果你想保持关闭/扩展的想法,我会尝试这样的方法:
<div id="toggler" class="close">Close</div>
$('#toggler').on('click',function() {
$(this).toggleClass('close').toggleClass('expand');
});
一个事件处理程序,没有委派,因为它挂接到永久ID
首先,更改id的运行时不是很干净。你正面临这样的结果之一。
您可以考虑使用数据属性。jQuery可以通过访问数据属性来读取它们。
例如。
$("#myObject").data("expanded", true);
这样就没有必要更改您的身份证。
- 使用clickToggle并在单击另一个元素时关闭元素
- 单击时将焦点更改为元素
- 单击F5时如何停止页面加载
- 通过单击表单中的按钮,在代码生成中使用javascript生成字母数字代码
- 在单击任何位置时隐藏元素,而不检查每次DOM单击
- 单击jquery清除输入值
- 单击按钮以等待单击按钮
- 在单击href链接的同时下载文件
- 单击顶部导航时如何进行向下滚动效果(向下滑动).
- 使图像在单击时展开到不大于浏览器
- 单击按钮后如何逐个调用分区,上一个分区将隐藏
- 如何在单击复选框后调用控制器方法
- 单击页面上的链接后高度发生变化
- 使用jquery在单击时在单元格中输入值
- 将纯文本URL转换为可单击链接
- ASP.NET通过单击JavaScript按钮触发c#事件
- 单击更改图标并通过javascript添加一个css类
- jQuery'单击'自动激发'live'
- 如何在Ajax中使用.live(),但不是用于单击事件
- 更改为live或on时,单击功能不起作用