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