Javascript: тест onHashchange - PullRequest
       1

Javascript: тест onHashchange

5 голосов
/ 27 октября 2010

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

if(window.onhashchange){
    ...code...
} else {
   ...other code...
}

Я тоже это пробовал:

if(typeof window.onhashchange === "function"){
    alert("Supports");  
} else {
    alert("Doesn't Supports");  
}

Как описано в Quirksmode , это должно сработать, но если я сделаю alert, например, в true state в Safari, это предупредит меня, но Safari не поддерживает onHashChange: S

В чем проблема? Если я не на правильном пути, как мне это проверить?

Ответы [ 4 ]

22 голосов
/ 27 октября 2010

Вы можете обнаружить это событие с помощью оператора in:

if ("onhashchange" in window) {
  //...
}

Смотри также:

6 голосов
/ 22 августа 2011

Имейте в виду, что лучше использовать обнаружение функций, а не вывод о существовании (например, «onhashchange» в окне).

@ xkit объяснил мне хороший функциональный тест, чтобы обойти тот факт, что хотя IE7 не поддерживает onhashchange, он все равно вернет true для вывода о существовании, например if ("onhashchange" в окне) {/ code /} при использовании стандартного режима документа IE7 в IE8.

То, что предложил @xkit, устанавливало флаг (например, var isSet = true;) в функции обработчика для события onhashchange. Затем измените window.location.hash с помощью JavaScript и посмотрите, был ли установлен флаг.

1 голос
/ 10 апреля 2012

if (window.onhashchange! == undefined) предупреждение ('Поддерживает onhashchange');

1 голос
/ 27 октября 2010

Вероятно, в используемой вами версии Safari добавлена ​​поддержка события onhashchange со времени написания этой статьи о Quirksmode. Тесты все еще должны быть действительными; попробуйте это в других браузерах, которые, как вы знаете, не поддерживают событие.

Редактировать: также вы должны использовать метод, описанный @CMS вместо этого, так как событие не будет содержать функцию по умолчанию; таким образом, оба эти теста не пройдут.

...