- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在这里搜索了几个问题,但找不到答案。接受的答案 removeEventListener without knowing the function仅在 chrome 中有效,在非严格模式下也有效。
我有三个函数。一个使用选择器将事件监听器附加到元素,另一个从元素中删除事件监听器,第三个从页面中删除所有事件监听器。
函数是这样的:
function listen(node, event, callback, options)
{
node.addEventListener(event, callback, options);
}
removeAllListeners(node)
{
}
removeListener(node, event)
{
}
用户可以将任何类型的回调函数传递给附加监听器的函数。我该如何移除事件监听器。
我也不想使用任何第三方库。
尝试过:
var eventlistener = getEventListeners(window)["DOMContentLoaded"][index];
window.removeEventListener("DOMContentLoaded", eventlistener.listener, eventlistener.useCapture);
但只适用于 chrome,而且也只适用于非严格模式。
最佳答案
由于您要处理自己的事件监听器,因此有很多方法可以解决这个问题。想到两个:
在元素上使用 expando 属性来跟踪您的监听器函数,因此您确实知道 removeEventListener
的第二个参数。使用 expando 属性时要小心以避免命名冲突(例如,选择一个非常适合您的代码的长名称)。
在 listen
中为元素分配一个 ID,并将它们的处理程序(以及它们处理的事件)存储在一个单独的对象中,以该 ID 为键。请注意,这意味着只要元素或您的单独对象中的条目引用它们,您就会将这些函数保留在内存中,这可能并不理想。
这是#1 的示例:
var handlersKey = "___handlers___" + Math.floor(Math.random() * 100000);
function listen(node, event, callback, options)
{
node.addEventListener(event, callback, options);
if (!node[handlersKey]) {
node[handlersKey] = Object.create(null);
}
if (!node[handlersKey][event]) {
node[handlersKey][event] = [];
}
node[handlersKey][event].push(callback);
}
function removeAllListeners(node)
{
if (!node[handlersKey]) {
return;
}
Object.keys(node[handlersKey]).forEach(function(event) {
removeListener(node, event);
});
delete node[handlersKey];
}
function removeListener(node, event)
{
var handlers = node[handlersKey];
var callbacks = handlers && handlers[event];
if (callbacks) {
callbacks.forEach(function(callback) {
node.removeEventListener(event, callback);
});
delete handlers[event]
}
}
listen(document.getElementById("target"), "mouseenter", function() {
console.log("Got mouseenter");
});
listen(document.getElementById("target"), "mouseleave", function() {
console.log("Got mouseleave");
});
listen(document.getElementById("target"), "click", function() {
console.log("Removing all listeners");
removeAllListeners(this);
});
<div id="target">Click me, I'll respond only once</div>
关于javascript - 在 Javascript 中删除事件监听器表单元素无需克隆元素并且不知道 removeEventListener() 的第二个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44131272/
我有以下代码,我在其中向文档添加了一个事件监听器,然后将其删除。 document.addEventListener("keypress", gameStart); function gameStar
我想知道是否可以在不引用应删除的事件处理函数的情况下删除事件监听器。 jquery的$().unbind('touchmove')将无法工作,因为事件监听器是使用 Javascript 的 addEv
下面的代码应该在轮到玩家手中的每张扑克牌时添加一个事件监听器,然后在轮到其他玩家时删除事件。 它不起作用。一旦事件在第一回合初始设置,该玩家的牌就保持可点击状态。 takeTurn ( playerI
这个问题已经有答案了: How to removeEventListener that is addEventListener with anonymous function? (5 个回答) 已关闭
由于某种原因,我需要在滚动页面结束时延迟点击并阻止Default一段时间。所以我写了这样的内容: // const disableClickDuringScrollHandler=(e)=> { //
我不明白为什么单击 div2 元素后 div1 元素仍然分配了事件监听器。似乎 specialFunction() 的 div 参数在初始执行后和单击 div2 后是 div1 元素,其中应该从 di
这个问题已经有答案了: Removing event listener which was added with bind (10 个回答) 已关闭 5 个月前。 我一直在研究 es6 类,并尝试设置
我知道有类似问题的问题,但我不知道如何解决该问题。 我需要解决这个问题:我在 html 文档中添加了一个 onClick 监听器,然后,在 js 中我尝试删除它,但我不能。 这是我的代码:
我正在尝试制作一款纸牌游戏。在我的游戏中,用户有义务选择一张卡(我向每张卡添加 EventListeners ,在我的 HTML 中为 ),选择后他不应该允许点击任何其他卡(我必须删除所有 Even
我添加了一个事件监听器以在用户操作后捕获 SVG 的加载。 HTML JS mySVG = document.getElementById('mySVG'); mySVG.addEventListe
这个问题在这里已经有了答案: The value of "this" within the handler using addEventListener (10 个答案) 关闭 3 年前。 我一定是
我的元素上有一个事件监听器,由于某种原因我不知道为什么没有删除。 我是这样设置的: for (i = 0; i < data[0].length; i++) { (function(i){
我想弄清楚为什么我的 removeEventListener 不起作用,我尝试了多种方法来修复它但仍然不起作用任何见解都会有所帮助。 addEventListener 按预期工作,但当我尝试删除监听器
我的 Vue 应用程序中有一个相当简单的组件。当用户打开菜单时,我将事件监听器添加到 #app 元素以检测“外部”点击。 当用户在外部单击时,它会关闭菜单并移除事件监听器。这按预期工作。问题是,当用户
我按照教程创建了 slider 效果。问题是效果在较小的屏幕上看起来不太好。我可以很容易地使用媒体查询处理样式,问题是 javascript 不是这种情况。这是我的代码: HTML:
考虑以下示例。我们有一个简单的 html 文件 Create button 和两个版本的js文件。版本一个: function create_button() { var new_
有没有办法根据变量而不是事件来删除偶数监听器?我想删除我设置的两个事件监听器,但不想删除第三方网站可能已启用的其他事件监听器。 var scrollVar = window.addEventListe
我有一些简单的代码,但目前它不会在第一次调用后删除监听器。我怎样才能做到这一点?还是我真的需要在收到通知后对 var 集添加冗余 if/else 检查? document.addEventLi
我有一个生成 HTML 元素的对象,这些元素也与该对象的数组相关联,假设我们有一个它的实例。因此,当它创建元素时,它还会将以下事件监听器分配给元素的嵌套部分(类是 uploadDelete)。 现在这
我已经尝试使用 console.log 对我的代码进行故障排除并查看它是否会运行,但它似乎只是绕过了 removeEventListeners。我让同行检查了我的代码,但不明白问题出在哪里。Javas
我是一名优秀的程序员,十分优秀!