Обнаружение браузера и обнаружение функции

Я собираюсь сыграть защитника дьявола на мгновение. Я всегда задавался вопросом, почему обнаружение браузера (в отличие от обнаружения функции) считается плохим, как плохая практика. Если я тестирую определенную версию определенного браузера и подтверждаю, что определенная функциональность ведет себя в некотором предсказуемом виде, тогда, похоже, будет принято решение сделать особый случай. Причина в том, что она будет в будущем надежной, потому что эта частичная версия браузера не изменится. С другой стороны, если я обнаруживаю, что элемент DOM имеет функцию X, это не обязательно означает, что:

  • Эта функция работает одинаково во всех браузерах и
  • Более того, он будет работать одинаково даже во всех будущих браузерах.

Я просто заглянул в источник jQuery, и они обнаруживают функцию, вставляя тщательно продуманный фрагмент HTML в DOM, а затем проверяют его на определенные функции. Это разумный и надежный способ, но я бы сказал, что это было бы слишком тяжело, если бы я просто сделал что-то подобное в своем маленьком кусочке личного JavaScript (без jQuery). У них также есть преимущество практически бесконечных ресурсов QA. С другой стороны, то, что вы часто видите, что люди делают, это то, что они проверяют существование функции X, а затем, основываясь на этом, они предполагают, что функция будет вести себя определенным образом во всех браузерах, которые имеют эту функцию.

Я ничего не говорю в том смысле, что обнаружение функции не очень хорошо (если используется правильно), но мне интересно, почему обнаружение браузера обычно немедленно отклоняется, даже если оно звучит логично. Интересно, есть ли еще одна модная вещь.

Ответ 1

Мне кажется, что обнаружение браузеров было широко осуждено после этого сообщения от Resig пару лет назад. Однако комментарии Resig были специфичны для кода библиотек/рамок, то есть кода, который будет использоваться другими [приложениями/сайтами] для доменов.

Я считаю, что функция обнаружения, без сомнения, подходит для библиотек/фреймворков. Однако для приложений, специфичных для домена, я не настолько уверен в том, что обнаружение браузера плохое. Он подходит для работы с известными характеристиками браузера, которые трудно обнаружить, или для браузеров, которые имеют ошибки при реализации самой функции. Время, в течение которого обнаружение браузера подходит:

  • сайты/приложения, которые не являются межсерверными, и должны отображать предупреждение/диалог/CustomPage для этого браузера клиента. Это часто встречается в устаревших приложениях.
  • Банки или частные сайты со строгими политиками в отношении того, какие браузеры и версии поддерживаются (чтобы избежать известных угроз безопасности, которые могут нарушить пользовательские данные)
  • микро-оптимизация: иногда один браузер смехотворно быстрее других при выполнении определенной операции определенным образом. Это может быть выгодно в зависимости от вашей пользовательской базы для перехода на этот конкретный браузер/версию.
  • Отсутствие прозрачности png в IE6
  • много проблем с отображением/отображением (читайте: поддержка IE css), которые засвидетельствованы только в определенных версиях браузера, и вы действительно не знаете, какую функцию проверить.

Тем не менее, есть некоторые основные ловушки (вероятно, большинство из нас), чтобы избежать при обнаружении браузера.

Ответ 2

Вот хорошая статья, объясняющая, как обнаружение признаков превосходит по многим параметрам браузерное обнюхивание.

Истина заключается в том, что обнюхивание крайне хрупкое. Он хрупкий в теории, поскольку он полагается на произвольную строку userAgent, а затем практически сопоставляет эту строку с определенным поведением. Как показало время, он также хрупкий на практике. Тестирование каждой крупной и второстепенной версии десятков браузеров и попытка анализа чисел сборки некоторых из этих версий нецелесообразно; С другой стороны, тестирование определенного поведения на причуды является гораздо более надежным. Например, тесты функций часто ловят ошибки и несоответствия, которые, кстати, копируют браузеры друг от друга.

Из моего собственного опыта, исправляя Prototype.js в IE8, я знаю, что 90% проблем можно было бы избежать, если бы мы не понюхали в первую очередь.

При фиксации Prototype.js я обнаружил, что некоторые из функций, которые необходимо протестировать, на самом деле очень распространены среди JS-библиотек, поэтому я сделал небольшую коллекцию общие тесты характеристик для тех, кто хочет избавиться от обнюхивания.

Ответ 3

Идеальное решение состоит в том, чтобы сочетать как функцию, так и функцию обнаружения браузера. Первый падает из-за упомянутых вами моментов, а последний, потому что иногда браузеры публикуют ложную информацию, чтобы "заставить вещи работать" именно так.

Mozilla имеет отличный Browser Detection Primer, который может быть вам полезен.

От wikipedia "В разные моменты своей истории использование веб-сайта было одним из браузеров, поскольку многие веб-сайты предназначены для работы только с этим конкретным браузером, а не по стандартам таких органов, как W3C и IETF. часто включают в себя код браузера, который изменяет отправленную информацию в зависимости от полученной строки User-Agent. Это может означать, что менее популярные браузеры не отправляют сложный контент, даже если они могут иметь дело с ним правильно или Таким образом, различные браузеры" плавают "или" обманывают "эту строку, чтобы идентифицировать себя как нечто иное с таким кодом обнаружения, часто настоящая идентификация браузера затем включается позже в строку."