ФорумПрограммированиеJavaScript → Как отловить событие, которое наступило по history.pushState?

Как отловить событие, которое наступило по history.pushState?

  • adw0rd

    Сообщения: 22900 Репутация: N Группа: в ухо

    Spritz 26 февраля 2015 г. 9:37

    Привет, не пойму как отловить событие по history.pushState. Т.е. некий плагин меняет путь в строке браузера, как отловить такое событие?

    • "hashchange" не предлагать, я не юзаю хеши в адресах
    • "popstate" срабатывает только когда по истории навигируешься, на pushState не реагирует
    adw/0
  • kostyl

    Сообщения: 5199 Репутация: N Группа: Джедаи

    Spritz 26 февраля 2015 г. 12:38, спустя 3 часа 1 минуту 15 секунд


    (function(history){
    var pushState = history.pushState;
    history.pushState = function(state) {
    if (typeof history.onpushstate == "function") {
    history.onpushstate({state: state});
    }
    // … whatever else you want to do
    // maybe call onhashchange e.handler
    return pushState.apply(history, arguments);
    }
    })(window.history);
  • kostyl

    Сообщения: 5199 Репутация: N Группа: Джедаи

    Spritz 26 февраля 2015 г. 12:39, спустя 41 секунду

    это прикол если что …
  • kostyl

    Сообщения: 5199 Репутация: N Группа: Джедаи

    Spritz 26 февраля 2015 г. 12:39, спустя 13 секунд

    склейка работает?
  • kostyl

    Сообщения: 5199 Репутация: N Группа: Джедаи

    Spritz 26 февраля 2015 г. 12:39, спустя 8 секунд

    хер
  • phpdude

    Сообщения: 26611 Репутация: N Группа: в ухо

    Spritz 26 февраля 2015 г. 23:33, спустя 10 часов 53 минуты 23 секунды

    $ ->
      $(window).on 'popstate', ->
        ShopFilter.onLocationChange()
    

    на coffee.

    Сапожник без сапог
  • phpdude

    Сообщения: 26611 Репутация: N Группа: в ухо

    Spritz 26 февраля 2015 г. 23:35, спустя 1 минуту 53 секунды

    ну а дальше у меня чтото такое

      @onLocationChange: (reload_grid = true)->
        search = queryString.parse(location.search)
        unless search['filter']
          return
    
        [filterName, filter...] = search['filter'].split(":")
    
        if ShopFilter.filters[filterName]
          showFilter(filteName, filter)
    
    Сапожник без сапог
  • adw0rd

    Сообщения: 22900 Репутация: N Группа: в ухо

    Spritz 26 февраля 2015 г. 23:54, спустя 19 минут 2 секунды

    Так ты юзаешь popstate, а он у меня не срабатывает после pushState. Или у тебя срабатывает?

    adw/0
  • adw0rd

    Сообщения: 22900 Репутация: N Группа: в ухо

    Spritz 26 февраля 2015 г. 23:57, спустя 3 минуты 31 секунду

    Вот мой кейс:

    window.addEventListener('popstate', function(e) { console.log('CH', location.href) })
    
    history.pushState({}, '', '/test/')
    
    history.pushState({}, '', '/test/2/')
    
    history.back()
    CH <noindex><a href="http://pyha.ru/test/" rel="nofollow">http://pyha.ru/test/</a></noindex>
    
    history.forward()
    CH <noindex><a href="http://pyha.ru/test/2/" rel="nofollow">http://pyha.ru/test/2/</a></noindex>
    
    history.pushState({}, &#39;&#39;, &#39;/test/3/&#39;)
    
    adw/0
  • phpdude

    Сообщения: 26611 Репутация: N Группа: в ухо

    Spritz 27 февраля 2015 г. 1:32, спустя 1 час 35 минут 9 секунд

    Так ты юзаешь popstate, а он у меня не срабатывает после pushState. Или у тебя срабатывает?

    @adw0rd, срабатывает конечно.

    Сапожник без сапог
  • phpdude

    Сообщения: 26611 Репутация: N Группа: в ухо

    Spritz 27 февраля 2015 г. 1:33, спустя 49 секунд

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

    Сапожник без сапог
  • phpdude

    Сообщения: 26611 Репутация: N Группа: в ухо

    Spritz 27 февраля 2015 г. 1:34, спустя 1 минуту 9 секунд

    понял твою проблему. тебе надо сам пуш "ловить". у плагина то нет эвента на это?

    Сапожник без сапог
  • adw0rd

    Сообщения: 22900 Репутация: N Группа: в ухо

    Spritz 27 февраля 2015 г. 1:46, спустя 11 минут 20 секунд

    понял твою проблему. тебе надо сам пуш "ловить". у плагина то нет эвента на это?

    @phpdude, нету к сожалению, видимо надо будет пропатчить его. Так и сделаю, спасибо!

    adw/0
  • phpdude

    Сообщения: 26611 Репутация: N Группа: в ухо

    Spritz 27 февраля 2015 г. 1:46, спустя 42 секунды

    @adw0rd, либо его, либо сам history.pushState. можно отманкипатчить

    Сапожник без сапог
  • adw0rd

    Сообщения: 22900 Репутация: N Группа: в ухо

    Spritz 27 февраля 2015 г. 1:51, спустя 4 минуты 43 секунды

    Ага, тоже хорошая идея, спасибо!

    adw/0

Пожалуйста, авторизуйтесь, чтобы написать комментарий!