Нестандартный способ определения браузера Internet Explorer

Начиная с версии 1.2 в языке JavaScript есть интересный метод работы с функциями - arguments.callee. Откроем почитать документацию.

arguments.callee
Специфицирует тело исполняемой в данный момент функции. Свойство callee доступно только в теле функции. Ключевое слово this не относится к исполняемой в данный момент функции. Используйте свойство callee для обращения к функции в теле этой функции.


Проще говоря, результатом выполнения arguments.callee внутри какой-нибудь функции будет тело этой функции. Для наглядного примера код:
function myFunc() {
  return arguments.callee;
}
alert(myFunc());

покажет в MessageBox'е следующее:


Результат arguments.callee

то есть в точности код вызванной функции. "Ага!" - подумали суровые уральские мужики. - "А если мы поместим в тело функции что-нибудь еще, например железный лом комментарий?" Подумали и поместили.
function myFunc() {
  // Today is a good day to die
  return arguments.callee;
}
alert(myFunc());

Тестирование приведенного кода в разных браузерах показало очень интересный результат. Mozilla Firefox, Safari, K-Meleon, Netscape Navigator и Opera до версии 9.5 показывают код функции БЕЗ комментариев, а Internet Explorer версий 6-7 и Opera 9.5 и выше добросовестно показывают полный текст функции со всеми комментариями. А не попробовать ли нам использовать это поведение браузеров для определения их типов? В результате недолгих раздумий появилась следующая функция:
function detect_ie() {
  function smart_ie_check() {
    // 66 - Internet Explorer Trap
    return(arguments.callee.toString().replace(/[^6]/g,''));
  }
  return(smart_ie_check()=='666' && typeof(opera)!='object');
}

Вложенная функция smart_ie_check() возвращает свое тело, из которого вырезаны все символы, не являющиеся цифрой "6". Напомню, что в Internet Explorer в обрабатываемую строку попадает и комментарий. Результатом работы smart_ie_check() будет "666" для IE-based браузеров и Opera 9.5+, а для всех остальных браузеров вернется "6". Откуда взялись эти "шестерки"? Две из комментария и одна из фильтра replace, итого три. Остается отфильтровать из результатов Opera, для этого проверим тип объекта "opera". В браузерах семейства Opera этот объект является внутренним и определен собственно как "object", в других браузерах вернется "undefined". После всех проверок функция detect_ie() вернет true, если браузер Internet Explorer или IE-based и false для всех остальных браузеров.
Разумеется, полагаться только на эту проверку при определении типа браузера нежелательно, она должна быть использована только как часть комплексной проверки. Но все-таки такая проверка гораздо надежнее чем поиск строки "MSIE" в navigator.userAgent, потому что существует множество программ и плагинов для "камуфляжа" браузеров под совершенно другие.
Теги:
arguments.callee, navigator.userAgent
Добавлено: 17 Сентября 2013 07:47:42 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...