Xử lý sự kiện thay đổi neo URL trong js


Câu trả lời:


126

Các Công cụ Tìm kiếm Tùy chỉnh của Google sử dụng bộ đếm thời gian để kiểm tra hàm băm so với giá trị trước đó, trong khi iframe con trên một miền riêng biệt cập nhật hàm băm vị trí của cha mẹ để chứa kích thước của nội dung tài liệu iframe. Khi bộ đếm thời gian bắt được thay đổi, cha mẹ có thể thay đổi kích thước iframe để khớp với nội dung để thanh cuộn không hiển thị.

Một cái gì đó như sau đạt được tương tự:

var storedHash = window.location.hash;
window.setInterval(function () {
    if (window.location.hash != storedHash) {
        storedHash = window.location.hash;
        hashChanged(storedHash);
    }
}, 100); // Google uses 100ms intervals I think, might be lower

Google Chrome 5, Safari 5, Opera 10.60 , Firefox 3.6Internet Explorer 8 đều hỗ trợ hashchangesự kiện:

if ("onhashchange" in window) // does the browser support the hashchange event?
    window.onhashchange = function () {
        hashChanged(window.location.hash);
    }

và đặt nó lại với nhau:

if ("onhashchange" in window) { // event supported?
    window.onhashchange = function () {
        hashChanged(window.location.hash);
    }
}
else { // event not supported:
    var storedHash = window.location.hash;
    window.setInterval(function () {
        if (window.location.hash != storedHash) {
            storedHash = window.location.hash;
            hashChanged(storedHash);
        }
    }, 100);
}

jQuery cũng có một plugin sẽ kiểm tra sự kiện hashchange và cung cấp plugin riêng nếu cần - http://benalman.com/projects/jquery-hashchange-plugin/ .

CHỈNH SỬA : Hỗ trợ trình duyệt được cập nhật (một lần nữa).


để hoàn chỉnh, hãy thêm var storedHash = window.location.hash;vào khối tóm tắt tổng hợp. Btw: Tôi nghĩ ngày nay nó được gọi là polyfill.
Frank Nocke,

1
Ngày nay, bạn có thể nghe hashChangetrên window stackoverflow.com/questions/6390341/how-to-detect-url-change
Timo Huovinen,

@AndyE Tôi đã đọc câu trả lời, tôi đã bỏ lỡ các lưu ý nhỏ, và tôi chưa bao giờ thấy sự kiện mà nhìn nhưhashChanged(storedHash);
Timo Huovinen

1
@TimoHuovinen:, hashChangedtrong trường hợp này, được dự định là một chức năng được triển khai bởi nhà phát triển bằng cách sử dụng mã này. Câu trả lời ở đây chỉ chứng minh cách người ta có thể giám sát băm để tìm những thay đổi khi onhashchangesự kiện không có sẵn và kết hợp các phương pháp tiếp cận dựa trên sự kiện và dựa trên bộ đếm thời gian để cung cấp một giải pháp phổ quát. Ý tôi là câu trả lời mà bạn đã liên kết hoàn toàn không thêm gì vào câu trả lời ở đây ;-). Chúng cung cấp thông tin cơ bản giống nhau, thậm chí cả liên kết đến plugin jQuery của Ben Alman. Sự khác biệt duy nhất là tôi đã cung cấp giải pháp JS thuần túy trong câu trả lời của mình.
Andy E

1
Tôi đang tìm kiếm một số bộ định tuyến JS nhẹ, nhưng điều này đã hoạt động tốt. Cũng loại bỏ tất cả phụ thuộc :)
gskema

4

Tôi khuyên bạn nên sử dụng addEventListenerthay vì ghi đè window.onhashchange, nếu không bạn sẽ chặn sự kiện đối với các plugin khác.

window.addEventListener('hashchange', function() {
...
})

Nhìn vào việc sử dụng trình duyệt toàn cầu ngày nay, không cần thiết phải dự phòng nữa.



2

Từ những gì tôi thấy trong các câu hỏi SO khác, giải pháp trình duyệt chéo duy nhất khả thi là bộ đếm thời gian. Kiểm tra câu hỏi này chẳng hạn.


1

(Chỉ dành cho bản ghi.) Sự kiện tổng hợp YUI3 "hashchange" ít nhiều thực hiện điều tương tự như câu trả lời được chấp nhận

YUI().use('history-hash', function (Y) {
  Y.on('hashchange', function (e) {
    // Handle hashchange events on the current window.
  }, Y.config.win);
});

0

Bạn có thể lấy thêm thông tin từ cái này

Các loại sự kiện đột biến

Mô-đun sự kiện đột biến được thiết kế để cho phép thông báo về bất kỳ thay đổi nào đối với cấu trúc của tài liệu, bao gồm các sửa đổi đính kèm và văn bản.


Đây là về các thay đổi DOM.
Raj
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.