Наличие объекта / функции тестирования для кросс-браузерного JavaScript - PullRequest
1 голос
/ 19 ноября 2011

Я хотел бы получить совет относительно наилучшей практики тестирования существования объектов на совместимость с различными браузерами.

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

Что я пытаюсь сделать

Я пытаюсь написать служебную библиотеку, которая пытается придерживаться методов w3c, чтобы я мог просто вызвать

xAddEventListener(elem, type, listener, useCapture)

для всех браузеров, а не

elem.AddEventListener(type, listener, useCapture)

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

Я видел это сегодня:

if (typeof node.addEventListener == "function")

но это когда-нибудь даст другой результат, чем обычный

if (node.addEventListener)

Стиль документов?

Также будет полезна ссылка на документ по стандартам или стилям. Я нашел https://developer.mozilla.org/en/Browser_Detection_and_Cross_Browser_Support но это было последнее обновление в 2003 году. Он выступает за простой

if (document.images)

тесты для большинства тестов существования и

if (typeof(window.innerHeight) == 'number')

только с числами, потому что если (0) будет равно false

Примеры, чтобы вдохновить комментарий:

if (myObject)

Может ли объект или функция когда-либо не пройти этот простой тест?

if (myObject != undefined)

Когда это лучше, чем в предыдущем тесте?

if (typeof(myObject) == 'object')

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

if ( typeof myObject.function !== undefined ) {

В одном сообщении говорится, что всегда используется === или! ==, поскольку оно различает ноль и неопределенное. Это когда-нибудь важно на практике?

Другая возможность:

try {
    node.addEventListener(...)
} 
catch(err) {
    node.attachEvent(...)
}

Который в python, похоже, становится любимым способом решения подобных вещей.

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

Во всяком случае, что думают люди? Пожалуйста, вы можете перечислить плюсы и минусы методов, которые вам нравятся / не нравятся, а не просто отстаивать свои любимые.

1 Ответ

2 голосов
/ 20 ноября 2011

Все зависит от того, насколько конкретно вы хотите быть / насколько вы хотите утверждать перед вызовом функции.


if (myObject)

Может ли объект или функция когда-либо провалиться в этом простом тесте?

Нет, единственными значениями, которые не проходят предложение if, являются false, 0, "", NaN, undefined и null.Это все примитивы.Объекты (включая функции) будут всегда проходить предложение if.


if (myObject != undefined)

Когда это лучше, чем в предыдущем тесте?

Если вы хотите проверить, является ли значение «значимым», т.е. не undefined или null.Например,

if(numberInputtedByUser) {
    // do something with inputted number
}

не выполнит условие if, если число равно 0, в то время как вы, вероятно, хотите, чтобы 0 было разрешено.В таком случае, != undefined - это чуть лучше.


if (typeof(myObject) == 'object')

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

Это ключевое слово.Вы можете назвать это по-функциональному, хотя.В самом простом виде вы можете использовать typeof, например:

typeof myObject

Вы можете, однако, добавить (посторонние) парены, поскольку они ничего не значат:

typeof (myObject)

Точно так же, как вы можете сделать:

(myObject).key

или даже:

(((myObject))).key

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

Относительно того, почему использовать typeof - вы можете быть еще более уверены в типе переменной.С тестом if(...) значения, которые можно передать, могут быть самыми разными - в основном все, кроме списка, который я опубликовал выше.С if(... != undefined) вы позволяете передавать еще больше.С if(typeof ... == 'object') вы действительно разрешаете только объекты, которые могут быть необходимы в зависимости от того, что вы обрабатываете.


if ( typeof myObject.function !== undefined ) {

В одном сообщении всегда говорилось об использовании === или! ==как он различает нуль и неопределенный.Это когда-либо важно на практике?

=== действительно предпочтительнее, чем ==.Хотя различать null и undefined не всегда необходимо, очень полезно уберечь себя от таких причуд, как 0 == ''.Если вы хотите проверить, является ли число 0, тогда стоит использовать === 0, поскольку == 0 также допускает пустую строку (чего вы можете не ожидать и, вероятно, не хотите).Даже в случаях, когда == не приводит к причудам, было бы лучше постоянно использовать === для согласованности и избегать неожиданных ошибок.


try {
    node.addEventListener(...)
} 
catch(err) {
    node.attachEvent(...)
}

Это, конечно, возможно и очень просто.Обратите внимание, что try catch называется медленным.Более того, вы на самом деле не объясняете, почему это не удается.Это немного упрощенно (но может работать нормально).


if (typeof node.addEventListener == "function")

, но это когда-нибудь даст результат, отличный от простого

if (node.addEventListener)

Да, как я сказал выше, первый только передает функции, в то время как второй разрешает все, кроме этого списка «ложных» значений.Можно добавить Node.addEventListener = 123, и он пропустит предложение if во втором случае. Но IE не может дать правильный typeof результат:

typeof alert !== "function"

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


В конце я бы просто использовал простое предложение if.Конечно, это не удастся, если вы добавите странные вещи, такие как Node.addEventListener = 123, но с другой стороны вы наверняка будете ожидать странных вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...