2011-11-21 22 views
6

Tôi đã thực hiện một số thử nghiệm trong Chrome nhưng tôi không chắc chắn vì vậy tôi cần xác nhận:Khung và khung nội tuyến có ngữ cảnh javascript riêng biệt không?

Tôi đúng khi nghĩ rằng iframe và khung có ngữ cảnh JavaScript riêng biệt, khiến chúng không thể chia sẻ các biến giữa các khung đó/iframe?

Để đơn giản hóa, chúng ta hãy giả định rằng khách hàng sẽ luôn luôn là cùng một phiên bản của Chrome (đó là trường hợp của tôi)

+0

Câu trả lời là "có", nhưng nó không phải là không thể "chia sẻ biến". Nó có thể, tuy nhiên, là nguy hiểm, như Internet Explorer là rất cầu kỳ về dòng dõi của các đối tượng JavaScript. – Pointy

+0

Bạn nên tạo câu trả lời thay vì nhận xét;) Ngoài ra, giả sử khách hàng sẽ luôn là Chrome. Câu trả lời – Klaim

+0

đã sẵn sàng. Tôi không * nghĩ * rằng Chrome có độ nhạy IE, nhưng tôi không chắc chắn 100%. Nó sẽ khá dễ dàng để kiểm tra. – Pointy

Trả lời

8

Yes.

Tuy nhiên, bạn có thể sử dụng bộ sưu tập frames hoặc parent để truy cập các khung khác (giả sử chúng thuộc cùng một tên miền).

1

Việc tách ngữ cảnh không nằm giữa các khung, nó nằm giữa các tên miền. Điều này có nghĩa rằng nếu bạn tải khung A với tên miền A và khung B với tên miền B, javascript từ khung A không thể truy cập ngữ cảnh của miền B. Kiểm tra this để có giải thích dài hơn.

EDIT: Tất nhiên, nếu họ đang ở trên cùng một tên miền, câu trả lời được cung cấp bởi SLaks hoàn toàn áp dụng.

6

Không phải là "không thể" để chia sẻ giá trị giữa các khung hình, nhưng bạn phải cẩn thận. Trong Internet Explorer, kịch bản sau đây sẽ dẫn đến một lỗi:

  1. Tạo một đối tượng JavaScript trong khung A.
  2. Vượt qua các đối tượng hoạt Javascript để một hàm trong khung B, giúp tiết kiệm giá trị ở đâu đó (trong khung B)
  3. khung A được nạp lại với một trang mới
  4. Mã trong khung B cố gắng để tham khảo các đối tượng lưu từ các cựu khung() A.

Internet Explorer không thích nó khi một đối tượng từ một defunc trang t được tham chiếu.

3

Vâng, chúng chỉ có các đối tượng toàn cầu khác nhau và phạm vi toàn cầu. Tuy nhiên, nếu chúng ở trong cùng một miền, bạn có thể chạy mã trong một từ một miền khác. Nhưng nếu bạn đã làm điều này (bên trong cửa sổ cha mẹ):

document.getElementById("myiframe").contentWindow.window.globalArray = []; 

nào tạo ra một biến toàn cầu globalArray bên trong phạm vi toàn cầu của iframe.

và sau đó bên trong iframe

console.log(globalArray instanceof Array);

sẽ trở lại falseArray đề cập đến constructor Array của iframe. Bạn sẽ phải làm

console.log(globalArray instanceof top.Array); 

trong đó top tham chiếu đến đối tượng toàn cầu cửa sổ container.

jsfiddle: http://jsfiddle.net/EFbtN/

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