window.onerror没有在Firefox中触发

时间:2009-06-17 18:08:45

标签: javascript jquery firefox onerror

我正在尝试创建一个javascript错误记录基础结构。

我正在尝试将window.onerror设置为我的错误处理程序。它适用于IE 6,但是当我在Firefox中运行它时,它会遇到一些冲突的onerror方法。

var debug = true;

MySite.Namespace.ErrorLogger.prototype = {

   //My error handling function.  
   //If it's not in debug mode, I should get an alert telling me the error.
   //If it is, give a different alert, and let the browser handle the error.
   onError: function(msg, url, lineNo) {
        alert('onError: ' + msg);
        if (!debug) {
            alert('not debug mode');
            return true;
        }
        else {
            alert(msg);
            return false;
        }
    }
}

//Document ready handler (jQuery shorthand)
$(function() {
    log = $create(MySite.Namespace.ErrorLogger);

    window.onerror = log.onError;

    $(window).error(function(msg, url, line) {
        log.onError(msg, url, line);
    });
});

如果我使用setTimeout("eval('a')", 1);,其中'a'是一个未定义的变量,我的错误处理程序就是被解雇的(它可以工作)。但是,我的错误记录器需要捕获访问网站的客户端抛出的所有错误,而不仅仅是错误的代码在一个地方。

代码位于从网站的基页(C#)调用的.js页面上。该站点也使用jQuery,所以我有一个覆盖jQuery绑定函数的函数,该函数在Firefox 3和IE 6中都能正常工作。

我知道Firefox看到了错误,因为它出现在错误控制台和Firebug中,但我的 window.onerror函数仍未被调用。

有关如何覆盖Firefox正在做什么的任何想法?

3 个答案:

答案 0 :(得分:23)

以下内容经过测试,可在IE 6和Firefox 3.0.11中使用:

<html>
<head>
<title>Title</title>
</head>
<body>
    <script type="text/javascript">
    window.onerror = function (msg, url, num) {
        alert(msg + ';' + url + ';' + num);
        return true;
    }
    </script>
    <div>
    ...content...
    </div>
    <script type="text/javascript">
    blah;
    </script>
</body>
</html>

如果您要加载的其他JavaScript库也将自身附加到window.onerror,则可以执行此操作:

<script type="text/javascript">
function addHandler(obj, evnt, handler) {
    if (obj.addEventListener) {
        obj.addEventListener(evnt.replace(/^on/, ''), handler, false);
    // Note: attachEvent fires handlers in the reverse order they
    // were attached. This is the opposite of what addEventListener
    // and manual attachment do.
    //} else if (obj.attachEvent) {
    //    obj.attachEvent(evnt, handler);
    } else {
        if (obj[evnt]) {
            var origHandler = obj[evnt];
            obj[evnt] = function(evt) {
                origHandler(evt);
                handler(evt);
            }
        } else {
            obj[evnt] = function(evt) {
                handler(evt);
            }
        }
    }
}
addHandler(window, 'onerror', function (msg, url, num) {
    alert(msg + ';' + url + ';' + num);
    return true;
});
addHandler(window, 'onerror', function (msg, url, num) {
    alert('and again ' + msg + ';' + url + ';' + num);
    return true;
});
</script>

以上功能可让您根据需要添加尽可能多的onerror个处理程序。如果已经有一个现有的自定义onerror处理程序,它将调用那个,然后是你的。

请注意,addHandler()可用于将多个处理程序绑定到任何事件:

addHandler(window, 'onload', function () { alert('one'); });
addHandler(window, 'onload', function () { alert('two'); });
addHandler(window, 'onload', function () { alert('three'); });

这段代码是新的,有点实验性。我并非100%确定addEventListener正是手动附件所做的,并且如评论所述,attachEvent以相反的顺序触发处理程序(所以你会看到'三,二,一个'在上面的例子中)。虽然不一定是“错误”或“不正确”,但它与addHandler中其他代码的作用相反,因此可能导致从浏览器到浏览器的不一致行为,这就是我删除它的原因。 / p>

编辑:

这是一个完整的测试用例,用于演示onerror事件:

<html>
<head>
<title>Title</title>
</head>
<body>
<script type="text/javascript">
function addHandler(obj, evnt, handler) {
    if (obj.addEventListener) {
        obj.addEventListener(evnt.replace(/^on/, ''), handler, false);
    } else {
        if (obj[evnt]) {
            var origHandler = obj[evnt];
            obj[evnt] = function(evt) {
                origHandler(evt);
                handler(evt);
            }
        } else {
            obj[evnt] = function(evt) {
                handler(evt);
            }
        }
    }
}
addHandler(window, 'onerror', function (msg, url, num) {
    alert(msg + ';' + url + ';' + num);
    return true;
});
</script>
<div>
...content...
</div>
<script type="text/javascript">
blah;
</script>
</body>
</html>

当上述代码放在test.htm中并从本地idk加载到Internet Explorer中时,您应该会看到一个显示'blah' is undefined;undefined;undefined的对话框。

当上面的代码放在test.htm中并从本地磁盘加载到Firefox 3.0.11(以及此编辑中的最新版本3.5 - Gecko / 20090616)时,您应该会看到一个对话框,显示{{1 }}。如果没有发生这种情况,那么您的Firefox副本未正确配置或以其他方式损坏。我可以建议您删除Firefox,删除您的本地个人资料(有关如何找到您的个人资料的信息here)并重新安装最新版本并再次测试。

答案 1 :(得分:7)

请记住从任何自定义window.onerror处理程序返回 true ,否则firefox会处理它。

答案 2 :(得分:2)

jQuery 1.3.x中似乎存在一个开放的错误(#3982) - jQuery.error event gets incorrect arguments。最后一次更新是2个月前的评论:

  

鉴于错误事件有多疯狂,   我同意,它的使用频率如何   删除支持最容易   为了它。我在文档中添加了一条注释   因为它无论如何都没有用。

我想我会自己设置window.onerror,类似于Grant发布的内容。另外,FireFox: addEventListener Vs. window.onerror提到“element.addEventListener”,导致错误不会激活“window.onerror”