6

Chrome拡張機能でクロスドメインリクエストを実行する必要があります。私はメッセージパッシングを介してそれができることを知っていますが、私はむしろjQueryイディオムだけに固執したいと思います(したがって、私のjavascriptはとしても機能します<script src="">)。

私は通常のことをします:

$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?", function(data) {
  console.log(data);
});

しかし、エラーコンソールには次のように表示されます。

Uncaught ReferenceError: jsonp1271044791817 is not defined

jQueryはコールバック関数をドキュメントに正しく挿入していませんか?これを機能させるために何ができますか?

(コードをChromeコンソールに貼り付けると正常に機能しますが、拡張機能のpage.jsとして配置すると、問題が発生します。)

4

5 に答える 5

8

残念ながら、これらはどれも機能しなかったので、background.htmlを介して通信を行うことになりました。

background.html

<script src="http://code.jquery.com/jquery-1.4.2.js"></script>
<script>
function onRequest(request, sender, callback) {
  if (request.action == 'getJSON') {
    $.getJSON(request.url, callback);
  }
}

chrome.extension.onRequest.addListener(onRequest);
</script>

javascripts / page.js

chrome_getJSON = function(url, callback) {
  console.log("sending RPC");
  chrome.extension.sendRequest({action:'getJSON',url:url}, callback);
}

$(function(){
  // use chrome_getJSON instead of $.getJSON
});
于 2010-04-13T10:22:22.493 に答える
3

マニフェスト.jsonファイルで「api.flickr.com」を指定した場合、クロスドメインリクエストのスクリプトインジェクションスタイルであるJSONPコールバックを使用する必要はありません。

例えば:

"permissions": ["http://api.flickr.com"],

これはあなたのコードで美しく機能するはずです。JSONP作業が必要ないため、クエリ文字列パラメーター「&jsoncallback」を削除します。

現在のコードが機能しない理由は、コードがページDOMに挿入されているためです。コンテンツスクリプトはDOMにアクセスできますが、JavaScriptコンテキストにはアクセスできないため、コールバックを呼び出すメソッドはありません。

于 2010-04-12T11:55:30.487 に答える
2

jQueryコールバック関数がChrome拡張機能の「分離された世界」内で作成されており、応答が戻ってきたときにアクセスできないため、これは失敗するという印象があります。

http://code.google.com/chrome/extensions/content_scripts.html#execution-environment

さまざまな理由でPrototypeとjQueryを使用していますが、クイックフィックスは簡単に解析できるはずです。

// Add the callback function to the page
s = new Element('script').update("function boom(e){console.log(e);}");
$$('body')[0].insert(s);

// Tell jQuery which method to call in the response
function shrink_link(oldLink, callback){
    jQuery.ajax({
        type: "POST",
        url: "http://api.awe.sm/url.json",
        data: {
            v: 3,
            url: oldLink,
            key: "5c8b1a212434c2153c2f2c2f2c765a36140add243bf6eae876345f8fd11045d9",
            tool: "mKU7uN",
            channel: "twitter"
        },
        dataType: "jsonp",
        jsonpCallback: callback
    });
}

// And make it so.
shrink_link('http://www.google.com', "boom");

または、拡張XHR機能を使用してみることができます。

http://code.google.com/chrome/extensions/xhr.html

var xhr = new XMLHttpRequest();
xhr.open("GET", "http://api.example.com/data.json", true);
xhr.onreadystatechange = function() {
  if (xhr.readyState == 4) {
    // JSON.parse does not evaluate the attacker's scripts.
    var resp = JSON.parse(xhr.responseText);
  }
}
xhr.send();
于 2011-12-06T01:30:09.810 に答える
0

構文は少しずれています。callback(ビットの必要はありません。これは完璧に機能します。このStackOverflowページ(jQueryを含む)のChromeのjavascriptコンソールでテスト済み:

$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?", function(data) {
  console.log(data);
});
于 2010-04-12T04:25:29.777 に答える
0

ご存知のように、GoogleChromeは現時点では便利なGM_関数をサポートしていません。

そのため、サンドボックスのさまざまな制限により、クロスサイトAJAXリクエストを実行することはできません( JamesPadolseyのCrossDomain Request Scriptなどの優れたツールを使用している場合でも)

私のGreasemonkeyスクリプトがChromeでいつ更新されたかをユーザーが知る方法が必要でした(Chromeもそれを行わないため...)。私はここに文書化されている(そして私のLighthouse ++スクリプトで使用されている)解決策を思いついたので、スクリプトのバージョンチェックをしたい人のために読む価値があります:

http://blog.bandit.co.nz/post/1048347342/version-check-chrome-greasemonkey-script

于 2010-09-01T16:27:21.467 に答える