Добавляем...


Распознавание технологий
Что касается технологий, обычно желательно знать, какие возможности поддерживает браузер в следующих категориях:

• разметка документа;
• таблицы стилей;
• языки подготовки сценариев;
• Java;
• объектные технологии (подключаемые модули и элементы управления ActiveX).

Возможности разметки гипертекста и поддержки таблиц стилей оказываются немного более сложными для распознавания. Для проверки базовых возможностей разметки можно использовать DOM, попытавшись создать конкретный объект или используя метод document.implementation.hasFeature( ).

Этот метод возвращает логическое значение, характеризующее поддержку HTML или XML конкретного уровня.
Например:

var HTMLDOM1 = document.implementation.hasFeature
(''HTML', '1.0'); // true или false в зависимости от поддержки HTML данного уровня


Конечно, некоторые браузеры обеспечивают поддержку DOM, достаточную для того, чтобы полагаться на нее, но даже если поддержка DOM и обеспечивается, указанная проверка на самом деле ничего не говорит о фактической поддержке конкретной возможности языка разметки или таблицы стилей.

Короче говоря, то, что вы можете с помощью DOM выполнить конкретизацию определенного элемента (X)HTML и установить какие-то его атрибуты, совсем не означает, что эти атрибуты выполнят соответствующую задачу в окне браузера.

На данный момент нам все же придется опираться исключительно на информацию о поддержке браузером конкретной версии HTML или CSS. К счастью, проблемы распознавания остальных технологий из нашего списка с помощью JavaScript решаются проще.

Распознавание поддержки JavaScript

Поддержку JavaScript, наверное, распознать проще всего: если сценарий не выполняется, значит, браузер не поддерживает JavaScript или поддержка JavaScript отключена.
В следующем сценарии обратите внимание на использование дескриптора <noscript> с перенаправлением <meta>:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtmll/DTD/xhtmll-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Проверка JS</title>
<noscript>
<meta http-equiv="Refresh" CONTENT="0; URL=noscript.htm1" />
</noscript>
<meta http-equiv="content-type"
content="text/html; charset=windows-1251" />
</head>
<body>
<script type="text/javascript">
<! —
document.write("Эта страница содержит код JavaScript!");
// —>
</script>
</body>
</html>

Замечание. Этот пример не пройдет проверку на соответствие критериям wЗс, поскольку они не допускают присутствие дескриптора <noscript> в рамках <head> документа.
Авторы считают это упущением спецификаций (X)HTML и, с учетом того факта, что дескриптор <script> может размещаться в рамках <head>, все же рекомендуют этот пример для использования, несмотря на указанное несоответствие.


Если пользователь запретит использование сценариев или попытается получить доступ к узлу с помощью очень старой модели браузера, запрос пользователя можно перенаправить к странице "noscript.html" из каталога обработки ошибок доступа к узлу, которая может иметь следующий вид.


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtmll/DTD/xhtmll-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Ошибка : отсутствие поддержки JavaScript</title>
<meta http-equiv="content-type"
content="text/html; charset=windows-1251" />
</head>
<body>
<h1>Ошибка: необходима поддержка JavaScript</h1>
<hr/>
<p>Ваш браузер не поддерживает JavaScript или поддержка отключена.<br/> Включите поддержку JavaScript или установите обновление браузера, чтобы получить доступ к нужной странице.</p>
<p>Если вы считаете, что данная страница открывается по ошибке, сообщите нам об этом по адресу <a href="mailto:webmaster@democompany.com">Web-Macтep</a></p>
</body>
</html>

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

Некоторые разработчики предпочитают вместо этого применять позитивную проверку, перенаправляя пользователя к соответствующей странице с помощью объекта
Location. Например,


<script type="text/javascript">
<! —
window.location="scripton.html";
//-->
</script>

Проблемой этого подхода является то, что тут используется единственная точка распознавания и не обеспечивается возможность использования кнопки Назад в окне браузера.

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

Распознавание версии JavaScript

Если проверить поддержку JavaScript достаточно просто, то что можно сказать о версии или поддерживаемых возможностях? Один из способов распознавания версий JavaScript опирается на использование нестандартного атрибута <language> дескриптора <script>.

В большинстве примеров этой книги для распознавания применяемого языка сценариев мы использовали стандартный атрибут type, но атрибут <language> на самом деле используется очень широко, причем он имеет некоторые преимущества.

Вспомните (глава 1), что браузеры с поддержкой JavaScript игнорируют содержимое дескрипторов <script> с теми значениями атрибута <language>, которые не поддерживаются.

Ввиду такого поведения браузеров можно создать множество вариантов сценария для разных версий языка или установить переменную для указания наивысшей из поддерживаемых версий, как это сделано в следующем примере:


<script language="JavaScript">
// операторы JS 1.О
var version="l.О";
</script>

<script language ="JavaScriptl.1">
// операторы JS 1.1
var version="l.1";
</script>

<script language="JavaScriptl. 2">
// операторы JS 1.2
var version="l.2";
</script>

<script language="JavaScriptl.5">
// операторы JS 1.5
var version="1.5";
</script>

Можно даже объявить фиктивные функции или объекты и затем переопределить их в рамках высших версий, чтобы избежать ошибок при использовании этого метода сквозной проверки.

Соответствующая техника обсуждается в главе 23, но такой "сквозной" программный код не всегда обеспечивает наилучший вариант проверки в условиях работы с несколькими версиями JavaScript.

Замечание. Одной из проблем использования техники сквозной проверки является то, что атрибуты language и type при одновременном их использовании не всегда правильно учитываются браузерами. В некоторых случаях значения type имеют преимущество в сравнении с установками language, тогда как в других браузерах имеет место обратное. При использовании этого подхода мы рекомендуем ограничиться применением только атрибута language.

Распознавание объектов JavaScript

В некоторых случаях важно не то, какая используется версия JavaScript, а то, доступны ли определенные объекты и методы. Давайте выясним, например, как распознавание объектов может помочь при работе с изменяемой графикой и другими идеями DHTML, обсуждавшимися в главе 15.

Мы считаем, что вместо выяснения того, какую именно версию JavaScript поддерживает тот или иной браузер, лучше проверить поддержку конкретных возможностей путем проверки доступности соответствующих объектов.

Например, следующий сценарий проверяет возможность поддержки изменяемой графики в браузере путем проверки доступности коллекции image [ ]:


<script type="text/javascript">
if (document.images)
alert("Эффект смены изображений, скорее всего, будет работать");
else
alert("Извините, изменяемая графика не поддерживается");
</script>

Здесь мы использовали тот факт, что средства динамического преобразования типов JavaScript конвертируют несуществующий объект в false, а существующий — в true.

Как показывает данный пример, распознавание объектов оказывается удобным способом выяснения наличия поддержки тех или иных возможностей. Но не требуйте от распознавания объектов слишком много.

Очень часто в JavaScript предполагается, что существование одних объектов подразумевает существование других или использование конкретного браузера, но это верно не всегда. Например, для распознавания Internet Explorer можно использовать программный код


var ie = (document.all) ? true : false;

Но означает ли существование document.all то, что действительно используется Internet Explorer? Вполне возможно, что это другой браузер, поддерживающий document.all, но при этом обеспечивающий не все возможности, предлагаемые в Internet Explorer.

Разработчик может даже наполнить document.all собственным программным кодом.
Имея в виду все указанные проблемы, наверное, лучше проверить каждый объект особо, так что вместо предыдущего оператора можно использовать


var allObject = (document.all) ? true : false;
var getByld - (document.getElementByld) ? true : false;

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

Другой рекомендацией при распознавании объектов является необходимость постепенного продвижения по пути проверки.

Помните о том, что зондирование свойства несуществующего объекта генерирует ошибку, поэтому прежде всего следует проверить существование объекта. Например, если для выяснения поддержки window.screen.height использовать только


if (window.screen.height)
// какие-то действия

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


if (window.screen && window.screen.height)
// какие-то действия

Опытные программисты сразу заметят, что указанный подход к распознаванию объектов прекрасно укладывается в рамки использования блоков try/catch.

Распознавание Java

Проверка доступности Java очень просто реализуется с помощью метода javaEnabled ( ) объекта Navigator. Указанный метод возвращает true, если возможности Java доступны, и false — в противном случае.


if (navigator.javaEnabled())
// использовать код Java или дескриптор <applet>
else
alert("Извините, отсутствует поддержка Java");

Если вы выяснили, что поддержка Java имеется, то о возможностях поддержки Java можно узнать больше, получи*доступ к аплету Java, включенному в страницу. Можно даже определить, какого типа виртуальная машина Java поддерживается.

Для этого необходимо получить доступ к общим методам и свойствам аплета Java. Взаимодействие с аплетами обсуждается более подробно в главе 18.

Распознавание подключенных модулей расширения

В Netscape 3+ (а также 4+ и Opera) каждый подключаемый программный модуль, установленный в браузере, имеет соответствующий элемент в массиве plugins [ ] объекта Navigator.

Каждый элемент этого массива — это объект Plugin, содержащий информацию о производителе и версии установленного компонента.

В основе простой схемы распознавания лежит проверка существования модуля расширения, для чего используются возможности ассоциативных массивов для коллекций JavaScript. Например, чтобы проверить наличие модуля расширения Flash, можно записать


if (navigator.plugins["Shockwave Flash"] )
alert("У вас есть Flash!");
else
alert("Извините, не могу найти Flash");

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

Следует знать о том, что Internet Explorer определяет фиктивный массив plugins[ ] как свойство Navigator. Это делается для того, чтобы не допустить появления ошибок при обработке неправильно построенных и ориентированных на Netscape сценариев, зондирующих наличие модулей расширения или просто возвращающих неправильные результаты.

Приходится учитывать такие нюансы при работе с браузерами разных типов, выполняя дополнительную проверку того, что мы не используем Internet Explorer при зондировании массива plugins[ ], как показано ниже:


if (navigator.appName.indexOf('Microsoft')==-1 II
(navigator.plugins && navigator.plugins.length) )
{
if (navigator.plugins["Shockwave Flash"])
alert("У вас есть Flash!");
else
alert("Извините, не могу найти Flash");
}
else
alert("Наличие модуля не установлено: использую <object>");

К счастью, если применяется Internet Explorer, можно использовать дескриптор <object>, чтобы установить обработчик подходящего объекта, если пользователь позволяет сделать это.

Дополнительная информация о том, как распознавать объекты и взаимодействовать с такими объектами, как модули расширения Netscape и элементы управления ActiveX Microsoft, имеется в главе 18.


добавить комментарий
(без перезагрузки и регистрации)


10 случайных разделов

Что ищем на сайте ?


Примеры кода на сайте







@ 2008-2011 Amber
При использовании материалов ссылка на сайт обязательна
Яндекс.Метрика