2010-04-12 16 views
6

Devo eseguire una richiesta tra domini in un'estensione di Chrome. So che posso farlo via message passing ma preferirei attenermi solo agli idiomi di jQuery (quindi il mio javascript può funzionare anche come <script src="">).Utilizzo di jQuery.getJSON nell'estensione di Chrome

faccio la normale:

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

ma alla console degli errori che vedo:

Uncaught ReferenceError: jsonp1271044791817 is not defined 

Is jQuery non inserendo la funzione di callback correttamente nel documento? Cosa posso fare per far funzionare questo?

(Se io incollare il codice in una console di cromo, funziona benissimo, ma se metto come le page.js in estensione è quando compare il problema.)

risposta

8

Ahimè, nessuno di questi ha funzionato, quindi ho finito per fare la comunicazione tramite 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> 

javascript/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 
}); 
+0

Grazie - risolto il mio problema, troppo :) –

+0

Quando faccio questo, Ho ricevuto questo errore: 'Errore porta: impossibile stabilire una connessione. La fine di ricezione non esiste. –

+0

Che cosa includo all'interno della funzione se volessi visualizzare un elemento dalla matrice JSON? – wishman

0

La sintassi è un po 'fuori. Non è necessario il bit callback(. Funziona perfettamente. Testato nella console JavaScript di Chrome in questa pagina StackOverflow (che include jQuery):

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

fisso la sintassi (copia e incolla sorry). Funziona bene nella console, ma non quando viene eseguito come 'page.js' di un'estensione –

+0

' page.js' è uno script di contenuto? –

+0

sì, lo è. è un problema? –

3

Se si specifica "api.flickr.com" nel file manifest.json non sarà necessario utilizzare il callback JSONP, inserimento di script stile di richiesta cross domain.

Ad esempio:

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

Questo dovrebbe funzionare in modo bello in voi codice. Vorrei rimuovere il parametro querystring "& jsoncallback" in quanto non è necessario il lavoro JSONP.

Il motivo per cui il codice attuale non funziona è il codice sta iniettando nelle pagine DOM, gli script contenuti hanno accesso al DOM, ma non ha accesso a javascript contesto, quindi non c'è alcun metodo per chiamare il callback.

+0

Questa è la risposta corretta per chiunque visiti. http://developer.chrome.com/extensions/declare_permissions A causa di http://developer.chrome.com/apps/contentSecurityPolicy – BradLaney

0

Come molti di voi sapranno, Google Chrome non supporta alcuna delle funzioni GM_ a portata di mano al momento.

Come tale, essa è impossibile fare trasversali richieste sito AJAX a causa di varie restrizioni sandbox (anche utilizzando strumenti di grande come James Padolsey's Cross Domain Request Script)

avevo bisogno di un modo per gli utenti di sapere quando il mio script Greasemonkey era stato aggiornato in Chrome (poiché Chrome non lo fa neanche ...).Mi si avvicinò con una soluzione che è documentato qui (e in uso nel mio script Lighthouse++) e merita una lettura per quelli di voi che vogliono la versione verificare i propri script:

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

2

mie impressioni che questo non riesce a causa la funzione di callback jQuery è stato creato all'interno del 'mondo isolato' dell'estensione Chrome e non è accessibile quando la risposta ritorna:

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

sto usando Prototype e jQuery per vari motivi, ma la mia soluzione rapida dovrebbe essere facile da pa RSE:

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

In alternativa si può provare a utilizzare la funzionalità XHR estensione:

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

questo ha funzionato per me per aver chiamato JSONP all'interno di uno script TamperMonkey. Grazie! –

Problemi correlati