2011-10-03 19 views
6

Para un proyecto, necesito obtener el código fuente de la página web de otros dominios diferentes. He tratado siguiente código:Solicitudes de dominios cruzados 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); 
    } 
}); 

Aún no estoy recibiendo ningún resultado pero sólo un cuadro de alerta en blanco.

+0

Aquí hay un enlace a una pregunta similar con un par de buenas sugerencias (una por mí) http://stackoverflow.com/questions/7614420/ajax-jquery-javascript-access-a-page-in-an- dominio externo –

Respuesta

11

De forma predeterminada, todos los navegadores restringen las solicitudes entre dominios, puede evitar esto utilizando YQL como proxy. Vea una guía aquí: http://ajaxian.com/archives/using-yql-as-a-proxy-for-cross-domain-ajax

+0

James Padolsey también tiene un pequeño [plugin jQuery] (https://github.com/jamespadolsey/jQuery-Plugins) que usa YQL, si eso hace las cosas más fáciles :) – Mottie

4

Por motivos de seguridad, los scripts no pueden acceder al contenido de otros dominios. Mozilla tiene un largo artículo acerca de HTTP access control, pero la conclusión es que sin el sitio web ellos mismos agregando soporte para solicitudes entre dominios, estás jodido.

4

Este código está funcionando perfectamente con la ayuda de jQuery y 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

¿No podemos crear algo así como esta funcionalidad en javascript. Estoy preguntando esto porque en el futuro si yahooapi restringe esta función, ¿qué pasará? –

+0

@Nits Compruebe esto ... http://www.frihost.com/forums/vt-32602.html No probé esto. Por cierto, ¿no crees que usar jquery es el método más fácil? :) –

-1

encontrado una solución más para esto:

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

Esto es realmente una muy Manera más fácil de manejar solicitudes entre dominios. Como algunos sitios como www.imdb.com rechazan las solicitudes YQL.

+1

No lo creo. No hace ninguna diferencia a la misma política de origen. No funcionará La propia documentación de jQuery lo dice: "Debido a las restricciones de seguridad del navegador, la mayoría de las solicitudes" Ajax "están sujetas a la misma política de origen, la solicitud no puede recuperar datos de un dominio, subdominio o protocolo diferente". No entiendo por qué aceptas esa respuesta incorrecta de ti ... –

+0

porque está trabajando antes para mí ... :) –

+0

Esto solo funciona porque la consulta no era de dominio cruzado en primer lugar, por lo que no es una respuesta válida a la pregunta. –

1

La solución para su caso es JSON con relleno o JSONP.

Tendrá un elemento HTML que se especifica por su atributo src una URL que devuelve JSON como esto:

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

puede buscar en línea para una explicación más en profundidad, pero JSONP es Definitivamente tu solución para esto.

0

Realice los siguientes pasos. 1: Agregar tipo de datos: jsonp a la secuencia de comandos. 2: Agregue un parámetro de "devolución de llamada" a la url 3: Cree una función de javascript con nombre igual que el valor de param de "devolución de llamada". 4: la salida se puede recibir dentro de la función javascript.

Cuestiones relacionadas