2010-04-12 12 views
6

Bir krom uzantısında etki alanları arası bir etki alanı oluşturmam gerekiyor. message passing aracılığıyla yapabileceğimi biliyorum ama jQuery deyimlerine yapışmayı tercih ederim (javascript'im <script src=""> olarak da çalışabilir). Chrome Uzantısında jQuery.getJSON Kullanımı

Normal yapın:

Uncaught ReferenceError: jsonp1271044791817 is not defined 

jQuery belgeye doğru geri çağırma işlevi ekleyerek değil mi:

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

ama tek gördüğüm konsolda hata

? Bunu yapmak için ne yapabilirim?

(Ben krom konsola yapıştırın, bu iyi çalışıyor, ancak bir uzantısı page.js olarak koyarsanız sorun belirdiğinde budur.)

cevap

8

Ne yazık ki bunlardan hiçbiri işe yaramadı, bu yüzden background.html aracılığıyla iletişimi bitirdim. bileceksiniz ait

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/

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

$(function(){ 
    // use chrome_getJSON instead of $.getJSON 
}); 
+0

Teşekkür http://developer.chrome.com/extensions/declare_permissions - benim de sorun çözüldü :) –

+0

Bunu yaptığınızda, Bu hatayı aldım: Bağlantı hatası: Bağlantı kurulamadı. Alıcı sonu mevcut değil. ' –

+0

JSON Dizisinden bir öğe görüntülemek istediğimde, işlevin içine ne ekleyebilirim? – wishman

0

sözdizimi biraz kapalı. callback( bitine gerek yoktur. Bu kusursuz çalışıyor. (JQuery dahil) bu StackOverflow sayfada Chrome JavaScript konsolda test edilmiştir: Eğer JSONP geri arama kullanmaya gerek olmayacak senin manifest.json dosyasında "api.flickr.com" belirtirseniz

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

sözdizimi (kopyalayıp üzgün yapıştır) düzeltildi. Konsolda gayet iyi çalışıyor, ancak bir uzantı –

+0

'page.js' olan' page.js' olarak çalıştırıldığında bir içerik betiği var mı? –

+0

evet, öyle. Bu bir problem mi? –

3

, script enjeksiyon çapraz etki alanı isteği stili. Örneğin

:

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

Bu size kodunda güzelce çalışmalıdır. JSONP çalışması gerekmediğinden "& jsoncallback" querystring parametresini kaldırırdım.

Geçerli kodunuzun çalışmadığının nedeni, kodunuzun DOM sayfaları içine enjekte edilmesidir, içerik komut dosyalarının DOM'a erişimi vardır, ancak javascript içeriğine erişim yoktur, dolayısıyla geri aramada arama yöntemi yoktur.

+0

Bu, herkesin görüntülediği doğru cevaptır. Çünkü http://developer.chrome.com/apps/contentSecurityPolicy – BradLaney

0

Birçok page.js Google Chrome şu anda kullanışlı GM_ işlevlerin herhangi desteklemez. Bu itibarla

, bunun nedeni benim Greasemonkey komut güncellenen vardı kullanıcıların bilmesi Bir yol gerekli

çeşitli sanal kısıtlamalara (hatta James Padolsey's Cross Domain Request Script gibi büyük araçları kullanarak) çapraz sitesi AJAX isteklerini yapmak imkansız olduğunu Chrome'da (Chrome bunu yapmadığından ...).

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

2

Benim gösterim bunu bu çünkü başarısız olduğunu: Ben senin komut kontrol sürümüne isteyen o sizin için burada (ve benim Lighthouse++ komut kullanılıyor) belgelenmiştir bir çözüm ve değer okuma ile geldi

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

ben çeşitli nedenlerle prototip ve jQuery kullanıyorum

ama benim hızlı bir düzeltme: tepkisi geri geldiğinde jQuery geri arama işlevi Chrome uzantısının 'izole dünya' içinde oluşturulan ve erişilemez ediliyor pa için kolay olmalı ersin:

// 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"); 

Alternatif uzatma XHR yeteneği kullanmayı deneyebilirsiniz:

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(); 
+0

bu, bir TamperMonkey komut dosyasında JSONP'yi çağırdığım için çalıştı. Teşekkürler! –