我正在编写Greasemonkey用户脚本,并希望页面完全完成加载后才能执行特定代码,因为它返回了我要显示的div计数。
问题是,在加载所有内容之前,该特定页面有时会花费一些时间。
我已经尝试过,文档$(function() { });
和$(window).load(function(){ });
包装器。但是,似乎没有一个对我有用,尽管我可能错误地应用了它们。
我所能做的就是使用一个有效的setTimeout(function() { }, 600);
,尽管它并不总是可靠的。
在Greasemonkey中使用什么最好的技术来确保在页面完成加载后将执行特定的代码?
Greasemonkey(通常)没有jQuery。所以常用的方法是使用
window.addEventListener('load', function() {
// your code here
}, false);
在用户脚本中]
这是一个普遍的问题,正如您已经说过的那样,仅等待页面加载是不够的-因为AJAX可以并且确实会在很长一段时间后改变事情。
从Greasemonkey 3.6开始(2015年11月20日),元数据键// ==UserScript==
// @name _Wait for delayed or AJAX page load
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a major design
change introduced in GM 1.0.
It restores the sandbox.
*/
waitForKeyElements ("YOUR_jQUERY_SELECTOR", actionFunction);
function actionFunction (jNode) {
//-- DO WHAT YOU WANT TO THE TARGETED ELEMENTS HERE.
jNode.css ("background", "yellow"); // example
}
支持新值@run-at
。只需将其放在您的Greasemonkey脚本的元数据块中:
在documentation中包装我的脚本对我来说从来没有失败。
waitForKeyElements("elementtowaitfor", functiontocall)
很好,但是我想为AJAX问题提供另一种解决方案,它更现代,更优雅。由于他的脚本还使用Brock's answer进行定期检查(300毫秒),因此无法立即响应。
如果要操纵节点,例如获得节点的价值或更改样式,可以使用此功能等待这些节点
要检测XHR是否完成了在网页中的加载,它将触发某些功能。我是从icourse163_enhance中获得的,它确实有效。