我正在工作的用户脚本成功地在最初加载的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});
}
}