2011-10-03 18 views
6

Per un progetto è necessario ottenere il codice sorgente della pagina Web di diversi altri domini. Ho provato seguente codice:Richieste cross-domain con jQuery

$('#container').load('http://google.com'); 

$.ajax({ 
    url: 'http://news.bbc.co.uk', 
    type: 'GET', 
    success: function(res) { 
     var headline = $(res.responseText).find('a.tsh').text(); 
     alert(headline); 
    } 
}); 

Ancora non sto ottenendo alcun risultato, ma solo una finestra di avviso vuota.

+0

Ecco un collegamento a una domanda simile con un paio di buoni suggerimenti (uno per me) http://stackoverflow.com/questions/7614420/ajax-jquery-javascript-access-a-page-in-an- dominio esterno –

risposta

11

Per impostazione predefinita tutti i browser limitano le richieste tra domini, è possibile aggirare questo utilizzando YQL come proxy. Vedere una guida qui: http://ajaxian.com/archives/using-yql-as-a-proxy-for-cross-domain-ajax

+0

James Padolsey ha anche un piccolo [plugin jQuery] (https://github.com/jamespadolsey/jQuery-Plugins) che usa YQL, se questo renderà le cose più facili :) – Mottie

4

Per motivi di sicurezza, gli script non sono in grado di accedere al contenuto da altri domini. Mozilla ha un lungo articolo su HTTP access control, ma la linea di fondo è che senza il sito web che aggiunge il supporto per le richieste tra domini, sei fregato.

4

Questo codice è perfettamente funzionante con l'aiuto di jQuery e YQL

$(document).ready(function(){ 
    var container = $('#target'); 
    $('.ajaxtrigger').click(function(){ 
    doAjax($(this).attr('href')); 
    return false; 
    }); 
    function doAjax(url){ 
    if(url.match('^http')){ 
     $.getJSON("http://query.yahooapis.com/v1/public/yql?"+ 
       "q=select%20*%20from%20html%20where%20url%3D%22"+ 
       encodeURIComponent("http://www.yahoo.com")+ 
       "%22&format=xml'&callback=?", 
     function(data){ 
      if(data.results[0]){ 
      var data = filterData(data.results[0]); 
      container.html(data); 

      } else { 
      var errormsg = '<p>Error: could not load the page.</p>'; 
      container.html(errormsg); 
      } 
     } 
    ); 
    } else { 
     $('#target').load(url); 
    } 
    } 
    function filterData(data){ 
    data = data.replace(/<?\/body[^>]*>/g,''); 
    data = data.replace(/[\r|\n]+/g,''); 
    data = data.replace(/<--[\S\s]*?-->/g,''); 
    data = data.replace(/<noscript[^>]*>[\S\s]*?<\/noscript>/g,''); 
    data = data.replace(/<script[^>]*>[\S\s]*?<\/script>/g,''); 
    data = data.replace(/<script.*\/>/,''); 
    return data; 
    } 
}); 
+0

Non possiamo creare qualcosa come questa funzionalità in javascript. Lo sto chiedendo perché in futuro se yahooapi limiterà questa funzione cosa accadrà? –

+0

@Nits Controllare questo .. http://www.frihost.com/forums/vt-32602.html non l'ho provato. A proposito, non pensi che usare jquery sia il metodo più semplice. :) –

-1

Trovato una soluzione in più per questo:

function getData(url){ 
    if(url.match('^http')){ 
    $.get(url, 
     function(data){ 
     process(data); 
     }//end function(data) 
    );//end get 
    } 
} 

Questa è davvero una bella modo più semplice per gestire le richieste tra domini. Poiché alcuni siti come www.imdb.com rifiutano le richieste YQL.

+1

Io non la penso così. Non fa differenza per la stessa politica di origine. Non funzionerà. La documentazione di jQuery stessa dice: "A causa delle restrizioni di sicurezza del browser, la maggior parte delle richieste" Ajax "sono soggette alla stessa politica di origine, la richiesta non può recuperare correttamente i dati da un dominio, sottodominio o protocollo diversi." Non capisco perché accetti la risposta sbagliata da te stesso ... –

+0

perché funziona in precedenza per me ... :) –

+0

Questo funziona solo perché la query non era il dominio incrociato in primo luogo, quindi non è una risposta valida alla domanda. –

1

La soluzione per il tuo caso è JSON con padding o JSONP.

Avrete bisogno di un elemento HTML che ha specificato per il suo attributo SRC un URL che restituisce JSON come questo:

<script type="text/javascript" src="http://differentDomain.com/RetrieveUser?UserId=1234"> 

È possibile cercare online per una spiegazione più approfondita, ma JSONP è sicuramente la tua soluzione per questo.

0

Effettuare le seguenti operazioni. 1: Aggiungi tipo di dati: jsonp allo script. 2: aggiungi un parametro "callback" all'URL 3: Crea una funzione javascript con lo stesso nome del valore param "callback". 4: L'uscita può essere ricevuta all'interno della funzione javascript.