#javascript #error-handling #internet-explorer-8
#javascript #обработка ошибок #internet-explorer-8
Вопрос:
Долгое время я доверял множеству примеров кода, показывающих предположительно разрешенное «безопасное» обнаружение недоступных объектов или свойств объекта. Два быстрых примера включают получение доступного значения / height для такого экрана…
var w = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
var h = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
Или, может быть, чтобы убедиться, что служба или процедура доступны, чтобы я мог предпринять альтернативные действия, включая примеры…
if (!window.event) // do something else
if (!window.XMLHttpRequest) // do something else
Я не составлял ни одного из вышеперечисленных тестов, но брал их из ответов здесь, в stackoverflow, часто из ответов с высоким рейтингом. Тем не менее, когда я запускаю код с конструкциями для этого в IE8, скрипт останавливается, и отладчик выдает ошибки типа…
'window.event' is null or not an object
'window.XMLHttpRequest' is null or not an object
'window.innerWidth' is null or not an object
И, конечно, они не являются «предупреждениями» .. это ошибки, которые останавливают все. Итак, я думаю, что нет ПРОСТОГО способа проверить такие объекты или свойства объекта в IE8? Я полагаю, я мог бы поместить блоки try / catch в каждую строку кода, которые могут вызвать жалобу «null или не объект», но это определенно сделает мою библиотеку намного больше и, вероятно, медленнее! И такие конструкции условной компиляции, как эта, похоже, работают не очень хорошо…
<!--[if gte IE 9 | !IE ]>-->
// do something only if !IE or IE > 8
<!--<![endif]>-->
// resume normal inclusion? usually not reliably!
Итак, в приведенных мною примерах, которые вызвали ошибки, что я могу сделать, чтобы сделать код более безопасным для браузеров, которые не поддерживают объекты, просто используя обычный ванильный javascript?
Ответ №1:
Ну, поскольку поддержка оператора «in» простирается вплоть до IE 5.5 (по крайней мере, согласно этой справочной статье MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in ), вы могли бы попробовать что-то вроде этого:
if ('event' in window || 'innerWidth' in window || 'XMLHttpRequest' in window) {
// Do stuff...
}
Комментарии:
1. Спасибо! Я попробую и проведу несколько тестов. Ради здравомыслия я не буду пытаться поддерживать уровень ниже IE8, если это не очень простая проблема. Но тот факт, что что-то столь широко используемое, как «if (window.event)», терпит неудачу, я подозреваю, что где-то в моем коде я случайно закрываю весь объект «window». Я делал это раньше, просто глупо думая, что могу создать локальную переменную под названием «window», LOL!
2. Да! Это действительно работает и определенно кажется безопасным способом тестирования, и должно быть намного быстрее, чем мог быть любой блок try / catch! Еще раз спасибо!