2010-03-09 248 views
8

我剛剛開始學習jQuery和AJAX。我可以通過jQuery.load()將本地頁面(在我的磁盤上)加載到div中,但外部網站似乎不起作用。我甚至用wireshark來檢查數據是否從服務器發送(它是)。示例代碼如下:我可以通過AJAX從外部頁面加載數據嗎?

<html> 
<head> 
    <script src='jquery-1.4.2.min.js'></script> 
    <script> 
     $(document).ready(function() { 
      // $('#test').load('localpage.htm'); works! 
      $('#test').load('http://www.google.com/'); // does not work! 
     }); 
    </script> 
</head> 
<body> 
<div id='test'></div> 
</body> 
</html> 

是否有可能在第一時間做到這一點?如果是這樣,怎麼樣?

+0

與回答類似問題http://stackoverflow.com/questions/ 2217695 /試圖使用JSON與jQuery的/ 2217707#2217707 – yanoo 2010-03-09 14:18:50

回答

0

您無法從其他域調用Ajax。請檢查JSON技術

+0

JSON不會幫助你在這裏,因爲它只是一個格式,例如阿賈克斯電話。同樣的原產地政策也在這裏發生。 – 2010-03-09 14:21:24

+0

他可能指的是JSONP。 – SLaks 2010-03-09 15:00:05

2

您正遇到Same Origin Policy。您無法使用AJAX訪問來自外部域的數據,這被認爲是安全風險。其背後的原因是,AJAX請求使用瀏覽器存儲的cookie - 如果我試圖訪問facebook.com,並且您在那裏登錄,cookie將被髮送,並且我可以訪問您的個人數據。

2

出於安全原因,您不能使用AJAX從不同的域(或協議或端口)請求頁面。

相反,您可以在服務器上編寫服務器端腳本以將請求轉發到其他域。 (如果您從file://網址運行網頁,則無法執行此操作)

+0

我不確定你的意思是HTTP重定向或通過'將請求轉發到另一個域'代理 - 前者不會工作,但轉發不會是後者的正確術語。 – 2010-03-09 15:10:38

+0

@安迪:我的意思是代理。什麼是正確的動詞? – SLaks 2010-03-09 15:13:37

+0

對不起,我真的沒有必要挑剔(工作的壓力,也許呢?;-))。我認爲轉發可以作爲一個術語,但它只是讀錯了,我幾乎downvoted ;-) – 2010-03-09 15:20:42

4

您無法對腳本始發的其他域執行ajax調用。

對於做這樣的事,你必須將自己的網頁上使用代理頁面,例如:

<script> 
    $(document).ready(function() { 
     $('#test').load('ajax/getgoogle.php'); 
    }); 
</script> 

getgoogle.php:

<?php 

echo file_get_contents("http://www.google.com/"); 

?> 
2

阿賈克斯?是。 XHR? No(除非瀏覽器實現了尚未普及的Cross-site XHR)。

要使用Ajax獲取數據而不使用XHR,外部站點必須提供JSONP format中的數據。

或者,您可以通過服務器端的服務器端腳本代理數據,從而使其來自同一主機(就JavaScript而言)。

1

加載此PHP腳本,而不是試圖加載網站直接

$filename = "http://www.sitename.com"; 
$handle = fopen($filename, "r"); 
if ($handle) 
{ 
    while (!feof($handle)) 
    { 
     $text .= fread($handle, 128); 
    } 
    fclose($handle); 
} 
print $text; 

編輯:或者乾脆像心腹與的file_get_contents解決方案

+0

使用cURL優先fopen:http://stackoverflow.com/questions/636678/what-are-the-important-differences-between-using-fopenurl-and-curl-in-php/637693 – Quentin 2010-03-09 14:24:27

相關問題