[英]How to unbind all events inside element
我试图unbind
/ off
一个元素中每个元素的所有事件。 我试过这个解决方案,但它不起作用。 唯一有效的是$(document).add('*').off();
但这不是我需要的。
我做了一个简短的例子,但有更多的元素和事件。
为什么它不能使用这段代码?
$(document).ready(function() { $(document).on("click", "#contentWithEvents button", function() { console.log("Clicked"); }); $(document).on("mouseenter", "#contentWithEvents li div", function() { console.log("Hovered"); }); $(document).on("click", "#unbind", function() { contentToBeReplaced = $("#contentWithEvents"); contentToBeReplaced.find("*").each(function() { $(this).off(); }); }); });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <header></header> <main id="contentWithEvents"> <button>Click event</button> <button>Click event</button> <button>Click event</button> <ul> <li><div>Hover event</div></li> <li><div>Hover event</div></li> </ul> </main> <button id="unbind">Unbind all events</button> <footer></footer>
而不是使用$(document)
委派文档事件,为什么不直接使用包含父ID和元素类型的选择器委托元素。 这将有助于使用off()
取消绑定这些元素的事件(特定事件: .off('mouseenter')
或所有事件: .off()
)
$(document).ready(function() { $("#contentWithEvents button").on("click", function() { console.log("Clicked"); }); $("#contentWithEvents li div").on("mouseenter", function() { console.log("Hovered"); }); $("#unbind").on("click", function() { contentToBeReplaced = $("#contentWithEvents"); contentToBeReplaced.find("*").off(); }); });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <header></header> <main id="contentWithEvents"> <button>Click event</button> <button>Click event</button> <button>Click event</button> <ul> <li> <div>Hover event</div> </li> <li> <div>Hover event</div> </li> </ul> </main> <button id="unbind">Unbind all events</button> <footer></footer>
似乎最好的方法是委托类选择器,然后在不想再响应事件时删除该类
此外,我已经删除了主要和按钮上的委托,因为他们有一个ID。 如果它们是动态生成的,则需要从最近的静态容器委派它们
$(document).ready(function() { $("#contentWithEvents").on("click", ".delegated", function() { console.log("Clicked"); }); $("#contentWithEvents").on("mouseenter", ".delegated", function() { console.log("Hovered"); }); $("#unbind").on("click", function() { $("#contentWithEvents .delegated").removeClass("delegated"); }); });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <header></header> <main id="contentWithEvents"> <button class="delegated">Click event</button> <button class="delegated">Click event</button> <button class="delegated">Click event</button> <ul> <li> <div class="delegated">Hover event</div> </li> <li> <div class="delegated">Hover event</div> </li> </ul> </main> <button id="unbind">Unbind all events</button> <footer></footer>
实际上,你只是以错误的方式使用.off()命令
$(document).ready(function() { $(document).on("click", "#contentWithEvents button", function() { console.log("Clicked"); }); $(document).on("mouseenter", "#contentWithEvents li div", function() { console.log("Hovered"); }); $(document).on("click", "#unbind", function() { $(document).off( "click", "#contentWithEvents button" ); $(document).off( "mouseenter", "#contentWithEvents li div" ); }); });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <header></header> <main id="contentWithEvents"> <button>Click event</button> <button>Click event</button> <button>Click event</button> <ul> <li><div>Hover event</div></li> <li><div>Hover event</div></li> </ul> </main> <button id="unbind">Unbind all events</button> <footer></footer>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.