模仿窗口。使用javascript在Opera中的错误

时间:2009-03-14 12:24:25

标签: javascript opera

我目前正在开发一个Web应用程序,我有一个JS日志记录机制来处理未被页面内的js代码捕获的Javascript错误。我正在使用window.onerror来捕获所有这些错误,并将它们记录在其他位置。

然而,问题是Opera没有window.onerror事件。我能想到的一种方法是,对所有js函数进行字符串处理,然后在body加载后在这些函数中插入try catch块。但它在许多情况下不起作用,但是,它至少在某种程度上有效。

我确信这种方法很糟糕,但是,我想不出更好的方法。 请指教。

更新:目前,我正在调用下面的代码以尽可能多地收集错误。

function OnBodyLoad()
{
        var allElements = document.getElementsByTagName("*");
        for(var cnt = 0;cnt < allElements.length;cnt++)
        {
            RegisterAllEvents(allElements[cnt]);
        }
}
function RegisterAllEvents(objToProcess){
    for(var cnt = 0;cnt < objToProcess.attributes.length;cnt++){
        if(IsAttributeAnEvent(objToProcess.attributes[cnt].name))
        {
            objToProcess.attributes[cnt].value =  'try{'+objToProcess.attributes[cnt].value+'}catch(err){LogError("'+ objToProcess.id+'"'+ ',err);}';
        }
    }
}

4 个答案:

答案 0 :(得分:9)

Opera 11.60+支持window.onerror

Opera的Dragonfly支持remote debugging。您可以hack it(全部用JavaScript编写)并自己记录错误(遗憾的是协议isn't published yet)。

答案 1 :(得分:5)

你可以在Opera中替换Error.prototype.toString!

window.onerror = function (msg) {
  // send msg to http://errors.net/log.php, for example
  (new Image()).src = 'http://errors.net/log.php?msg=' + encodeURIComponent(msg);
};
if (({}).toString.call(window.opera) === '[object Opera]') {
 (function () {
   var x = Error.prototype.toString;
   Error.prototype.toString = function () {
     var msg = '';
     try {
       msg = x.apply(this, arguments);
       if (typeof (window.onerror) === "function") {
         window.onerror(msg, typeof (this) === 'object' ? this.stack : '', '');
       }
     } catch (e) {}
     return msg;
   };
 }());
}

似乎,它对Opera 11.50不起作用......仅适用于早期版本......

答案 2 :(得分:2)

这也发生在Safari,AFAIK上。

你当然可以做的是为所有JS代码而不是文本解析创建一个全局的try / catch块 - 如果你遇到这样的事情,这可能会很棘手:

(function ($){
  $(function (){
  });
})(jQuery);

答案 3 :(得分:0)

这里提到Opera现在支持window.onerror:

http://my.opera.com/ODIN/blog/2011/11/07/what-s-new-in-opera-development-snapshots-4-november-2011-edition

但是window.onerror似乎在Opera Mini中不起作用(例如用户代理“Opera / 9.80(J2ME / MIDP; Opera Mini / 7.1.32422 / 30.3214; U; en)Presto / 2.8.119 Version / 11.10” )。这使得使用Opera Mini在手机上调试javascript变得非常困难。