我正在编写Tampermonkey脚本,并为hashchange
设置了一个侦听器。
在该侦听器内部,我调用了一个操作DOM的函数。问题在于该函数在页面完全加载之前被调用。
从一个部分切换到另一部分时,页面无法完全重新加载,因此on load
只能工作一次,这就是为什么我在听hashchange
而不是load
的原因。
window.addEventListener('hashchange', function (e) {
if (!/step=view&ID=/.test(location.hash)) {
//TODO clean up if leaving active trade
return
}
console.log('hash changed', e)
setup()
});
function setup() {
//wait for page load here
$('.myclass').after(<span>foo</span>);
}
我尝试在安装程序中添加on load
,但没有执行任何操作。
编辑:
在load
之外为setup
添加一个侦听器,如果要转到确切的链接,也只能工作一次,因此也不是选择。
答案 0 :(得分:1)
这是waitForKeyElements
,MutationObserver
或setTimeout
的工作
在几乎所有此类页面上,使用waitForKeyElements本身就足够了,不需要hashchange
侦听器:
// ==UserScript==
// @name _spans of foo
// @match *://YOUR_SERVER.COM/YOUR_PATH/*
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// @grant GM.getValue
// ==/UserScript==
//- The @grant directives are needed to restore the proper sandbox.
/* global $, waitForKeyElements */
waitForKeyElements (".myclass", setupMyClass);
function setupMyClass (jNode) {
jNode.after ('<span>foo</span>');
}
由于您添加的<span>foo</span>
显然在哈希更改后仍未保留,因此此技术可能就是您所需要的。
但是,如果该页面是重用.myclass
节点的页面 (¿却以某种方式破坏了您的范围?),而不是重新创建它们,则使用this other answer中显示的技术。
在这种情况下,MutationObserver 可能是更好的选择。但是,这取决于您的问题中未提供的详细信息。
另请参阅How do I reload a Greasemonkey script when AJAX changes the URL without reloading the page?。