2011-10-03 207 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函數內接收輸出。