2011-10-03 157 views
6

对于一个项目,我需要获取不同其他域的网页的源代码。 我曾尝试下面的代码:使用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); 
    } 
}); 

不过我没有得到任何结果,而只是一个空白的警告框。

+0

下面是一个类似问题的链接,带有一对夫妇的好建议(我一个人的) http://stackoverflow.com/questions/7614420/ajax-jquery-javascript-access-a-page-in-an-外部域名 –

回答

4

出于安全原因,脚本无法访问来自其他域的内容。 Mozilla有一篇关于HTTP access control的长篇文章,但底线是如果没有网站本身添加对跨域请求的支持,那么你就搞砸了。

4

该代码与jQuery和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

我们不能创建类似这个功能在JavaScript中。我问这是因为未来如果yahooapi限制这个功能会发生什么? –

+0

@Nits 检查此.. http://www.frihost.com/forums/vt-32602.html 我没有试过这个。顺便说一句,你不认为使用jQuery是最简单的方法。 :) –

-1

的帮助下发现多了一个解决方案,这个完美的工作:

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

这真是一个漂亮的更简单的方式来处理跨域请求。由于www.imdb.com等一些网站拒绝YQL请求。

+1

我不这么认为。它对同一来源政策没有任何影响。它不会工作。 jQuery本身的文档说:“由于浏览器安全限制,大多数”Ajax“请求都受到相同的源策略的限制;请求无法成功从不同的域,子域或协议中检索数据。”我不明白你为什么接受自己的错误答案... –

+0

因为它正在为我工​​作更早... :) –

+0

这只适用于因为查询不是跨域的第一个地方,所以它不是对问题的有效答复。 –

1

您的案例的解决方案是带填充或JSONP的JSON。

您将需要为它的src指定的HTML元素属性返回JSON像这样的URL:

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

您可以更深入的解释在网上搜索,但JSONP是绝对是你的解决方案。

0

执行以下步骤。 1:将数据类型:jsonp添加到脚本。 2:为url添加一个“回调”参数 3:创建一个名称与“callback”参数值相同的javascript函数。 4:可以在javascript函数内接收输出。