![]() |
JavaScript - полезные трюки и решения
Начнем
Потребовалось точно узнать что за браузер использует пользователь . Тк способ с HTTP_USER_AGENT не является стопроцентным надо было найти другое решение. После ковыряния интернета в поисках нужной информации , наткнулся на соответсвующий док от mozilla dev team http://www.mozilla.org/docs/web-developer/sniffer/browser_type.html , но к сожалению они наивно верят что браузер можно точно определить используя navigator.userAgent; , поэтому я прибег к другому выходу - нашел различия в обработке js и результат перед вами - скрипт точно обрабатывает движки на Gecko ( Firefox,Netscape,Mozilla) , Оперу и ИЕ. PHP код:
Пример страницы _http://underwater.xtoolz.ru/test.html |
Способы решения проблем с кодировкой в Ajax
[= Суть проблемы =] Ответ сервера при использовании Ajax по умолчанию приходит в кодировке "utf-8". Если запрашиваемая страница изначально имеет кодировку "windows-1251", то кириллические символы будут безвозвратно искажены свойством responseText. В таком случае вывод ответа сервера будет представлен знаками вопроса "?", или другими неопознанными символами. [= Способ решения =] Их много. Все способы можно разделить на две группы: изменение кодировки на стороне сервера и на стороне клиента.Когда мы имеем доступ к серверу, особых проблем обычно не возникает: хедеры, встроенные функции, перекодировка по таблицам символов. Описаний этого полно в нете. Обратная ситуация. Например, нашли мы уязвимость XSS, желаем использовать Ajax для незаметного получения каких-либо данных с других страниц на сервере. При этом: во-первых, кодировка у страниц "windows-1251", во-вторых, сервер в ответе на Ajax-запрос не указывает кодировку пересылаемых данных. В таких случаях возникает необходимость изменить кодировку уже на стороне клиента. Универсального способа для этого нет. Для каждого браузера (группы браузеров) они свои. Эти способы, являясь от части продуктом моего обобщения разрозненной информации, а отчасти моего собственного творчества, я представляю. [= Вариант, работающий во всех основных браузерах =] test.html (необходимо убирать пробелы-разрывы, которые вставляет сайт) PHP код:
Код:
<html>Здесь что-нибудь на русском</html>1) Internet Explorer Объекты Msxml2.XMLHTTP и XMLHttpRequest (IE 7.0) в этом браузере имеют фирменное свойство - "responseBody". В нем находится ответ сервера не в обычном строчном, а в бинарном виде. То есть в том виде, когда еще он не распарсился в соответствии с какой-либо кодировкой. В данном случае именно эта сторона для наc имеет значение. Будем парсить бинарный ответ самостоятельно. В стандартном JavaScript функций для работы с таким бинарным ответом сервера нет. IE имеет несколько элементов управления ActieX, которые могут это делать, но в некоторых случаях они из соображений безопасности бывают выключены. Имеется отличный способ обработки такого ответа с помощью VBScript, в котором присутствуют необходимые для этого встроенные функции. VBScript-функция Код:
<script language=vbscript>(убрать пробел в предпоследнем упоминании функции BinaryToString) PHP код:
2) FireFox, Netscape Используется метод overrideMimeType() объекта реквест PHP код:
3) Opera Метод overrideMimeType() предусмотрен в этом браузере в объекте реквест, однако в текущей версии 9.24 кодировку он не переопределяет. У данного браузера имеется другая особенность. Состоит она в автоматическом определении кодировки контента. То есть, когда запрашиваешь аяксом страницу в 'windows-1251' первый раз (с хоста), она выводится искаженной. Во второй раз та же страница отображается уже корректно. Данную особенность мы и будем использовать. PHP код:
Автоматическое определение кодировки Оперой производится независимо от установленной пользователем (пользовательской кодировкой может не быть "win-1251"), а также от настроек кэширования. Ключи поиска: кодировка Ajax кодировка перекодировка Ajax перекодировка UTF-8 Win-1251 |
Распознавание браузера на стороне клиента
[= Вводные замечания =] 1. Скрипт предназначен для распознавания браузера юзера самим браузером юзера, минуя navigator.userAgent. Аналогов ему нет. 2. Нижепредставленный скрипт отличается от скрипта распознавания gemaglabin'a в первом сообщении тем, что: А) распознает не только группу браузеров, основанных на движке Gecko (Firefox, Netscape Navigator, Mozilla), но и сами эти браузеры внутри группы; Б) распознает конкретные версии браузеров или диапазоны версий, внутри которых наборы объектов, свойств и методов реализованной модели javascript характеризуются определенным постоянством. В) Мда, и код у него больше. :) 3. В качестве признаков идентификации были взяты две особенности: Первая: само наличие или отсутствие объектов, свойств и методов в модели javascript браузера, набор которых изменяется от версии к версии. Вторая: возможность вывода этих объектов, свойств и методов в цикле for ... in. Даже имеющиеся объекты-методы не всегда доступны к просмотру в цикле for ... in. Этот показатель также переменен от версии к версии. 4. Разумеется, в строгом смысле скрипт нельзя назвать скриптом на javascript. В нем использованы как средства Jscript, так и фирменные возможности других браузеров, не предусмотренные стандартами javascript. [= Скрипт =] PHP код:
[= Заключительные замечания =] 1. О недостатках А) Распознавание основано на предположении, что клиент использует один из тех браузеров, на которые нацелено распознавание: FireFox, Mozilla, Netscape Navigator, Opera, Internet Explorer. Остальные могут быть распознаны некорректно, хотя многое сделано, чтобы такие браузеры были обозначены отдельно как "неопознанные". Б) Брались во внимание только финальные версии, но не альфа, бета и т.д. В) Просмотр исходного кода страницы до распознавания может повлечь ошибку идентификации. Необходимо просматривать его после получения результата. Г) Из-за того, что объекты-методы могут то появляться, то исчезать в новых версиях (ибо процесс расширения возможностей нелинеен во времени) скрипт может давать ошибочные результаты при распознавании более новых версий, чем заложено в нем самом. Например, Opera 9.25 ближе к 9.23, чем к 9.24. Д) Тестировалось всё под Виндовс, как те же самые браузеры поведут в других OC, утверждать не могу. 2. Версии распознающихся браузеров: IE: 4.0, 5.0, 5.5, 6.0, 7.0 Opera: 7.02, 7.03, 7.10, 7.11, 7.20, 7.21, 7.22, 7.23, 7.50, 7.51, 7.52, 7.53, 7.54, 8.0, 8.01, 8.02, 8.50, 8.51, 8.52, 8.53, 8.54, 9.0, 9.01, 9.02, 9.10, 9.20-9.25 _http://arc.opera.com/pub/opera/win Firefox: 0.8, 0.9, 1.0, 1.0.1-1.0.7, 1.5, 1.5.0.1-1.5.0.8, 2.0, 2.0.0.1-2.0.0.11 Netscape Navigator: 4.x, 7.0, 7.01, 7.02, 7.2, 8.02, 8.03, 8.04, 8.1, 9.0, 9.0.0.1-9.0.0.5 _http://browser.netscape.com/downloads/archive Mozilla: 1.7, 1.7.1-1.7.13 _http://www.mozilla.org/releases/ |
Цитата:
PHP код:
|
Зачем на js их определять?
Есть определенные диапазоны и юзер-агенты их... |
| Время: 13:37 |