繁体   English   中英

当通过ajax更改页面时,如何运行Greasemonkey脚本?

[英]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时触发您的函数。 但是,bro​​wsersupport不是最好的;)

如果你的主机使用jQuery,你可以使用ajaxSuccessajaxComplete

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM