Мимика Окно. Ошибка в Opera с использованием JavaScript
-
22-07-2019 - |
Вопрос
В настоящее время я работаю над веб-приложением, у меня есть механизм ведения журналов 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);}';
}
}
}
Решение
Это также происходит в Safari, AFAIK.
Что вы, безусловно, могли бы сделать, это создать глобальный блок try / catch для всего кода JS вместо разбора текста - что может быть сложно, если вы столкнетесь с такими вещами, как:
(function ($){
$(function (){
});
})(jQuery);
Другие советы
Opera 11.60+ поддерживает window.onerror
.
Dragonfly Opera поддерживает удаленная отладка . Возможно, вы сможете взломать его (все написано на JavaScript) и регистрируйте ошибки самостоятельно (к сожалению, протокол еще не опубликован ). р>
вы можете заменить 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 ... только для ранних версий ...
здесь есть упоминание, что Opera теперь поддерживает window.onerror: