Javascript 有没有一种方法可以在web浏览器中一次删除所有事件侦听器?

Javascript 有没有一种方法可以在web浏览器中一次删除所有事件侦听器?,javascript,Javascript,简单的好奇。没什么大不了的 构建一个新的应用程序。客户端的配置文件应该提供一个terminateOnError参数。如果设置为true,则在记录错误后,整个世界都将停止 退出我的showtterminationscreen函数而不执行任何后续代码应该很容易:只需抛出一个未处理的异常 但是,应用程序可能(将…)有正在进行的异步事件,其中一些我无法控制(我拥有一半的应用程序;另一半对我来说或多或少是封闭源代码):计时器、等待返回的http请求等 有没有一种简单的方法可以告诉浏览器停止收听到目前为止一

简单的好奇。没什么大不了的

构建一个新的应用程序。客户端的配置文件应该提供一个
terminateOnError
参数。如果设置为true,则在记录错误后,整个世界都将停止

退出我的
showtterminationscreen
函数而不执行任何后续代码应该很容易:只需抛出一个未处理的异常

但是,应用程序可能(将…)有正在进行的异步事件,其中一些我无法控制(我拥有一半的应用程序;另一半对我来说或多或少是封闭源代码):计时器、等待返回的http请求等


有没有一种简单的方法可以告诉浏览器停止收听到目前为止一直在跟踪的内容?

不是100%确定,但我认为

$(“*”).unbind()


应该有效。

您有两种解决此问题的基本方法:

  • 使用,以便整个页面上只有一个附加了事件处理程序的元素

  • 确保每个JavaScript功能都是模块化的,可以一时兴起分离事件处理程序,然后在以后重新连接它们

  • 活动委派

    只是为您提供了许多活动委派的选项。有些需要jQuery。有些没有

    我创建了一个事件委派库,它不需要jQuery,但需要面向对象的JavaScript。它利用HTML5属性定义哪些用户操作导致JavaScript中的方法调用

    编写模块JavaScript代码

    您可能需要重构JavaScript,以便对其进行初始化和取消初始化:

    JavaScript示例:

    function Foo(element) {
        this.element = typeof element === "string"
            ? document.getElementById(element)
            : element;
        this.handleDeleteItem = this.handleDeleteItem.bind(this);
        this.init();
    }
    
    Foo.prototype = {
    
        constructor: Foo,
    
        init: function() {
            var items = this.element.querySelectorAll("button.delete-item"),
                length = items.length, i = 0;
    
            for (i; i < length; i++) {
                items[i].addEventListener("click", this.handleDeleteItem, false);
            }
        },
    
        uninit: function() {
            var items = this.element.querySelectorAll("button.delete-item"),
                length = items.length, i = 0;
    
            for (i; i < length; i++) {
                items[i].removeEventListener("click", this.handleDeleteItem, false);
            }
        },
    
        handleDeleteItem: function(event) {
            event.preventDefault();
            // ... do other stuff
        }
    
    };
    
    发生错误时:

    foo.uninit();
    
    如果您可以继续使用该页面:

    foo.init();
    
    对于计时器和Ajax请求,您需要跟踪所有这些对象,清除计时器,并手动取消Ajax请求

    编辑#1


    由于应用程序的大部分本质上是一个黑匣子,这就成为了一个架构和通信问题。如果“黑暗的一半”是你的公司控制的东西,你需要向团队提出这个问题,并制定解决方案。如果他们使用JavaScript框架,询问他们使用哪个框架,并开始学习该框架。您可以深入研究框架的较低级别API并发现解决方案。在这种情况下,逆向工程的艺术是你的朋友。

    这就是jQuery,不是吗?在本例中不使用jQuery,但如果我使用jQuery,我会说这将解除UI事件的绑定。在那个阶段,无论如何都不会有一个可以解除绑定的UI,DOM将被终止屏幕压碎,所以这无论如何都不是问题。另一方面,您的建议并没有为正在进行的ajax请求、计时器等解除事件侦听器的绑定,或者是这样吗?不幸的是,我无法控制应用程序的一半。因此,是的,我可以跟踪自己的请求和计时器,但不能跟踪黑暗势力的所作所为。不过,你的回答中有一些非常有趣的材料,我对此表示感谢。:-)当大的部分是一个黑盒子时,这是很粗糙的。因此,您的问题的答案是“不,您不能告诉浏览器停止请求、计时器和DOM事件。”
    foo.uninit();
    
    foo.init();