J S*_*J S 128 javascript events
我想删除使用添加的特定类型的所有事件侦听器addEventListener().我看到的所有资源都说你需要这样做:
elem.addEventListener('mousedown',specific_function);
elem.removeEventListener('mousedown',specific_function);
Run Code Online (Sandbox Code Playgroud)
但我希望能够在不知道它目前是什么的情况下清除它,如下所示:
elem.addEventListener('mousedown',specific_function);
elem.removeEventListener('mousedown');
Run Code Online (Sandbox Code Playgroud)
pla*_*alx 202
如果不截断addEventListener调用并跟踪侦听器或使用不幸允许此类功能的库,这是不可能的.如果可以访问侦听器集合但未实现该功能,那将是如此.
您可以做的最接近的事情是通过克隆元素来删除所有侦听器,这不会克隆侦听器集合.
注意:这也将删除元素子元素上的侦听器.
var el = document.getElementById('el-id'),
elClone = el.cloneNode(true);
el.parentNode.replaceChild(elClone, el);
Run Code Online (Sandbox Code Playgroud)
Chr*_*ton 31
如果删除侦听器的唯一目标是阻止它们运行,则可以向窗口添加事件侦听器以捕获和取消给定类型的所有事件:
window.addEventListener(type, function (event) {
event.stopPropagation();
}, true);
Run Code Online (Sandbox Code Playgroud)
传入true第三个参数会导致事件在下降过程中被捕获.停止传播意味着事件永远不会到达正在侦听它的侦听器.
Mar*_*tke 17
您必须覆盖 EventTarget.prototype.addEventListener 以构建用于记录所有“添加侦听器”调用的陷阱函数。像这样的东西:
var _listeners = [];
EventTarget.prototype.addEventListenerBase = EventTarget.prototype.addEventListener;
EventTarget.prototype.addEventListener = function(type, listener)
{
_listeners.push({target: this, type: type, listener: listener});
this.addEventListenerBase(type, listener);
};
Run Code Online (Sandbox Code Playgroud)
然后你可以构建一个 EventTarget.prototype.removeEventListener s:
EventTarget.prototype.removeEventListeners = function(targetType)
{
for(var index = 0; index != _listeners.length; index++)
{
var item = _listeners[index];
var target = item.target;
var type = item.type;
var listener = item.listener;
if(target == this && type == targetType)
{
this.removeEventListener(type, listener);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在 ES6 中,你可以使用 Symbol,直接在实例化的对象 self 中隐藏原始函数和所有添加的监听器的列表。
(function()
{
let target = EventTarget.prototype;
let functionName = 'addEventListener';
let func = target[functionName];
let symbolHidden = Symbol('hidden');
function hidden(instance)
{
if(instance[symbolHidden] === undefined)
{
let area = {};
instance[symbolHidden] = area;
return area;
}
return instance[symbolHidden];
}
function listenersFrom(instance)
{
let area = hidden(instance);
if(!area.listeners) { area.listeners = []; }
return area.listeners;
}
target[functionName] = function(type, listener)
{
let listeners = listenersFrom(this);
listeners.push({ type, listener });
func.apply(this, [type, listener]);
};
target['removeEventListeners'] = function(targetType)
{
let self = this;
let listeners = listenersFrom(this);
let removed = [];
listeners.forEach(item =>
{
let type = item.type;
let listener = item.listener;
if(type == targetType)
{
self.removeEventListener(type, listener);
}
});
};
})();
Run Code Online (Sandbox Code Playgroud)
你可以用这个小狙击手测试这段代码:
document.addEventListener("DOMContentLoaded", event => { console.log('event 1'); });
document.addEventListener("DOMContentLoaded", event => { console.log('event 2'); });
document.addEventListener("click", event => { console.log('click event'); });
document.dispatchEvent(new Event('DOMContentLoaded'));
document.removeEventListeners('DOMContentLoaded');
document.dispatchEvent(new Event('DOMContentLoaded'));
// click event still works, just do a click in the browser
Run Code Online (Sandbox Code Playgroud)
Tho*_*ham 13
在不引用原始函数的情况下删除事件侦听器的一种现代方法是使用AbortController。需要注意的是,您只能中止您自己添加的侦听器。
const buttonOne = document.querySelector('#button-one');
const buttonTwo = document.querySelector('#button-two');
const abortController = new AbortController();
// Add multiple click event listeners to button one
buttonOne.addEventListener(
'click',
() => alert('First'),
{ signal: abortController.signal }
);
buttonOne.addEventListener(
'click',
() => alert('Second'),
{ signal: abortController.signal }
);
// Add listener to remove first button's listeners
buttonTwo.addEventListener(
'click',
() => abortController.abort()
);Run Code Online (Sandbox Code Playgroud)
<p>The first button will fire two alert dialogs when clicked. Click the second button to remove those listeners from the first button.</p>
<button type="button" id="button-one">Click for alerts</button>
<button type="button" id="button-two">Remove listeners</button>Run Code Online (Sandbox Code Playgroud)
Chr*_*yes 10
element.onmousedown = null;
Run Code Online (Sandbox Code Playgroud)
现在您可以通过以下方式返回添加事件侦听器
element.addEventListener('mousedown', handler, ...);
Run Code Online (Sandbox Code Playgroud)
此解决方案仅适用于“全局”事件。自定义事件将不起作用。以下是所有全球事件的列表:https : //developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers
通过一行js删除element中的所有监听器:
element.parentNode.innerHTML += '';
Run Code Online (Sandbox Code Playgroud)
小智 5
我知道这是旧的,但我有一个类似的问题没有真正的答案,我想从文档中删除所有"keydown"事件监听器.我没有删除它们,而是覆盖addEventListener以在它们被添加之前忽略它们,类似于上面的Toms回答,通过在加载任何其他脚本之前添加它:
<script type="text/javascript">
var current = document.addEventListener;
document.addEventListener = function (type, listener) {
if(type =="keydown")
{
//do nothing
}
else
{
var args = [];
args[0] = type;
args[1] = listener;
current.apply(this, args);
}
};
</script>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
126973 次 |
| 最近记录: |