窗口.位置.href 更改时的事件

2022-08-30 04:21:16

我正在为一个网站编写一个Greasemonkey脚本,该脚本在某些时候会修改.location.href

当页面上发生更改时,我如何获得事件(通过或类似内容)?我还需要访问指向新的/修改的URL的文档的DOM。window.addEventListenerwindow.location.href

我见过其他涉及超时和轮询的解决方案,但如果可能的话,我想避免这种情况。


答案 1

我在我的扩展“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);
};


答案 2

popstate 事件

当活动历史记录条目更改时,将触发 popstate 事件。[...]popstate 事件只能通过执行浏览器操作来触发,例如单击后退按钮(或在 JavaScript 中调用 history.back() )

因此,在 使用 时侦听事件并发送事件应该足以对更改采取措施:popstatepopstatehistory.pushState()href

window.addEventListener('popstate', listener);

const pushUrl = (href) => {
  history.pushState({}, '', href);
  window.dispatchEvent(new Event('popstate'));
};