Trong khi thực hiện một phần mở rộng chrome nhỏ, tôi đã gặp phải vấn đề tương tự với một vấn đề bổ sung: Đôi khi, trang thay đổi nhưng không phải là URL.
Chẳng hạn, chỉ cần truy cập Trang chủ Facebook và nhấp vào nút 'Trang chủ'. Bạn sẽ tải lại trang nhưng URL sẽ không thay đổi (kiểu ứng dụng một trang).
99% thời gian, chúng tôi đang phát triển các trang web để chúng tôi có thể nhận các sự kiện đó từ các Khung như Angular, React, Vue, v.v.
NHƯNG , trong trường hợp tiện ích mở rộng của Chrome (trong Vanilla JS), tôi đã phải nghe một sự kiện sẽ kích hoạt cho mỗi "thay đổi trang", thường có thể bị bắt bởi URL đã thay đổi, nhưng đôi khi không.
Giải pháp tự chế của tôi là như sau:
listen(window.history.length);
var oldLength = -1;
function listen(currentLength) {
if (currentLength != oldLength) {
// Do your stuff here
}
oldLength = window.history.length;
setTimeout(function () {
listen(window.history.length);
}, 1000);
}
Về cơ bản, giải pháp leoneckert, được áp dụng cho lịch sử cửa sổ, sẽ thay đổi khi một trang thay đổi trong một ứng dụng trang.
Không phải khoa học tên lửa, nhưng giải pháp sạch nhất tôi tìm thấy, vì chúng tôi chỉ kiểm tra một đẳng thức nguyên ở đây, và không phải là các đối tượng lớn hơn hoặc toàn bộ DOM.