Мимическое окно. onerror в Opera с помощью javascript
В настоящее время я работаю над веб-приложением, у меня есть механизм журналирования JS, который обрабатывает ошибку Javascript, которая не попадает в код js внутри страницы. Я использую window.onerror, чтобы поймать все такие ошибки и зарегистрировать их еще где.
Однако проблема заключается в том, что Opera не имеет события window.onerror. один из подходов, о котором я мог думать, состоит в том, чтобы преобразовать весь код js-функций и вставить блоки 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);}';
}
}
}
Ответы
Ответ 1
Это также происходит в Safari, AFAIK.
То, что вы, безусловно, можете сделать, это создать глобальный блок try/catch для всего JS-кода вместо синтаксического разбора текста - что может быть сложно, если вы входите в такие вещи, как:
(function ($){
$(function (){
});
})(jQuery);
Ответ 2
Opera 11.60+ поддерживает window.onerror
.
Opera Dragonfly поддерживает удаленная отладка, Возможно, вы сможете взломать его (все это написано на JavaScript) и сами регистрировать ошибки (к сожалению, протокол еще не опубликовано).
Ответ 3
вы можете заменить Error.prototype.toString в Opera!
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... только для ранних версий...
Ответ 4
здесь упоминается, что 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; ru) Presto/2.8.119 Version/11.10" ). Это очень затрудняет отладку javascript на мобильных телефонах с Opera Mini.