Скрипт обратного вызова jquery pushstate

Я использую pushstate истории html5, чтобы загрузить страницу поста в блоге.

Внутри каждой загруженной страницы через pushstate у меня есть ползунок (iosslider). Когда я загружаю страницу блога, ползунок не работает. Я думаю, мне нужно вызвать скрипт iosslider.

Вот скрипт iosslider для его инициализации:

$('.iosSlider').iosSlider({
responsiveSlideContainer: true,
responsiveSlides: true,
snapToChildren: true,
desktopClickDrag: true,
keyboardControls: true,
infiniteSlider: true,
navSlideSelector: true,
autoSlide: true,
autoSlideTimer: 5000,
navNextSelector: $('.slider-next'),
navPrevSelector: $('.slider-prev'),
navSlideSelector: $('.slider-pagination .slider-page'),
onSlideChange: slideChange
});

Как я могу инициализировать скрипт, когда я запускаю pushstate?

Извините за мой английский, я француз.


person freaky    schedule 10.06.2013    source источник


Ответы (1)


Вы можете использовать событие window.onpopstate для вызова скрипта.

Проверьте документ там:

https://developer.mozilla.org/en-US/docs/Web/Guide/DOM/Manipulating_the_browser_history#The_popstate_event

Изменить

Вы пробовали это:

$(element).iosSlider('update');

http://iosscripts.com/iosslider/#installation-and-setup#public-methods

А у вас нет ошибок в консоли?

Изменить 2

Я сомневаюсь, что это связано с синхронизацией/асинхронностью. Дело в том, что страница на самом деле не «перезагружается», когда вы используете pushstate. Я предполагаю, что скрипт слайдера только что остановился, и вам нужно запустить его снова, но он уже создан, вы не можете просто инициализировать его снова.

Попробуй:

$(element).iosSlider('destroy');

а затем снова инициализируйте его.

В вашей функции onpopstate поместите ее после этого:

 if (event.state) {
        load_content(event.state.title, window.location.pathname, true);
        // here

Изменить 3

Использовать:

$(window).load(function () { 
     // initialize
});

Имейте в виду, что onload будет запущен раньше, чем onpopstate.

person Maresh    schedule 10.06.2013
comment
Покажите мне пример кода, где вы это пробовали. И это не * для третьего лица кстати ;) - person Maresh; 10.06.2013
comment
Вы можете увидеть мой сценарий pushstate здесь: /16658895/ без какого-либо сценария обратного вызова. Лучший способ — использовать обратный вызов внутри моей функции load_content, но он не работает. Я думаю, это потому, что асинхронная задача... - person freaky; 10.06.2013
comment
Функция обновления работает некорректно. Если я помещу скрипт для инициализации isoslider внутри окна, изменяющего размер, он будет работать при изменении размера браузера (он не работает с функцией обновления)... Мне нужно убедиться, что весь контент загружен, прежде чем вызывать iosslider... - person freaky; 10.06.2013
comment
Это не работает с вашим обновленным ответом. Но я почти уверен, что лучший способ - это перезвонить в моей функции load_content... - person freaky; 10.06.2013
comment
Это не работает. Но я нахожу решение. В моей функции load_content я поместил свою функцию инициализации iosslider в конец с setTimeout, чтобы убедиться, что контейнер iosslider существует, прежде чем пытаться его обновить... Это работает, но я уверен, что есть лучшее решение.. .. - person freaky; 10.06.2013
comment
Да, решение, которое вы ищете, это .load(), оно проверяет, все ли загружено. Но проблема в том, что я не совсем уверен, что это вызвано манипулированием историей. - person Maresh; 10.06.2013
comment
Да, я пробую его в pushstate, но он не работает. С setTimeout все работает отлично. Так что все в порядке, наконец. Спасибо за помощь! - person freaky; 10.06.2013
comment
Что ж, очень жаль, что мы не смогли найти лучшего решения, чем тайм-аут, который будет прослушиваться из-за медленного соединения. - person Maresh; 10.06.2013
comment
Ааа !! Я знаю, почему .load() не работает. Это потому, что onpopstate срабатывает после загрузки !! Так что разместить его там действительно не получится. Просто поместите свою инициализацию в .load() вместо .ready или куда бы вы ни звонили. - person Maresh; 10.06.2013
comment
Ok. Но если я помещу свою функцию инициализации для ползунка в load(), ничего не произойдет. Я думаю, что невозможно вызвать загрузку после загрузки страницы с помощью pushstate. Думаю для медленного соединения это не будет проблемой. Контейнер div создается очень быстро... Моя проблема была из-за некоторой анимации выхода перед моей инициализацией. Спасибо за помощь. - person freaky; 10.06.2013