2010-03-09 29 views
8

Tôi mới bắt đầu học jQuery và AJAX. Tôi có thể tải một trang địa phương (trên đĩa của tôi) vào một div qua jQuery.load(), nhưng các trang web bên ngoài dường như không hoạt động. Tôi thậm chí đã sử dụng wireshark để kiểm tra xem dữ liệu có được gửi từ máy chủ hay không. Mã mẫu bên dưới:Tôi có thể tải dữ liệu từ trang bên ngoài qua AJAX không?

<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> 

Có thể thực hiện điều này ngay từ đầu không? Nếu vậy, làm thế nào?

+0

câu hỏi tương tự với câu trả lời http://stackoverflow.com/questions/ 2217695/try-to-use-json-với-jquery/2217707 # 2217707 – yanoo

Trả lời

0

Bạn không thể gọi Ajax từ tên miền khác. Kiểm tra kỹ thuật JSON cho số này

+0

JSON sẽ không giúp bạn ở đây vì nó chỉ là một định dạng để làm ví dụ ajax gọi.Cùng một chính sách gốc cũng xuất hiện ở đây. –

+0

Anh ấy có thể đang đề cập đến JSONP. – SLaks

2

Bạn đang chạy vào số Same Origin Policy. Bạn không thể truy cập dữ liệu từ một miền bên ngoài bằng AJAX, nó được coi là một nguy cơ bảo mật. Lý do đằng sau nó là AJAX yêu cầu làm việc với cookie được lưu trữ bởi trình duyệt - nếu tôi cố gắng truy cập facebook.com và bạn đã đăng nhập ở đó, cookie sẽ được gửi và tôi có quyền truy cập vào dữ liệu cá nhân của bạn.

2

Vì lý do bảo mật, bạn không thể sử dụng AJAX để yêu cầu một trang từ một miền khác (hoặc giao thức hoặc cổng).

Thay vào đó, bạn có thể viết tập lệnh phía máy chủ trên máy chủ của mình để chuyển tiếp yêu cầu đến miền khác. (Điều này là không thể nếu bạn đang chạy một trang từ một địa chỉ file://)

+0

Tôi không chắc chắn nếu bạn có nghĩa là chuyển hướng HTTP hoặc proxy bởi 'để chuyển tiếp yêu cầu đến một tên miền' - trước đây sẽ không làm việc nhưng chuyển tiếp sẽ không là thuật ngữ chính xác cho sau này. –

+0

@Andy: Tôi có nghĩa là proxy. Động từ chính xác là gì? – SLaks

+0

xin lỗi, tôi chỉ là cầu kỳ khi có thực sự không cần thiết (căng thẳng của công việc, có lẽ? ;-)). Tôi cho rằng chuyển tiếp có thể được sử dụng như một thuật ngữ, nhưng nó chỉ đọc sai với tôi và tôi gần như downvoted ;-) –

4

Bạn không thể thực hiện cuộc gọi ajax đến một tên miền khác với tập lệnh bắt nguồn từ đó.

Đối với làm một điều như vậy, bạn phải sử dụng một trang proxy trên trang riêng của bạn, ví dụ:

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

getgoogle.php:

<?php 

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

?> 
2

Ajax? Vâng. XHR? No (trừ khi trình duyệt triển khai Cross-site XHR chưa được phổ biến rộng rãi).

Để nhận dữ liệu bằng Ajax mà không sử dụng XHR, trang web bên ngoài phải cung cấp dữ liệu trong JSONP format.

Hoặc, bạn có thể ủy quyền dữ liệu thông qua tập lệnh phía máy chủ trên máy chủ của bạn, do đó làm cho nó đến từ cùng một máy chủ (theo như JavaScript được quan tâm).

2

Không, không phải. Hãy xem Same Origin Policy. Trang web bạn đang cố gắng yêu cầu sẽ cần phải bật tính năng JSONP để hoạt động và bạn sẽ sử dụng số cross-domain callback. Ngoài ra, bạn có thể tạo một proxy trên tên miền của riêng bạn mà lấy trang thay mặt cho yêu cầu ajax của bạn.

1

tải này kịch bản PHP thay vì cố gắng để tải trang web trực tiếp

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

Chỉnh sửa: Hoặc đơn giản như giải pháp tay sai với file_get_contents

+0

Sử dụng tùy chọn cURL để fopen: http://stackoverflow.com/questions/636678/what-are-the-important-differences-between-using-fopenurl-and-curl-in-php/637693 – Quentin

Các vấn đề liên quan