我正在尝试构建一个用于在聊天室中添加表情符号的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'); }
那么如何捕获setInterval?
答案 0 :(得分:0)
$('#chat').load(
进行ajax调用。您将在AJAX调用返回之前替换表情符号。如果仅将refreshChat
替换为load
是可以接受的,只需在$('#chat').load('chat.php?cachebuster='+randomnumber+'&method=chat',doSmileyReplace);
上添加完整的功能:
{{1}}
答案 1 :(得分: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);
}
};
答案 2 :(得分: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);
}
);
请注意,延迟可能没有必要,我把它放在那里以防万一。