我正在为一个站点编写 Greasemonkey 脚本,该脚本在某些时候会修改location.href
.
window.addEventListener
当window.location.href
页面发生变化时,如何获得事件(通过或类似的方式)?我还需要访问指向新/修改过的 url 的文档的 DOM。
我已经看到其他涉及超时和轮询的解决方案,但如果可能的话,我想避免这种情况。
我正在为一个站点编写 Greasemonkey 脚本,该脚本在某些时候会修改location.href
.
window.addEventListener
当window.location.href
页面发生变化时,如何获得事件(通过或类似的方式)?我还需要访问指向新/修改过的 url 的文档的 DOM。
我已经看到其他涉及超时和轮询的解决方案,但如果可能的话,我想避免这种情况。
我在我的扩展程序“Grab Any Media”中使用了这个脚本并且工作正常(比如youtube案例)
var oldHref = document.location.href;
window.onload = function() {
var bodyList = document.querySelector("body")
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (oldHref != document.location.href) {
oldHref = document.location.href;
/* Changed ! your code here */
}
});
});
var config = {
childList: true,
subtree: true
};
observer.observe(bodyList, config);
};
当活动历史记录条目更改时,会触发 popstate 事件。[...] popstate 事件仅通过执行浏览器操作触发,例如单击后退按钮(或在 JavaScript 中调用 history.back())
因此,在使用时监听popstate
事件并发送popstate
事件history.pushState()
应该足以对href
更改采取行动:
window.addEventListener('popstate', listener);
const pushUrl = (href) => {
history.pushState({}, '', href);
window.dispatchEvent(new Event('popstate'));
};
您无法避免轮询,没有任何用于 href 更改的事件。
无论如何,如果你不过度使用间隔是很轻的。如果您担心,每 50 毫秒左右检查一次 href 不会对性能产生任何显着影响。
onhashchange
您可以使用
一个默认事件。
并且可以这样使用:
function locationHashChanged( e ) {
console.log( location.hash );
console.log( e.oldURL, e.newURL );
if ( location.hash === "#pageX" ) {
pageX();
}
}
window.onhashchange = locationHashChanged;
如果浏览器不支持oldURL
,newURL
你可以这样绑定:
//let this snippet run before your hashChange event binding code
if( !window.HashChangeEvent )( function() {
let lastURL = document.URL;
window.addEventListener( "hashchange", function( event ) {
Object.defineProperty( event, "oldURL", { enumerable: true, configurable: true, value: lastURL } );
Object.defineProperty( event, "newURL", { enumerable: true, configurable: true, value: document.URL } );
lastURL = document.URL;
} );
} () );
通过Jquery,试试
$(window).on('beforeunload', function () {
//your code goes here on location change
});
通过使用javascript:
window.addEventListener("beforeunload", function (event) {
//your code goes here on location change
});
参考文档:https : //developer.mozilla.org/en-US/docs/Web/Events/beforeunload