在Greasemonkey用户脚本中监听github.com PJAX事件



我正在工作的用户脚本成功地在最初加载的GitHub页面上工作。虽然它需要重新应用,当GitHub与PJAX导航。

所以我必须以某种方式为PJAX更改设置侦听器并再次运行initialize函数。

由于Greasemonkey/Firefox安全策略,补丁unsafeWindow.history.pushState无法工作,它将抛出

错误:Permission denied to access object

我试着检查页面脚本和钩子到unsafeWindow.require('jquery')ajaxComplete事件,但是侦听器没有被触发(可能是因为相同的安全策略,但是错误控制台是空的)。

在PJAX容器元素上有比MutationObserver/DOMSubtreeModified更好的解决方案吗?

该脚本是针对Firefox/Greasemonkey,但如果它将适用于Chrome/Tampermonkey,这不会伤害。

为"pjax:end"事件添加一个监听器

$(document).on('pjax:end', ...)

FWIW在香草js工作的例子。正如您所看到的,还使用了MutationObserver,因为站点脚本有时会对动态容器更新两次(完全丢弃第一个),因此,在pjax:end处理程序完成后,附加MutationObserver处理程序来检测文件包装器的删除,在这种情况下,重复处理:

document.addEventListener('pjax:end', pageChangedHandler);
function pageChangedHandler() {
    .......................
    var ovr = document.querySelector('include-fragment.file-wrap');
    if (ovr) {
        new MutationObserver(function(mutations) {
            mutations.forEach(m => {
                var removed = m.removedNodes[0];
                if (removed && removed.matches('.file-wrap')) {
                    this.disconnect();
                    pageChangedHandler();
                }
            });
        }).observe(ovr.parentNode, {childList:true});
    }
}

相关内容

最新更新