onHashChange работает onLoad ... неловко - PullRequest
3 голосов
/ 11 июля 2010

Поэтому я бы хотел, чтобы моя страница загружала контент, если хэш окна изменился.

С помощью Mootools это довольно просто:

$extend(Element.NativeEvents, {
    hashchange: 1
});

, а затем:

window.addEvent('hashchange', function() {});

Тем не менее, событие hashchange срабатывает при загрузке страницы, хотя спецификация требует, чтобы он не срабатывал до завершения загрузки страницы!

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

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

Например, если я введу http://foo.bar/, все будет работать нормально.Однако http://foo.bar/#test в идеале будет загружать начальную страницу, обнаруживать хэш и загружать «тестовое» содержимое.

К сожалению, браузер загружает начальную страницу, считает ее «готовой» и затем загружает«тестовый» контент, который затем запускается onHashChange.Упс?

Это вызывает бесконечный цикл, если я специально не прошу браузер НЕ обновлять хеш, если срабатывает событие onHashChange.Это просто:

var noHashChange;
noHashChange = true;
var hashes = window.location.hash.substr(1).split("/"); // Deciphers the hash, in this case, hashes[0] is "test"
selectContent(hashes[0]); // Here, selectContent would read noHashChange, and wouldn't update the hash
noHashChange = false;

Итак, теперь обновление хэша ПОСЛЕ загрузки страницы будет работать правильно.За исключением того, что он все еще сходит с ума при начальной загрузке страницы и извлекает содержимое примерно 3 или 4 раза, потому что он продолжает обнаруживать, что хэш изменился.Грязный.

Я думаю, что это может иметь какое-то отношение к тому, как я устанавливаю хэш, но я не могу придумать лучшего способа сделать это, кроме:

window.location.hash = foobar;

..внутри функции, которая запускается всякий раз, когда выбирается новый контент.

В этом и заключается проблема, да?Страница загружена, ТОГДА содержимое загружено (если оно есть) ...

Надеюсь, я был связным ...

Ответы [ 3 ]

0 голосов
/ 29 декабря 2010

вы можете реализовать наблюдатель для хеш-объекта, который будет вызывать функцию, когда объект has изменился. Он не имеет никакого отношения к фактической загрузке страницы.лучший способ сделать это через Object.prototype.watchсм. другие страницы по этой теме: On - window.location.hash - Изменить?

0 голосов
/ 13 июля 2011

взгляните на MooTools History он реализует onhashchange, если новый API html5 history недоступен, нет необходимости заново изобретать колесо:)

0 голосов
/ 21 июля 2010

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

 if(window.location.hash != foobar){ window.location.hash = foobar;}

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

(я говорю это, потому что похоже, что у вас есть какое-то соглашение о структуре каталогов, соответствующее вашемуlocation.hash'es, возможно, вы выбираете определенный лист дерева, когда выбран корень, или что-то в этом роде?)

...