2011-12-13 14 views
12

Sto facendo una richiesta JSONP in un'estensione chrome (script di contenuto). Tutto funziona molto bene quando sono in esecuzione come pagina web -caricando il file HTML nel mio browser-, ma quando lo carico come estensione chrome, la funzione di callback jsonp creata da jquery non sembra esistere quando il server dà la sua risposta .Richiesta JSONP con estensione chrome, la funzione callback non esiste?

mia console dice:

Uncaught ReferenceError: jQuery17105683612572029233_1323808231542 is not defined 

Ecco la mia richiesta ajax:

$.ajax({ 
    url: 'http://example.com', 
    data: 
    { 
     imgUrl: this.href, 
     returnString:true 
    }, 
    dataType: "jsonp", 
    success: function(msg){ 
     newNode.src = msg.data; 
    }, 
    error: function(msg){ 
     console.log(msg.data); 
    } 
}) 
+0

Per chiarire, che hai provato al di fuori di un'estensione Chrome senza problemi? Sei sicuro di avere le autorizzazioni host per l'URL che stai richiedendo? –

+0

Corretto, quando non è un'estensione di Chrome - basta aprire una pagina web con i file javascript inclusi - funziona perfettamente. Probabilmente dovrei dire che questo è uno script di contenuto. –

+0

Ho appena verificato il file manifest.json e sembra corretto. C'è un modo per testare definitivamente? –

risposta

23

Il problema è che la risposta JSONP viene catturato dalla pagina effettiva, al di fuori del codice JavaScript in modalità sandbox che lo script dei contenuti di Chrome limita anche te.

jQuery17105683612572029233_1323808231542 è il nome della funzione di richiamata che la chiamata jQuery JSONP ha generato dinamicamente per la chiamata specifica. Questa funzione è in fase di definizione nell'area di sandbox a cui lo script di contenuto ha accesso.

L'unica soluzione di cui sono a conoscenza, che ha funzionato per me, è effettuare una chiamata XHR dallo script di contenuto. A partire da Chrome 13 puoi effettuare chiamate XHR tra domini diversi dagli script di contenuto (piuttosto interessanti). Nel file manifest è necessario aggiungere l'URL esterno per i permessi:

{ 
    ... 
    "permissions": [ 
     "http://example.com" 
    ] 
} 

si può quindi effettuare la chiamata XHR in questo modo:

var xhr = new XMLHttpRequest(); 
xhr.open("GET", "http://example.com/", true); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4) { 
     //handle the xhr response here 
    } 
} 
xhr.send(); 

Sarà necessario fare alcune delle cose che jQuery stava facendo automaticamente per te, come codificare i valori dell'oggetto dati nell'URL XHR (nel tuo caso "imrUrl" e "returnString") così come convertire la risposta da xhr.responeText o xhr.reponseXML in un oggetto.

Lo svantaggio di questo approccio è che se condividi questo codice tra un'estensione di Chrome e qualcos'altro (come un bookmarklet) ora devi avere una logica diversa per il caso d'uso di Chrome.

Per maggiori informazioni visita: Chrome Extension XHR

+4

Ottima spiegazione. Aggiungerò anche che una volta impostate le autorizzazioni nel manifest, puoi tornare a utilizzare jQuery AJAX con JSON anziché JSONP e funzionerà. – ron

+0

Suggerirei di aggiungere il contenuto del commento di @ ron al corpo della risposta. –

Problemi correlati