location.hash

В общем есть ссылка вида:
http://site.ru#more:next


Есть штука, которая ловит изменение хеша в браузре на jquery:
 $(window).bind('hashchange', function() {
     alert(location.hash);
});


Есть еще одна штука, которая меняет хеш, допустим это ссылка:
<a href='#more:next'>ссылка</a>


И всё вместе: pastebin.com/0VhPHjXM

Что мне нужно?
Допустим мы открыли документ и перешли по ссылке, возникает alert. Проходим второй раз по ссылке: ничего (то есть не возникает события).

У меня было несколько вариантов, как заставить реагировать на изменение хеша, равному хешу в строке запроса:
<a href='#more:next'>Ссылка</a> <!-- не работает -->
<a href='#more:next/'>Ссылка</a> <!-- не подходит -->
<a href='#more:next '>Ссылка</a> <!-- не работает в опере -->
  • Вопрос задан
  • 27420 просмотров
Пригласить эксперта
Ответы на вопрос 7
Borro
@Borro
А так не подойдет?

$('a').click(function(){
     $(window).trigger('hashchange');
});
Ответ написан
Riateche
@Riateche
Если возникает событие смены hash на "#more:next", сразу изменяйте hash на строку, представляющую адрес страницы (например, "#page/42"). Таким образом, при следующем нажатии на ссылку "#more:next" событие изменения hash опять сработает.
Ответ написан
taliban
@taliban
php программист

setTimeout(hashCheck, 100);
var oldHash = null;
function hashCheck()
{
    if( oldHash !== location.hash )
    {
        // хеш изменился
    }
    setTimeout(hashCheck, 100);
}
Ответ написан
disc
@disc
веб-разработчик
Если кликнуть второй раз по ссылке с текущим хешем не сработает эвент, ведь хеш не меняется.
Может стоит обрабатывать onclick событие и в нем вызывать hashchange()?
Ответ написан
Wott
@Wott
А кто мешает менять «активный» hash на что-нить другое по загрузке и/или срабатыванию события hashchange?

идеологически браузеры правы — hash служит для позиционирования внутри страницы и если мы уже на месте, то смысла дергаться нет. но если hash используется хитрожопно, то и, соответственно, надо также хитро это обеспечивать.
Ответ написан
gaelpa
@gaelpa
Забиндить событие на ссылки, меняющие хэш?
Ответ написан
@dhalturin
var _hash = {
    param: {},
    current: '',
    set: function(data)
    {
        if(_hash.current == data)
        {
            log('lock change hash');
            
            return;
        }

        window.location.href = '#' + data;
    },
    get: function()
    {
        var _href = window.location.href.split('#'); _hash.param = {};

        if(_href[1])
        {
            var _tmp = _href[1].split('&');

            for(i in _tmp)
            {
                _hash.param[_tmp[i].split('=')[0]] = _tmp[i].split('=')[1];
            }
        }

        _hash.current = _href[1];

        log('param changed: ', _hash.param);
    }
};

$(document).rady(function(){
    $('a:not(.nolink)').on('click', function (event)
    {
        event.preventDefault();

        _hash.set(this.href.replace(/^.*#/, ''));
    });

    $(window).bind('hashchange', function()
    {
        _hash.get();
    });

    _hash.get();
});


В _hash.get разбираешь строку как душе угодно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы