首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >window.onerror不能在火狐中触发

window.onerror不能在火狐中触发
EN

Stack Overflow用户
提问于 2009-06-17 18:08:45
回答 1查看 21.2K关注 0票数 17

我正在尝试创建一个javascript错误日志记录基础设施。

我正在尝试将window.onerror设置为我的错误处理程序。它在IE6中工作,但当我在火狐中运行它时,它遇到了一些冲突的onerror方法。

代码语言:javascript
复制
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绑定函数的函数,该函数在Firefox3和IE6中都工作得很好。

我知道火狐看到了这个错误,因为它同时出现在错误控制台和Firebug中,但我的window.onerror函数仍然没有被调用。

关于如何重写Firefox正在做的事情,有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-06-17 19:42:37

以下代码在IE 6和Firefox 3.0.11中进行了测试并正常工作:

代码语言:javascript
复制
<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,您可以这样做:

代码语言:javascript
复制
<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()可用于将多个处理程序绑定到任何事件:

代码语言:javascript
复制
addHandler(window, 'onload', function () { alert('one'); });
addHandler(window, 'onload', function () { alert('two'); });
addHandler(window, 'onload', function () { alert('three'); });

这段代码是新的,有点实验性。我不是100%确定addEventListener做了手动附件所做的事情,正如评论所说,attachEvent以与附加处理程序相反的顺序触发处理程序(所以在上面的例子中你会看到‘3,2,1’)。虽然不一定是“错误”或“不正确”,但它与addHandler中的其他代码所做的事情正好相反,因此,可能会导致浏览器之间的行为不一致,这就是我删除它的原因。

编辑:

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

代码语言:javascript
复制
<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并从本地idks加载到Internet Explorer中时,您应该会看到一个显示'blah' is undefined;undefined;undefined的对话框。

当将上面的代码放入test.htm并从本地磁盘加载到Firefox3.0.11(以及本次编辑的最新版本3.5 - Gecko/20090616)中时,您应该会看到一个对话框,上面写着[object Event];undefined;undefined。如果没有发生这种情况,则说明您的Firefox副本配置不正确或损坏。我只能建议你删除火狐,删除你的本地配置文件(关于如何找到你的配置文件的信息可以在here上找到),然后重新安装最新版本并再次测试。

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1008692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档