当前位置: 首页 > 面试题库 >

Javascript / DOM:如何删除DOM对象的所有事件?

况博容
2023-03-14
问题内容

只是一个问题:有什么方法可以完全删除对象(例如div)的所有事件?

编辑:我正在添加div.addEventListener('click',eventReturner(),false);一个事件。

function eventReturner() {
    return function() {
        dosomething();
    };
}

EDIT2:我找到了一种可行的方法,但无法用于我的情况:

var returnedFunction;
function addit() {
    var div = document.getElementById('div');
    returnedFunction = eventReturner();
    div.addEventListener('click',returnedFunction,false); //You HAVE to take here a var and not the direct call to eventReturner(), because the function address must be the same, and it would change, if the function was called again.
}
function removeit() {
    var div = document.getElementById('div');
    div.removeEventListener('click',returnedFunction,false);
}

问题答案:

我不确定 _删除 所有 事件_是什么意思。删除特定事件类型的所有处理程序还是删除一种类型的所有事件处理程序?

删除所有事件处理程序

如果要删除所有(任何类型的)事件处理程序,则可以克隆 该元素并将其替换为其克隆:

var clone = element.cloneNode(true);

注意: 这将保留属性和子项,但不会保留对DOM属性的任何更改。

删除特定类型的“匿名”事件处理程序

另一种方法是使用,removeEventListener()但我想您已经尝试过了,但是没有用。

addEventListener每次调用匿名函数都会创建一个新的侦听器。调用removeEventListener匿名函数 无效
。匿名函数每次被调用时都会创建一个唯一的对象,尽管它可以调用一个对象,但它并不是对现有对象的引用。以这种方式添加事件侦听器时,请确保仅添加一次,它是永久的(无法删除),直到添加到它的对象被销毁为止。

您实质上是将匿名函数传递给addEventListeneras eventReturner返回一个函数。

您可以通过两种方法解决此问题:

  1. 不要使用返回函数的函数。直接使用功能
function handler() {
dosomething();
}

div.addEventListener('click',handler,false);
  1. 为此创建一个包装,addEventListener该包装存储对返回的函数的引用,并创建一些奇怪的removeAllEvents函数:
var _eventHandlers = {}; // somewhere global

function addListener(node, event, handler, capture) {
if(!(node in _eventHandlers)) {
    // _eventHandlers stores references to nodes
    _eventHandlers[node] = {};
}
if(!(event in _eventHandlers[node])) {
    // each entry contains another entry for each event type
    _eventHandlers[node][event] = [];
}
// capture reference
_eventHandlers[node][event].push([handler, capture]);
node.addEventListener(event, handler, capture);
}

function removeAllListeners(node, event) {
if(node in _eventHandlers) {
    var handlers = _eventHandlers[node];
    if(event in handlers) {
        var eventHandlers = handlers[event];
        for(var i = eventHandlers.length; i--;) {
            var handler = eventHandlers[i];
            node.removeEventListener(event, handler[0], handler[1]);
        }
    }
}
}

然后,您可以将其用于:

    addListener(div, 'click', eventReturner(), false)
// and later
removeAllListeners(div, 'click')

注意: 如果您的代码运行了很长时间,并且正在创建和删除许多元素,那么在_eventHandlers销毁它们时必须确保删除其中包含的元素。



 类似资料:
  • Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。(W3C) 事件对象会在事件被触发时获得,对象包含了当前事件的一些信息,如点击事件可以获取到点击的位置,键盘输入事件可以获取到按下的键。 1. 获取事件对象 在给 DOM 节点绑定事件时,需要传递一个事件处理器,其本质上是个函数,在事件触发时被调用。 在事件处理器被调用时,默认就会传递一个参数,这

  • 本文向大家介绍JavaScript变量Dom对象的所有属性,包括了JavaScript变量Dom对象的所有属性的使用技巧和注意事项,需要的朋友参考一下 DOM对象的HTML:   <button>Disable State</buttom> 1,遍历DOM对象所具有的属性(全部,不管是否在HTML tag中是否设置) 结果: 2.遍历DOM对象在HTML中设置过的属性:   每一个attribut

  • 本文向大家介绍如何在JavaScript中删除DOM节点的所有子元素?,包括了如何在JavaScript中删除DOM节点的所有子元素?的使用技巧和注意事项,需要的朋友参考一下 删除<div>的子元素 我们可以用, 它将删除的所有子项 其ID为“ mList”。 示例 在您的代码中,它可以写为-

  • 浏览器中的事件都是以对象的形式存在的,同样ie浏览器与标准dom浏览器之间存在获取事件对象上也存在差别。在ie浏览器中事件对象是windows对象的一个属性event,访问通常采用如下方法。 oP.onclick = function(){ var oEvent = window.event; } 尽管它是window对象属性,但event对象还是只能在事件发生时被访问,所有的事件处理函数执行完之

  • 删除一个DOM节点就比插入要容易得多。 要删除一个节点,首先要获得该节点本身以及它的父节点,然后,调用父节点的removeChild把自己删掉: // 拿到待删除节点: var self = document.getElementById('to-be-removed'); // 拿到父节点: var parent = self.parentElement; // 删除: var removed

  • DOM(文档对象模型) DOM可以将任何HTML或XML文档映射成一个多层节点的树形结构。节点有不同的类型,每种类型分别表示不同的信息或标记。每个节点都有各自的特点、数据和方法,也与其它的节点存在某种关系。节点之间构成了层次,页面中的所有节点构成了以某个特定节点为根节点的树形结构。 简单点说,就是DOM将HTML文档映射为带有属性、元素和文本的树形结构。 以下面的HTML为例: <!doctype