2012-03-01 13 views
1

私はスクリプトを実行しているWebサイトからAJAXリクエストが送信されるたびに、いくつかのコードを実行するための基本的なgreasemonkeyスクリプトを用意しています。なぜ私のajaxSuccess jQueryイベントがGreasemonkeyで起動されないのですか?

私はajaxSuccess jQueryハンドラを使用していますが、解雇されていません。グローバルフラグをfalseに設定してAJAX要求が送信されている可能性があります(http://docs.jquery.com/Ajax_Events参照)。グローバル化がfalseに設定されていてもこれを達成するための良い方法がありますか?

コード:

// ==UserScript== 
// @name   MyTestScript 
// @require  http://code.jquery.com/jquery-1.7.1.min.js 
// @namespace  NRA 
// @include  http://www.mysamplewebsite.com/view/* 
// ==/UserScript== 

$(document).ajaxSuccess(function(e, xhr) { 
    alert("ajax success hit!"); 
    // I will do my other handling here 
}); 

おかげ

答えて

2

のjQuery。

あなたはページの AJAXはそうあなたがいずれかの(A)unsafeWindowまたは(B)を使用することができます呼び出しをインターセプトし、あなたのスクリプトを挿入する必要があります。

は、(A)はunsafeWindowは次のようになります。

unsafeWindow.$(document).ajaxSuccess(function(e, xhr) { 
    alert("ajax success hit!"); 
    // I will do my other handling here 
}); 


(B)スクリプトインジェクションは、次のようになります。どちらの場合も、あなたは意識しなければならないこと

function scriptWrapper() { 

    //--- Intercept Ajax 
    $('body').ajaxSuccess (
     function (event, requestData) { 
      alert ("ajax success hit!"); 
      doStuffWithAjax (requestData); 
     } 
    ); 

    function doStuffWithAjax (requestData) { 
     console.log ('doStuffWithAjax: ', requestData.responseText); 
    } 

    //--- DO YOUR OTHER STUFF HERE. 
    console.log ('Doing stuff outside Ajax.'); 
} 

function addJS_Node (text, s_URL, funcToRun) { 
    var D         = document; 
    var scriptNode       = D.createElement ('script'); 
    scriptNode.type       = "text/javascript"; 
    if (text)  scriptNode.textContent = text; 
    if (s_URL)  scriptNode.src   = s_URL; 
    if (funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()'; 

    var targ = D.getElementsByTagName('head')[0] || D.body || D.documentElement; 
    targ.appendChild (scriptNode); 
} 

addJS_Node (null, null, scriptWrapper); 


なお、データページスコープからGMスコープに簡単には流れません - 2つを混合することに注意してください

サンドボックスでデータを送信するための回避策の1つはthis answerです。

+0

これらの方法の両方を試してみましたが、残念ながらそれらは機能しませんでした。私はどこが間違っているのか分からない。私は試してみることができる他のアイデアはありますか? –

+0

私はこれらのアプローチの両方を使用します。彼らはうまく動作します。あなたの質問を編集する(または新しい質問を開始する)**あなたのために**どのように動作しないかを** ** **ターゲットページ**にリンクする**を記述する。 Greasemonkeyスクリプトは常にページ固有のものです。 ...あなたのためにうまくいかないコードが上記の**正確に**でない場合は、使用している正確なコードを表示する新しい質問を開始しますが、ターゲットページへのリンクを忘れないでください。他のアイデアに関しては、AJAxの傍受はめったに最善のアプローチではありませんが、それはあなたが尋ねたものです。通常は、ターゲットページの特定のノードを監視する方が良いでしょう。そのために新しいQを投稿してください。 –

+0

よろしくお願いいたします。ありがとうございます。私は基本的にそれがCSSの変更であるかどうかを見るためにDIV要素を監視しようとしています。私はAJAXイベントが発生するたびにそれがタイマーなしでそれを行う唯一の方法のように思えることを確認しようとしています。 –

1

それはGreasemonkeyのサンドボックスとは何かを持っている可能性があります。

http://greasemonkey.mozdev.org/authoring.html

時には、あなたはコンテンツ文書でグローバル変数にアクセスすることになるでしょう。たとえば、コンテンツ文書では、呼び出す関数を定義しているとします。このような場合、unsafeWindow変数を使用してコンテンツドキュメントのグローバルスコープにアクセスできます。この変数のメンバーにアクセスすると、コンテンツスクリプトがスクリプトを検出し、選択した場合にスクリプトを検出する可能性があることに注意してください。

e.e.e. greasemonkeyスクリプト内のdocumentは実際のWebページのdocumentと同じではない可能性がありますので、unsafeWindow.documentなどを使用する必要があります。

それともjQueryのAJAXの方法は、単純に(XHRオブジェクトの特別なオーバーライドを必要とする)そのままのGreasemonkeyでは動作しません...

例えばhttp://www.monperrus.net/martin/greasemonkey+jquery+and+xmlhttprequest+together

http://ryangreenberg.com/archives/2010/03/greasemonkey_jquery.php

... Greasemonkeyの中にjQueryのAJAXは、次のようになります。あなたのuserscript runs in a separate environment from the page's jQuery

$.ajax({ 
    url: '/p/',// this even works for cross-domain requests by default 
    xhr: function(){return new GM_XHR();}, 
    type: 'POST', 
    success: function(val){ 
    .... 
    } 
}); 
関連する問題