2011-07-11 11 views
1

スクリプトに問題があります。 チャットボックスにスマイリーを追加するためのgreasemonkeyスクリプトを作成しようとしています。Greasemonkey Hijack setInterval

私はchatboxのリフレッシュを検出し、スマイリーを交換する必要が

: chatboxは、ページ上の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

$('#chat').load(はajax呼び出しを行います。 AJAX呼び出しが返される前に、スマイリーを置き換えます。それはあなただけloadに完全な機能を追加することができますよりも、すべて一緒にちょうどrefreshChatを置き換えるために許容可能である場合:mycoolhijecfuncは追加機能がある

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

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

上記の 'load'の問題がなくても、まず' refreshChat'を呼び出してから 'doSmileyReplace'を呼び出すことはできませんか? –

+0

ええ、もちろん、私はそれを見てdidnt :( – Borntobewild

0

なぜあなたはこれを使用してはいけませんスマイリー。新しいメッセージがロードされているので、refreshChatを交換すると、うまく動作しません

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

病気はこれが正確に動作する方法について後で見ています:) – Borntobewild

0

TWproのソースにいじってからこれを得た、私はそれがうまく見て唖然とした、私はそれは通常、それを修正しました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

これはうまくいく、うまくいけばうまく土曜日にそれを試してみてください。 – Borntobewild