2009-12-18 50 views
26

Tôi có một ứng dụng nặng Ajax mà có thể có một URL nhưLàm cách nào để phát hiện thay đổi trên thanh địa chỉ bằng JavaScript?

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

Khi người dùng thao tác trang web, thanh địa chỉ có thể thay đổi một cái gì đó giống như

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

mà không cần tải lại trang.

Vấn đề của tôi là trình tự sau đây:

  1. Một người dùng đánh dấu URL đầu tiên.
  2. Người dùng thao tác ứng dụng sao cho URL thứ hai là trạng thái hiện tại.
  3. Người dùng nhấp vào dấu trang được tạo ở bước 1.
  4. URL trong thanh địa chỉ thay đổi từ http://example.com/myApp/#page=5 thành http://example.com/myApp/#page=1, nhưng tôi không biết cách nào để phát hiện thay đổi đã xảy ra.

Nếu tôi phát hiện thay đổi, một số JavaScript sẽ hành động trên đó.

+0

Tôi tò mò, tại sao ứng dụng được thiết kế như thế này? Tôi không thể thấy bất kỳ nhu cầu thực tế nào về thay đổi URL. –

+0

Nó hoạt động giống như một chuỗi truy vấn, nhưng không làm cho trình duyệt tải lại trang. Điều này đã được thực hiện, sao cho tải trọng của máy khách không phải được lấy ra và nạp mỗi khi một trang được thay đổi. Tải trọng không phải là dễ dàng lưu trữ, đòi hỏi một thời gian khởi tạo JavaScript đáng kể, và sẽ không cung cấp cho khách hàng một trải nghiệm vô nghĩa. – JoshNaro

Trả lời

33

HTML5 giới thiệu sự kiện băm hashchange cho phép bạn đăng ký thông báo thay đổi băm url mà không cần bỏ phiếu cho họ bằng bộ hẹn giờ.

Nó được hỗ trợ bởi tất cả các trình duyệt chính (Firefox 3.6, IE8, Chrome, các trình duyệt dựa trên Webkit khác), nhưng tôi vẫn khuyên bạn nên sử dụng thư viện xử lý sự kiện cho bạn - tức là bằng cách sử dụng bộ hẹn giờ các trình duyệt không hỗ trợ sự kiện HTML5 và sử dụng sự kiện khác.

Để biết thêm thông tin về sự kiện, hãy xem https://developer.mozilla.org/en/dom/window.onhashchangehttp://msdn.microsoft.com/en-us/library/cc288209%28VS.85%29.aspx.

+1

Bây giờ, nếu chỉ những người dùng IE6/7 đó sẽ nâng cấp lên> = IE8. Cảm ơn các cập nhật. – JoshNaro

+0

Cảm ơn. Câu trả lời này tốt hơn câu trả lời được chấp nhận. –

+0

Tôi bắt đầu sử dụng plugin jqouery của sự kiện hashChange - mọi thứ diễn ra trôi chảy: D – JJschk

19

kiểm tra các địa chỉ hiện định kỳ sử dụng setTimeout/interval:

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

Câu trả lời này là chính xác. Bạn cũng nên xem xét sử dụng một cái gì đó giống như thành phần quản lý lịch sử YUI, mà nó cho bạn, trong một cách trình duyệt chéo. –

+0

Nếu tôi nhập địa chỉ mới và nhấn Enter, sẽ không có cách nào trang hiện tại có thể dừng lại. – ZippyV

+2

Vâng, tôi đã hy vọng có một sự kiện ẩn hoặc một cái gì đó. Sử dụng một khoảng thời gian không có vẻ "đúng" với tôi bằng cách nào đó. Cảm ơn. – JoshNaro

5

Bạn nên mở rộng đối tượng vị trí để lộ một sự kiện mà bạn có thể liên kết với.

ví dụ:

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

Tôi có cần jquery để làm việc này không? – ATOzTOA

+1

Trên thực tế, vì nó sử dụng bộ đếm thời gian, nó không thực sự mang lại bất kỳ nâng cao nào mà giải pháp đã chọn thực hiện – jmd

+1

Không phải là ý tưởng tốt nhất để mở rộng đối tượng toàn cầu đã phơi bày giá trị bạn có thể xem. – Trendy

Các vấn đề liên quan