2012-06-27 4 views
1

Я в настоящее время (счастливо) с помощью jquery связывает функцию запроса ajax с событием window.onpopstate в браузерах, отличных от IE. Однако IE никогда не ударяет мою функцию doAjax.Могу ли я использовать onpopstate с IE?

// Bind a function to the popstate event to execute ajax requests 
    // this allows request to occur on back/fwd browser navigation 
    window.onpopstate = doAjax; 

Кто-нибудь знает, есть ли способ сделать IE 8/9 хорошим игроком?

+0

Я думаю, что функции 'pushState' или' replaceState' могут инициировать это событие. Когда вы ожидаете, что IE запустит это событие? –

+0

'pushState' /' onpopstate' не поддерживаются в IE <10. –

+0

@ Václav: Я использую библиотеку jQuery History для обновления URL-адреса при загрузке новой страницы ajax. Моя цель - запустить событие загрузки страницы ajax в любое время, когда URL-адрес изменится, чтобы пользователь мог вернуться к предыдущей странице «ajax», когда они нажимают кнопку «Назад». – doub1ejack

ответ

7

Решение, к которому я пришел, - это связать как onpopstate, так и onhashchange с нужным обработчиком.

// Popstate: load ajax 
    window.onpopstate = handlePageWipe; 

    // And onhashchange for IE 
    if(jQuery.browser.msie) window.onhashchange = handlePageWipe; 

Я использую библиотеку истории Jquery, чтобы обновить URL, как я сделать АЯКС изменения страницы. К сожалению, и, как предсказуемо, IE не догнал и, похоже, нет способа изменить URL-адрес с JS. История возвращается к обновлению хэш-статуса url в IE, так что это служит моей первоначальной цели привязать изменение состояния URL к обработчику в IE.

Конечно, это открывает еще одну банку червей, потому что теперь мне приходится обрабатывать как изменения URL, так и изменения хэша. Ну что ж, так оно идет ...

EDIT: Как @linus указывает, что мы должны быть милосердным и избежать обнаружения браузера, чтобы дать IE возможность реформ.

1

Я нахожусь в проекте, который использует плагин истории jQuery, защищенный авторским правом Takayuki Miwa. Клиентский код инициализирует библиотеку с помощью $.history.init(callback, ...).
Этот обратный вызов вызывается каждый раз, когда вы перемещаете/обновляете страницу, а также каждый раз, когда содержимое страницы обновляется с помощью AJAX, будь то для кликов, истории назад, истории вперед.

Если вы используете ту же самую библиотеку, вы можете сделать то же самое, чтобы код вызывался при изменении содержимого страницы, тем самым отбрасывая объект onpopstate/onhashchange.

Если вы используете новый плагин History.js from B A Lupton, будет возможно связать событие statechange.

Кроме того, имейте в виду, что даже onhashchange поддерживается только «только» от IE8.
НТН

0

это решил меня:

если (. Navigator.userAgent.toLowerCase() IndexOf ('MSIE')) window.onhashchange = местонахождение еще window.onpopstate = найти

3

Я предпочел бы сделать так:

if (window.onpopstate != undefined) { 
    window.onpopstate = locate; 
} else { 
    window.onhashchange = locate; 
} 

так что если «MSIE» добавить эту функциональность не зависит от старого кода

+0

На самом деле это должно быть window.onpopstate! == undefined – tasmaniski

Смежные вопросы