Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firefox在使用document.addEventListener加载的JavaScript DOMContentLoaded时不会报告异常_Javascript_Jquery_Firefox - Fatal编程技术网

Firefox在使用document.addEventListener加载的JavaScript DOMContentLoaded时不会报告异常

Firefox在使用document.addEventListener加载的JavaScript DOMContentLoaded时不会报告异常,javascript,jquery,firefox,Javascript,Jquery,Firefox,我正在编写一个没有依赖关系的内部框架(如jQuery等),并试图实现我自己的DOM风格功能。看起来,当就绪队列中的回调(DOM就绪时完成的回调数组)出现异常时,如果在该函数中抛出异常,执行将停止并继续到下一个回调(这是我想要的),但Firefox不会报告错误(记录到控制台,触发OneError,等等)。我做错什么了吗 我使用Dean Edwards()的模式和jQuery源代码的组合实现了这一点。我不希望像jQuery那样实现,因为如果一个回调失败,后续的回调将不会执行 var readyCal

我正在编写一个没有依赖关系的内部框架(如jQuery等),并试图实现我自己的DOM风格功能。看起来,当就绪队列中的回调(DOM就绪时完成的回调数组)出现异常时,如果在该函数中抛出异常,执行将停止并继续到下一个回调(这是我想要的),但Firefox不会报告错误(记录到控制台,触发OneError,等等)。我做错什么了吗

我使用Dean Edwards()的模式和jQuery源代码的组合实现了这一点。我不希望像jQuery那样实现,因为如果一个回调失败,后续的回调将不会执行

var readyCallbacks = [];

(function () {
    var currentHandler,
    fireReady,
    removeEvents,
    loopCallbacks = function () {
        for (var i = 0, len = readyCallbacks.length; i < len; i += 1) {
            currentHandler = readyCallbacks[i];
            fireReady();
        }
    };

    if (document.addEventListener) {
        document.addEventListener('readyEvents', function () { currentHandler(); }, false);

        fireReady = function () {
            var readyEvent = document.createEvent('UIEvents');
            readyEvent.initEvent('readyEvents', false, false);
            document.dispatchEvent(readyEvent);
        };

        removeEvents = function () {
            window.removeEventListener('load', loopCallbacks, false);
            loopCallbacks();
        };

        document.addEventListener('DOMContentLoaded', removeEvents, false);
        window.addEventListener('load', loopCallbacks, false);
    } else {
        // if < IE 9
        document.documentElement.readyEvents = 0;

        document.documentElement.attachEvent('onpropertychange', function (e) {
            if (e.propertyName === 'readyEvents')
                currentHandler();
        });

        fireReady = function () {
            document.documentElement.readyEvents += 1;
        };

        removeEvents = function () {
            window.detachEvent('onload', loopCallbacks);
            loopCallbacks();
        };

        document.attachEvent('onreadystatechange', removeEvents);
        window.attachEvent('onload', loopCallbacks);
    }
})();

Client.ready = function (callback) {
    readyCallbacks.push(callback);
};

很难把它弄对。请参阅并搜索ready,以了解它是如何以可移植的方式实现的。请记住,您必须确保在dom已经就绪之后绑定就绪处理程序时,必须立即调用它们,否则根本不会调用它们。另请参见。

经过一些搜索后,这似乎是一个问题:通过
dispatchEvent()
调度的自定义事件的处理程序引发的错误在某些版本的Firefox 3.x中没有正确记录。这不是代码中的问题,而是浏览器实现中的问题。如果这对您来说是一个真正的问题,您可以将处理程序包装在
try
/
catch
块中,以识别和处理错误:

document.addEventListener('readyEvents', function() {
    try { currentHandler() } catch (e) { console.log(e) }
}, false);

我有一个例子,用一组简化的测试来演示这个问题。Firefox正确地将错误记录在内置事件(如
DOMContentLoaded
load
)的处理程序上,但在为自定义事件启动处理程序时忽略了错误。

我以前见过这个问题,虽然它确实讨论了一些创建文档就绪侦听器的方法,它不能解决Firefox不报告从addEventListener加载的DOMContentLoaded内部生成的错误的问题。请参阅jQuery源代码。它的评论很好,并且可以在Firefox中使用。
document.addEventListener('readyEvents', function() {
    try { currentHandler() } catch (e) { console.log(e) }
}, false);