Greasemonkey Hijack setInterval - PullRequest
       6

Greasemonkey Hijack setInterval

1 голос
/ 11 июля 2011

Я пытаюсь создать сценарий greasemonkey для добавления смайлов в чат.

Мне нужно обнаружить обновление чата и заменить смайлики: чат обновляется с помощью setInterval на странице:

setInterval(refreshChat, 7000);

Нормально Я бы так угнал это

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

Но по какой-то причине это не регистрируется?Я попытался установить собственный интервал в greasemonkey, чтобы он запускался на 5 миллисекунд позже, чем setinterval на самой странице, он работает, но выглядит не так.* Так, как мне поймать setInterval?

Ответы [ 3 ]

0 голосов
/ 12 июля 2011

почему вы не используете это:

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 голосов
/ 12 июля 2011

Замена 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);
    }
);

Обратите внимание, что задержка , вероятно, не нужна, я поставил ее на всякий случай.

0 голосов
/ 12 июля 2011

$('#chat').load( делает вызов ajax. Вы заменяете смайлики до возврата вызова AJAX. Если допустимо просто заменить refreshChat все вместе, тогда вы можете просто добавить полную функцию на load:

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