Jquery - скажите, когда меняется хеш?

Я пытаюсь заставить мой сайт правильно реагировать на кнопку «Назад». Я сохранил этот хэш того, что я хочу, но я не знаю, как jQuery сможет определить, когда хэш изменится. Это не .ready(), потому что страница не перезагружается. Что я использую?

Изменить для большей ясности:

Я использую iframe, поэтому не могу сказать, когда кто-то нажимает на ссылку. Он находится в том же поддомене, поэтому я вижу его путь к файлу и сохраняю его, чтобы вы могли добавить его в закладки. К сожалению, при сохранении его в виде хэша моя кнопка «Назад» теперь не перезагружается, что не позволяет перезагрузить iframe, поэтому моя кнопка «Назад» по существу сломана. Если бы был способ узнать, когда меняется URI, я мог бы сравнить его с адресом iframe и изменить, если они не совпадают.

Все, что мне нужно, это способ проверить, изменился ли URI. Есть ли .change() для URI? Что-то в этом духе?


person Ethan    schedule 02.09.2009    source источник


Ответы (5)


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

Я не знаю хука для jQuery, чтобы определить, когда меняется хеш.

Вы можете перехватывать события кликов ваших хеш-якорей и реагировать соответствующим образом, а не ждать события «хэш изменился» (которого не существует).

Некоторые подходы создают событие «хэш изменился», проверяя window.location.hash по таймеру.

person Ken Browning    schedule 02.09.2009
comment
я сделаю таймер, если все остальное не удастся, спасибо! Позвольте мне посмотреть, есть ли у кого-нибудь способ, который не включает таймер. - person Ethan; 02.09.2009

Вы можете попробовать плагин History Event.

person Daniel Moura    schedule 02.09.2009
comment
Они тоже используют время. Думаю, это то, что я сделаю. - person Ethan; 02.09.2009

Бен «ковбой» Алман написал кроссплатформенный плагин для изменения хэша

http://benalman.com/news/2010/07/jquery-hashchange-event-v13/

Я не знаю, используете ли вы его внутри iframe или что-то еще, но если бы вы использовали его вне iframe, это было бы похоже на

$(function(){
    $(window).hashchange(function(){
       //Insert event to be triggered on has change.
       changeIframeContent(window.location.hash);
    })
})
person Jacob Lowe    schedule 18.01.2011

Вам следует взглянуть на решение Бена Наделя, которое находится в привязке событий к не-DOM-объектам.

person mcmlxxxiii    schedule 24.10.2009

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

function setWatchHashChanges(functionObject)
{
    if(window.location.watch)
    {
        window.location.watch('hash', function(e){functionObject(e);return e;});
    } else {
        if(!setWatchHasnChanges.hash)
        {
            setWatchHasnChanges.hash = window.locaton.hash;
        } else {
            setInterval(function(){
            if(setWatchHasnChanges.hash!== window.locaton.hash)
            {
                setWatchHasnChanges.hash = window.locaton.hash;
                functionObject(setWatchHasnChanges.hash);
            }
        }, 100);
    }
}
person Cleiton    schedule 02.09.2009