2009-06-17 3 views
17

Я пытаюсь создать инфраструктуру регистрации ошибок javascript.window.onerror не работает в Firefox

Я пытаюсь установить 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» является неопределенной переменной, мой обработчик ошибок является то, что уволили (он работает). Тем не менее, мой журнал ошибок должен улавливать все ошибки, вызванные клиентами, обращающимися к веб-сайту, а не только некорректный код в одном месте.

Код находится на странице .js, которая вызывается с базовой страницы (C#) веб-сайта. На сайте также используется jQuery, поэтому у меня есть функция, которая переопределяет функцию связывания jQuery, и эта функция отлично работает как в Firefox 3, так и в IE 6.

Я знаю, что Firefox видит ошибку, потому что она отображается как в Error Console и Firebug, но mywindow.onerror функция все еще не вызывается.

Любые мысли о том, как переопределить действия Firefox?

+2

Кто-то еще в моей группе взял на себя этот проект и полностью изменил все, что я делал, поэтому я никогда не узнаю, что случилось. –

ответ

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 и, как результат, может привести к непоследовательному поведению браузера в браузер, поэтому я его удалил.

EDIT:

Это полный тест, чтобы продемонстрировать 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 и загружаются в Internet Explorer от местного idks, вы должен увидеть диалоговое окно, которое сообщает 'blah' is undefined;undefined;undefined.

Когда вышеуказанный код помещается в test.htm и загружается в Firefox 3.0.11 (и последние 3.5 с этого изменения - Gecko/20090616) с локального диска, вы должны увидеть диалоговое окно, в котором указано [object Event];undefined;undefined. Если этого не происходит, то ваша копия Firefox не настроена корректно или иначе нарушена. Все, что я могу предложить, это удалить Firefox, удалить локальные профили (информация о том, как найти ваш профиль, доступна here) и переустановить последнюю версию и снова проверить.

+0

Оператор if - это то, что уволено событиями, которые я хочу обработать своим регистратором ошибок в Firefox. Какова релевантность addEventListener, созданная в этом выражении if? –

+0

Единственное, что происходит с этим, это то, что в любой момент, когда я открываю Firefox, все, что я вставляю в оператор «if», срабатывает. Однако это не реакция на мою ошибку. –

+0

addHandler() - это общий способ добавления нескольких функций обработчика в событие. Тест if (obj.addEventListener) проверяет, поддерживает ли браузер метод addEventListener() для объекта, если он это делает, он добавляет обработчик, используя встроенный метод, поддерживаемый браузером. Если браузер не поддерживает метод addEventListener(), он привязывает ваш новый обработчик за последним добавленным обработчиком. –

7

Не забудьте вернуть true из любого пользовательского обработчика window.onerror, или firefox будет обрабатывать его в любом случае.

2

Похоже, что в jQuery 1.3.x есть открытая ошибка (# 3982) - jQuery.error event gets incorrect arguments. Последнее обновление было 2 месяца назад с комментарием:

Учитывая то, как сумасшедшее событие ошибки, и как часто он используется, я согласен , что проще всего удалить поддержку для него. Я добавил примечание к документам , так как он все равно не работает.

Я думаю, я бы просто установил window.onerror сам, аналогично тому, что опубликовал Грант. Кроме того, FireFox: addEventListener Vs. window.onerror упоминает, что «element.addEventListener», вызывая ошибку, не активирует «window.onerror».

Смежные вопросы