2009-09-26 27 views
73

Các thành phần client-side JS của Orbited (một máy chủ Comet), đòi hỏi rằng nếu máy chủ đang chạy trên một tên miền khác nhau hoặc cổng đến JS bản thân, bạn phải thực hiệnDocument.domain = document.domain làm gì?

document.domain = document.domain; 

trước khi bất kỳ JS khác được tải . (Xem số documentation.)

Điều này làm gì? Nó trông giống như một NOOP! (Tôi đã kiểm tra và thực tế là cần thiết.)

Trả lời

175

Tôi thực sự đã viết mã này.

Khi cố gắng thực hiện sao chép tên miền phụ/cổng chéo, khung nội tuyến cần phải có cùng giá trị document.domain làm khung chính. Thật không may, trình duyệt lưu trữ tên miền VÀ cổng nội bộ cho giá trị document.domain gốc. Nhưng getter và setter trong javascript không biết gì về cổng. Vì vậy, vấn đề là: nếu khung trên cùng document.domain('example.com', 80) và khung dưới cùng là ('comet.example.com', 80), làm thế nào để bạn có được khung dưới cùng là ('example.com', 80)?

Bạn không thể, vì việc thay đổi phần tên máy chủ sẽ khiến cổng được đặt thành null, vì vậy, tốt nhất bạn có thể làm là ('example.com', null) ở khung dưới cùng. Vì vậy, khung trên cùng cũng cần được đặt thành giá trị đó và đặt document.domain=document.domain sẽ thực hiện điều đó. Nó thay đổi biểu diễn nội bộ trong trình duyệt từ ('example.com', 80) thành ('example.com', null) và sau đó mọi thứ phù hợp với công việc liên lạc qua khung/cổng phụ/miền phụ.

+80

+1 cho câu đầu tiên :) –

+0

Giải pháp này không may là không hiệu quả đối với tôi (xem http://stackoverflow.com/questions/7796767/is-it-possible-to-alter-one-frame-from-another- sử dụng-javascript để biết chi tiết). Việc thêm 'document.domain = document.domain' vào tất cả các khung không thay đổi hành vi của Chrome. Bất kỳ ý tưởng? –

+0

Ngoài ra, tôi đã tìm ra rằng nếu tôi đặt độ trễ cho js của mình, ít nhất tôi cũng có được URL hợp lệ cho cả hai khung hình. Tuy nhiên, một khung không thể truy cập vào khung kia. –

9

Tôi tìm thấy thông tin sau trên trang web này: devguru. Cụ thể hơn, đây là báo giá:

này bộ tài sản hoặc trả lại tên miền của máy chủ mà từ đó các tài liệu có nguồn gốc. Điều này mặc định với tên miền của máy chủ tài liệu được truy xuất từ, nhưng có thể được thay đổi thành hậu tố (và chỉ một hậu tố ) của tên này. Điều này cho phép chia sẻ các thuộc tính tập lệnh , bảo mật cho phép, giữa các tài liệu được phân phối từ các máy chủ khác nhau cung cấp cho chúng chia sẻ cùng một hậu tố tên miền.

Dường như với tôi rằng nó cho phép viết mã chéo trang web cho cùng một tên miền (ngay cả khi tên miền phụ khác nhau).

Tôi giả sử rằng nếu bạn không chạm vào document.domain, công cụ js chỉ cho phép các javascripts khác từ cùng một miền. Với thuộc tính đó, bạn sẽ có thể triển khai sang các tên miền phụ khác như trạng thái tài liệu được quay vòng.

+6

Điều đó không giải thích tại sao 'document.domain = document.domain' là * not * a NOOP. –

+1

Chỉ là một dự đoán hoang dã, nhưng như tôi đã nói tôi đoán rằng tài sản chỉ được kích hoạt bất cứ khi nào nó được đặt thành một giá trị. –

29

duyệt phân biệt giữa (a) document.domain khi không được thiết lập một cách rõ ràng và (b) document.domain khi thiết lập một cách rõ ràng ... ngay cả khi họ trở về cùng giá trị.

Đặt rõ ràng giá trị cho biết ý định "hợp tác" với tập lệnh trên tên miền phụ khác (trong cùng một tên miền chính).

Nếu BOTH trang gốc VÀ tập lệnh bên ngoài đã đặt rõ ràng tài liệu.miền với cùng một giá trị, hạn chế chính sách có nguồn gốc giống nhau có thể bị bỏ qua và mỗi tập lệnh có thể truy cập tất cả các đối tượng và thuộc tính (trong trường hợp bị hạn chế) của ngữ cảnh của nhau.

+5

Câu đầu tiên của bạn là một chi tiết cực kỳ quan trọng để hiểu về vấn đề này. Cảm ơn! –

+0

Bạn đang rất hoan nghênh! Vui vì nó rất hữu ích. :) – cweekly

6

document.domain lấy giá trị mặc định từ URL thực nếu không được đặt rõ ràng. Trình duyệt sẽ ghi lại nếu document.domain đã trở thành mặc định từ URL hoặc nếu được đặt rõ ràng. Cả hai phải là mặc định cho cùng một tên miền hoặc cả hai phải được đặt rõ ràng cho cùng một tên miền để làm việc này. Nếu một là mặc định và một là rõ ràng thiết lập, cả hai phù hợp nếu đọc, hai trang sẽ vẫn bị cấm nói chuyện với nhau.

Xem: https://developer.mozilla.org/en-US/docs/DOM/document.domain

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