2011-11-10 35 views
5

Có thể phát hiện hashchange chỉ khi thay đổi lịch sử trình duyệt (tức là nút Quay lại hoặc Chuyển tiếp) không?Javascript/jQuery phát hiện thay đổi băm chỉ trên nút quay lại/chuyển tiếp của trình duyệt nhấp vào

Tôi đã thấy sự kiện onbeforeunload, nhưng sự kiện này không bắn về biến đổi băm, như cửa sổ không dỡ.

Sự kiện băm trao đổi rõ ràng bất cứ lúc nào thay đổi băm. Mọi sửa chữa? Tốt hơn là không có plugin. Tôi đã thấy plugin lịch sử jQuery, nhưng tôi đang tìm giải pháp đơn giản nhất.

Cảm ơn sự giúp đỡ.

Trả lời

4

Hãy nhìn vào sự kiện window.onhashchange.

Tuy nhiên, hiện không được hỗ trợ trong tất cả các trình duyệt. Hãy xem BA jQuery Hash Change Plugin here. Nó có thể hoạt động, nếu bạn chọn sử dụng một plugin cuối cùng.

Tôi hy vọng điều này sẽ hữu ích!

0

Bạn không thể làm điều này bằng băm, hoặc thậm chí với API lịch sử HTML5. Không có sự kiện nào được liên kết độc quyền với người dùng nhấp vào nút quay lại hoặc chuyển tiếp. Bạn có thể cần một cách tiếp cận khác với vấn đề ban đầu, trừ khi cài đặt một số loại phần mở rộng hoặc như vậy trên máy khách là khả thi.

1

Tôi có đề xuất cho một cách tiếp cận khác. Cho phép nói rằng bạn có một liên kết mà đi đến một số trang (nhưng sử dụng AJAX không có làm mới). Khi liên kết đó được nhấp, bạn thay đổi băm thành bất kỳ thứ gì bạn thích. Bây giờ, khi người dùng nhấp vào nút quay lại, băm sẽ thay đổi về nội dung ban đầu trước khi người dùng nhấp vào liên kết ... nhưng những gì bạn có thể làm là kiểm tra xem sự kiện nhấp có được kích hoạt trên liên kết hoặc nút hay không bộ chọn/sự kiện bạn muốn kiểm tra). Nếu nó bị sa thải, bạn biết rằng yêu cầu đến từ một lần nhấp vào chính trang đó. Nếu không có sự kiện nào bị sa thải mà bạn đang kiểm tra, bạn biết rằng nhấp chuột đến từ nút quay lại hoặc tiến.

Một điều bạn có thể làm là thêm một hậu tố để băm khi nó thay đổi (từ nút quay lại hoặc chuyển tiếp dựa trên kiểm tra của bạn của bất kỳ sự kiện bắn). Vì vậy, nếu bạn đã có một băm của #pageTitle bạn sẽ biến nó thành #pageTitle_chrome để chỉ ra rằng băm đã được thay đổi từ nút quay lại hoặc nút chuyển tiếp.

Sau đó, khi bạn kiểm tra băm của mình, bạn có thể chỉ xem nó có chứa _chrome để phát hiện loại thay đổi băm nào không.

2

Những gì tôi nghĩ Chris đã hỏi là một cách cho sự kiện window.onhashchange làm việc chỉ khi bạn đang điều hướng trong lịch sử trình duyệt (Back/Forward) nút.

Trả lời = Không ... nhưng bạn có thể đặt một stat nếu trong hàm.
tôi sẽ làm điều này:

$('.nav').click(function() { //on the onclick event for your nav add a class 
    $(this).addClass('navClick'); // before you change the hash. 
    window.location.hash = 'state' + $(this).html(); 
}); 
function getLocationHash() { 
    return window.location.hash.substring(1); 
} 
window.onhashchange = function(e) { // if element does not exist with your 
    if ($('.navClick').length == 0) { // 'navClick' class then check hash 
    switch(getLocationHash()) { 
     case 'state1': 
     execute code block 1; 
     break; 
     case 'state2': 
     execute code block 2; 
     break; 
     default: 
     code to be executed if different from case 1 and 2; 
    } 
    } else {       // removes the class if it does 
    $('.navClick').removeClass('navClick'); 
    } 
}; 

tôi đã làm một cái gì đó tương tự trên my site

Đó là tất cả tự động thay đổi nội dung. Tôi vẫn sử dụng số window.location.hash để theo dõi trạng thái trang web. Nếu bạn điều hướng qua trang web và bắt đầu sử dụng các nút quay lại để điều hướng khi trang web có trong lịch sử, nó sẽ thay đổi trạng thái tự động nếu người dùng thực sự nhấp qua nav, thay vì phải tải lại trang sau đó. Nó chỉ kiểm tra băm nếu bạn đang sử dụng lịch sử để điều hướng.

6

Tôi đã đánh dấu cờ bất cứ khi nào điều hướng của tôi được kích hoạt và nếu cờ được đánh dấu, sự kiện hashChange sẽ bỏ qua nó, nếu không nó sẽ xử lý như thể đó là sự kiện quay lại/chuyển tiếp.

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