2009-12-18 4 views
26

У меня есть тяжелое приложение Ajax, которая может иметь URL, такие какКак определить изменение адресной строки с помощью JavaScript?

http://example.com/myApp/#page=1 

Когда пользователь манипулирует сайт, адресная строка может изменить что-то вроде

http://example.com/myApp/#page=5 

без перезагрузки страницы.

Моя проблема заключается в следующей последовательности:

  1. Пользователь закладка первого URL.
  2. Пользователь манипулирует приложением таким образом, что второй URL-адрес является текущим состоянием.
  3. щелкает пользователя на закладке в шаге 1.
  4. URL-адрес в адресной строке изменяется от http://example.com/myApp/#page=5 до http://example.com/myApp/#page=1, но я не знаю способа, чтобы обнаружить изменение произошло.

Если я обнаружу изменение, на нем будет действовать JavaScript.

+0

Мне любопытно, почему приложение было создано так? Я не вижу реальной необходимости изменения URL-адреса. –

+0

Он работает точно так же, как строка запроса, но не вызывает перезагрузку страницы браузером. Это было сделано, так что полезную нагрузку клиента не нужно извлекать и загружать каждый раз при изменении страницы. Полезная нагрузка не просто кэшируется, требует значительного времени инициализации JavaScript и не предоставляет клиенту безвкусный опыт. – JoshNaro

ответ

33

В HTML5 представлено событие hashchange, которое позволяет вам регистрироваться для уведомлений об изменениях URL-адреса без опроса для них с помощью таймера.

Это поддерживается всеми основными браузерами (Firefox 3.6, IE8, Chrome, другими браузерами на основе Webkit), но я все же настоятельно рекомендую использовать библиотеку, которая обрабатывает это событие для вас - то есть с помощью таймера в браузеры, не поддерживающие событие HTML5, и использование события иначе.

Дополнительную информацию о мероприятии см. https://developer.mozilla.org/en/dom/window.onhashchange и http://msdn.microsoft.com/en-us/library/cc288209%28VS.85%29.aspx.

+1

Теперь, если бы все пользователи IE6/7 обновлялись до> = IE8. Спасибо за обновление. – JoshNaro

+0

Спасибо. Этот ответ лучше, чем принятый ответ. –

+0

Я начал использовать плагин jqouery события hashChange - все работает гладко: D – JJschk

19

проверить текущий адрес, периодически используя SetTimeout/интервал:

var oldLocation = location.href; 
setInterval(function() { 
     if(location.href != oldLocation) { 
      // do your action 
      oldLocation = location.href 
     } 
    }, 1000); // check every second 
+1

Этот ответ правильный. Вы также должны рассмотреть возможность использования чего-то вроде компонента менеджера истории YUI, который делает это для вас в кросс-браузере. –

+0

Если я набираю новый адрес и нажимаю Enter, то текущая страница не сможет остановить это. – ZippyV

+2

Да, я надеялся, что там что-то скрыто. Использование интервала просто не кажется мне «правильным». Благодарю. – JoshNaro

5

Вы должны расширить объект местоположения, чтобы выставить событие, которое вы можете связывать.

т.е.

window.location.prototype.changed = function(e){}; 

(function() //create a scope so 'location' is not global 
{ 
    var location = window.location.href; 
    setInterval(function() 
    { 
     if(location != window.location.href) 
     { 
      location = window.location.href; 
      window.location.changed(location); 
     } 
    }, 1000); 
})(); 

window.location.changed = function(e) 
{ 
    console.log(e);//outputs http://newhref.com 
    //this is fired when the window changes location 
} 
+0

Нужен ли мне jquery для этого? – ATOzTOA

+1

На самом деле, поскольку он использует таймер, на самом деле он не дает никакого улучшения в отношении того, что выбрало выбранное решение. – jmd

+1

Не рекомендуется распространять глобальный объект, который уже предоставляет значение, которое вы можете посмотреть. – Trendy

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