![](/img/trans.png)
[英]How do I reload a Greasemonkey script when AJAX changes the URL without reloading the page?
[英]How can I run a Greasemonkey script when page changed via ajax?
我有那个脚本:
// ==UserScript==
// @name example
// @include http://xxx*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js
// ==/UserScript==
var findElem = function(elems, text) {
for (var i = 0; i < elems.length; i++) {
if (elems[i].textContent == text) {
return elems[i];
} else {
var result = findElem(elems[i].children, text);
if (result != undefined) {
return result;
}
}
}
return;
}
switch (document.getElementById('my_id').value) {
case "1":
findElem(document.documentElement.children, "blabla1").click();
break;
case "2":
findElem(document.documentElement.children, "blabla2").click();
break;
case "3":
findElem(document.documentElement.children, "blabla3").click();
break;
case "4":
findElem(document.documentElement.children, "blabla4").click();
break;
default:
break;
}
它工作正常,但它只适用于主页面加载。 我希望通过ajax更改页面时运行此命令。 我怎样才能做到这一点?
还请举例说明你的答案。 我是新手 我不知道如何在你的答案中使用东西。
由于浏览器的环境是事件驱动的,因此您必须设置计时器,绑定到您要查找的更新周围发生的某些事件。 或者,您可以包装更新的函数并在后挂钩中调用您的代码。 显然,您需要将用户脚本代码包装在某个函数中以便重用。
这是一个使用setInterval
设置计时器的示例(脚本顶部仍然相同):
setInterval(function(){
switch (document.getElementById('my_id').value) {
case "1":
findElem(document.documentElement.children, "blabla1").click();
break;
case "2":
findElem(document.documentElement.children, "blabla2").click();
break;
case "3":
findElem(document.documentElement.children, "blabla3").click();
break;
case "4":
findElem(document.documentElement.children, "blabla4").click();
break;
default:
break;
}
}, 1000) // if AJAX updates happen with some specific interval, set same number here to minimize useless work
您可以使用变异事件处理程序在每次更改html时触发您的函数。 但是,browsersupport不是最好的;)
如果你的主机使用jQuery,你可以使用ajaxSuccess或ajaxComplete :
function mainCode(){
// your script logic here ...
switch (document.getElementById('my_id').value) {
// truncated to save space
}
}
$(document).ready(function(){
mainCode();
unsafeWindow.$(document).ajaxSuccess(function(e, xhr, opt) {
mainCode();
});
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.