2011-11-03 34 views
29

Làm cách nào để sửa lỗi này trong Firefox? Tôi đang sử dụng Iframe có thẻ neo? Tôi muốn để có được một tài liệu tham khảo để neo này nhưng tôi đang nhận được lỗi này khi tôi đang cố gắng để truy cập neo:lỗi: Quyền bị từ chối truy cập thuộc tính 'tài liệu'

var frameWindow = document.getElementById('myIframe').contentWindow; 
var anchor = frameWindow.document.links[0]; //.getElementsByClassName('a'); 
anchor.onclick.... 
+2

Bạn không thể làm điều đó nếu các điểm khung hình để tên miền khác nhau. –

+0

Dường như khung nội tuyến không có cùng tên miền với trang gốc. Bạn không thể truy cập nội dung sau đó. –

+2

bạn có thể sử dụng lệnh Firebug CD để phát triển nếu nó trên một tên miền khác: https://groups.google.com/forum/?fromgroups=#!topic/firebug/DvUvoLw-hOI (http://getfirebug.com/wiki/ index.php/Command_Line_API # cd.28window.29) – baptx

Trả lời

10

Nếu điểm iframe vào một miền khác nhau, bạn sẽ nhận được lỗi này. Đây là một ví dụ về trình duyệt của bạn ngăn chặn cross-site scripting: http://en.wikipedia.org/wiki/Cross-site_scripting

+28

Điều đó tốt và dandy, nhưng OP muốn biết làm thế nào để có được xung quanh nó. – Noz

+5

Nhận xét của @TarynEast Baptx là một câu trả lời tốt hơn nhiều cho điều này, ít nhất nó cố gắng đưa ra một giải pháp. Mặc dù tôi thậm chí có thể đề xuất một cái gì đó như easyXDM. – Noz

22

Relaxing the same-origin policy

Trong một số trường hợp cùng một chính sách có nguồn gốc là quá hạn chế, đặt ra vấn đề cho các trang web lớn mà sử dụng nhiều tên miền phụ. Dưới đây là bốn kỹ thuật để thư giãn nó:

document.domain property

Nếu hai cửa sổ (hoặc khung) có chứa các kịch bản chính xác đến miền với giá trị tương tự, cùng một chính sách có nguồn gốc là thoải mái cho hai cửa sổ này, và mỗi cửa sổ có thể tương tác với nhau. Ví dụ: các tập lệnh hợp tác trong các tài liệu được tải từ orders.example.com và catalog.example.com có ​​thể đặt thuộc tính document.domain của chúng thành “example.com”, do đó làm cho các tài liệu dường như có cùng nguồn gốc và cho phép mỗi tài liệu đọc tài sản của người khác. Điều này có thể không phải lúc nào cũng hoạt động vì cổng được lưu trữ trong biểu diễn bên trong có thể được đánh dấu là rỗng. Nói cách khác, port example.com 80 sẽ trở thành cổng example.com null vì chúng tôi cập nhật document.domain. Cổng null có thể không được coi là 80 (tùy thuộc vào trình duyệt của bạn) và do đó có thể thất bại hoặc thành công tùy thuộc vào trình duyệt của bạn.

Cross-Origin Resource Sharing

Kỹ thuật thứ hai để thư giãn cùng một chính sách có nguồn gốc đang được chuẩn dưới cái tên Cross-Origin Resource Sharing. Tiêu chuẩn dự thảo này mở rộng HTTP với tiêu đề yêu cầu Gốc mới và tiêu đề phản hồi Access-Control-Allow-Origin mới. Nó cho phép máy chủ sử dụng tiêu đề để liệt kê nguồn gốc rõ ràng có thể yêu cầu tệp hoặc sử dụng ký tự đại diện và cho phép tệp được yêu cầu bởi bất kỳ trang web nào. Các trình duyệt như Firefox 3.5 và Safari 4 sử dụng tiêu đề mới này để cho phép các yêu cầu HTTP có nguồn gốc chéo với XMLHttpRequest mà nếu không sẽ bị cấm bởi chính sách cùng nguồn gốc. [7]

Cross-document messaging

Một kỹ thuật mới, tin nhắn qua tài liệu cho phép một kịch bản từ một trang để vượt qua các thông điệp văn bản đến một kịch bản trên một trang khác không phụ thuộc vào nguồn gốc kịch bản. Gọi phương thức postMessage() trên đối tượng Window sẽ không đồng bộ kích hoạt sự kiện "onmessage" trong cửa sổ đó, kích hoạt mọi trình xử lý sự kiện do người dùng xác định. Một tập lệnh trong một trang vẫn không thể truy cập trực tiếp vào các phương thức hoặc biến trong trang khác, nhưng chúng có thể giao tiếp một cách an toàn thông qua kỹ thuật gửi thư này.

JSONP

JSONP cho phép một trang để nhận dữ liệu JSON từ một tên miền khác nhau bằng cách thêm một yếu tố <script> vào trang đó tải một phản ứng JSON từ một tên miền khác nhau.

Cuộc gọi hàm là "P" của JSONP — "đệm" xung quanh JSON thuần túy hoặc theo some "tiền tố". Theo quy ước, trình duyệt cung cấp tên của hàm gọi lại dưới dạng giá trị thông số truy vấn được đặt tên, thường sử dụng tên jsonp hoặc gọi lại làm tên trường tham số truy vấn được đặt tên, trong yêu cầu của nó đối với máy chủ, ví dụ:,

<script type="application/javascript" 
     src="http://server2.example.com/Users/1234?jsonp=parseResponse"> 
</script> 

Trong ví dụ này, tải trọng nhận được sẽ là:

parseResponse({"Name": "Foo", "Id": 1234, "Rank": 7}); 
Các vấn đề liên quan