如何在更换事件注册区域时防止丢失事件
How to prevent lose event while replacing the area where the event registered
我有一个由插件创建的点击事件,然后我加载$。而Ajax只替换(更新)了包含click事件的区域,事件将丢失。
<span ref='B'><span ref='A'></span></span>
//click event is on A, but I replaced the html inside of B to <span ref='A'></span>;
its update, so the replaced html are the same.
我看了很多相关的问题,我找到了解决方法
.live() // will not work
.delegate(), // work
.on(), // work
解决方案是我应该绑定事件B而不是A像B.on('click', A, function(){})
....
然而,我的结构很难改变,我更希望找到一个解决方案,可以在替换或替代时防止丢失事件。
请指教,非常感谢。
使用detach()解决
由于事件绑定存在于DOM元素的上下文中,因此当您开始删除或替换DOM元素时,您需要一些机制来重新建立事件绑定。
一个好的方法是通过父元素使用委托(如您所述- B.on('click', A, function(){})....
)。
另一种选择是总是在有关DOM元素被删除或替换时重新建立绑定(因此在您的场景中,听起来这必须在Ajax回调/完成处理程序中),但是这通常是一种较差的方法,并且远不如委托方法优雅。
如果您关心将on
事件应用于页面上的某个元素。那么我建议只将事件绑定到document
。
$(document).on('click', '#id-of-a', function(){
});
阅读这篇博客文章了解更多有关这方面的信息。
我找到了一个解决方案。这可以使用.detach()!测试。
相关文章:
- 分派点击事件并保留击键修饰符
- 模糊事件的Javascript测试
- keyup事件处理程序更改焦点不适用于快速键入
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 如何使Javascript动态html表及其上的事件
- 使用类从一个标记中双击事件
- 如何在未直接触发的情况下停止事件
- 如何在elfinder插件(一个文件管理器插件)上获得上传前事件
- 对iPad上的点击事件反应缓慢
- 事件和状态
- Fancybox是否将Click事件静音
- 主干-不管怎样,检查事件以前是否绑定过
- 从控制器返回后Ajax启动事件激发
- 如何从画布上的某个移动事件中获取X和Y
- Jquery:未触发select事件
- JsFiddle上的鼠标事件不起作用
- 只覆盖箭头键滚动事件
- $window.ga在AngularJS事件中未定义
- cron作业与Javascript计时事件
- ng更改事件不适用于Dropdown