首页 文章

Greasemonkey劫持setInterval

提问于
浏览
1

我正在尝试构建一个用于在聊天室中添加表情符号的greasemonkey脚本 .

我需要检测聊天框的刷新并替换表情符号:聊天框刷新页面上的setInterval:

setInterval(refreshChat, 7000);

Normaly我会用这种方式劫持这个

var refreshChat = unsafeWindow.refreshChat;
unsafeWindow.refreshChat = function() {
    doSmileyReplace();
    return refreshChat();
};

但由于某种原因,这不会注册?我尝试在greasemonkey中设置我自己的间隔,然后运行5毫秒,然后是页面本身的setinterval,它可以工作,但看起来不对 .

refreshChat函数没什么特别的

function refreshChat() {
    var randomnumber=Math.floor(Math.random()*500000);
    $('#chat').load('chat.php?cachebuster='+randomnumber+'&method=chat');
}

So how do I catch the setInterval?

3 回答

  • 0

    $('#chat').load( 进行ajax调用 . 您将在AJAX调用返回之前替换表情符号 . 如果可以一起替换 refreshChat ,那么只需在 load 上添加一个完整的函数:

    $('#chat').load('chat.php?cachebuster='+randomnumber+'&method=chat',doSmileyReplace);
    
  • 0

    为什么不用这个:

    var script = refreshChat.toString();
    script.replace('&method=chat');','&method=chat');mycoolhijecfunc();')
    refreshChat = eval('('+script+')')
    

    其中 mycoolhijecfunc 是添加表情符号的函数 .

    得到这个来自TWpro的来源,我惊呆了看到它的工作,我通常修改它是:

    var modify_function = function (obj, method, options) {
        try {
            //if (console && console.log) console.log("TW Pro: Modifying method " + method);
            if (!obj || !obj[method]) return;
            var func = obj[method].toString();
            for (var i=3; i<arguments.length; i++) {
                if (arguments[i] && arguments[i].length > 1) {
                    var replacement = arguments[i][1],
                        arg_opts = arguments[i][2] || {};
                    if (typeof replacement == "function") {
                        replacement = "(" + replacement.toString() + ")()";
                    }
                    if (arg_opts.catch_errors) {
                        replacement = ";try{" + replacement + "}catch(twpro_exception){window.twpro_debug.log(twpro_exception,'method " + method + "')}";
                    }
                    if (arg_opts.escape) {
                        replacement = replacement.replace(/\$/g, "$$$$");
                    }
                    switch (arg_opts.pos) {
                        case "L":
                            replacement += "$&";
                            break;
                        case "R":
                            replacement = "$&" + replacement;
                            break;
                    }
                    func = func.replace(arguments[i][0], replacement);
                }
            }
            //self.fncs.push('"'+method+'"', func);
            obj[method] = eval("(" + func + ")");
            if (options && options.bind) {
                obj[method] = obj[method].bind(options.bind);
            }
        } catch (e) {
            twpro_debug.log("TW Pro failed to modify function " + method + ": " + e);
        }
    };
    
  • 0

    替换 refreshChat 将无法正常工作,因为新消息是由AJAX异步加载的 .

    幸运的是,该页面使用了jQuery,因此触发AJAX很容易 . 你可以这样做:

    /*--- Evesdrop on the page's AJAX calls and rewrite smilies after 
        a short delay.
    */
    unsafeWindow.$('body').ajaxSuccess (
        function (event, requestData) {
            setTimeout (function() { doSmileyReplace (); }, 111);
        }
    );
    

    请注意,延迟可能没有必要,我把它放在那里以防万一 .

相关问题