Document.domain = document.domain ne işe yarar?


91

Orbited'in (bir Comet sunucusu) istemci tarafı JS bileşeni , sunucu farklı bir etki alanında veya JS'nin kendisine giden bağlantı noktasında çalışıyorsa,

document.domain = document.domain;

başka bir JS yüklenmeden önce. ( Belgelere bakın .)

Bu ne yapar? HAYIR gibi görünüyor! (Kontrol ettim ve aslında gerekli.)

Yanıtlar:


205

Aslında bu kodu yazdım.

Çapraz alt alan / bağlantı noktası kuyruklu yıldızı yapmaya çalışırken, iframe'in document.domainüst çerçeve ile aynı değere sahip olması gerekir . Ne yazık ki, tarayıcı alan adını VE bağlantı noktasını orijinal document.domaindeğer için dahili olarak depolar . Ancak javascript'teki alıcı ve ayarlayıcı bağlantı noktası hakkında hiçbir şey bilmiyor. Üst çerçeve eğer: problem Yani bu document.domainolduğunu ('example.com', 80)ve alt çerçevedir ('comet.example.com', 80), nasıl alt çerçeve olmak alabilirim ('example.com', 80)yanı?

Bunu yapamazsınız, çünkü ana bilgisayar adı bölümünü değiştirmek mutlaka bağlantı noktasının ayarlanmasına neden olur null, bu nedenle yapabileceğiniz en iyi şey ('example.com', null)alt çerçevedir. Yani üst çerçevenin de bu değere ayarlanması gerekiyor ve ayar document.domain=document.domaintam da bunu yapıyor. Tarayıcıdaki dahili gösterimi yerine olarak ('example.com', 80)değiştirir ('example.com', null)ve ardından her şey eşleşir ve çapraz bağlantı noktası / alt alan çerçevesi iletişimi çalışır.


Bu çözüm maalesef benim için işe yaramadı ( ayrıntılar için stackoverflow.com/questions/7796767/… bakın). Tüm çerçevelere 'document.domain = document.domain' eklemek Chrome'un davranışını değiştirmez. Herhangi bir fikir?
Stephen Gross

Ayrıca, js'im için bir gecikme ayarlarsam, en azından her iki çerçeve için de geçerli görünen URL'ler alacağımı anladım. Yine de, bir kare diğerine erişemez.
Stephen Gross

6
Garip "gizli" bağlantı noktasının
MDN'de

1
Ah, demek bu çileden çıkaran kod parçasının suçlusu sensin. Söz konusu satır sayesinde, çalıştırıldıktan sonra (ve document.domain setinden) dinamik olarak oluşturulan herhangi bir iframe, alanlar arası olarak ayarlanır ve böylece yeni oluşturulan iframe'e artık erişilemez. : /
crappish

@mjs yes: Port numarası tarayıcı tarafından ayrı tutulur. Document.domain = document.domain dahil olmak üzere ayarlayıcıya yapılan herhangi bir çağrı, port numarasının üzerine null yazılmasına neden olur. Bu nedenle ilkinde sadece document.domain = "company.com" ayarlayarak company.com:8080 company.com ile konuşulamaz. Bağlantı noktası numaralarının her ikisinin de boş olması için her ikisinde de ayarlanmalıdır.
Royi Namir

38

Tarayıcılar, açıkça ayarlanmadığında (a) document.domain ile (b) açıkça ayarlandıklarında document.domain'i aynı değeri döndürseler bile ... arasında ayrım yaparlar.

Değerin açıkça ayarlanması, başka bir alt etki alanındaki (aynı ana etki alanı altında) bir komut dosyasıyla "işbirliği" yapma niyetini gösterir.

HEM üst sayfa VE harici komut dosyası, document.domain'i açıkça aynı değere ayarlarsa, aynı kaynak politika kısıtlaması atlanabilir ve her komut dosyası, birbirlerinin bağlamlarının tüm (aksi takdirde kısıtlanmış) nesnelerine ve özelliklerine erişebilir.


9

Bu sitede şu bilgileri buldum: devguru . Daha somut olarak, işte alıntı:

Bu özellik, belgenin geldiği sunucunun etki alanı adını belirler veya döndürür. Bu, varsayılan olarak belgenin alındığı sunucunun etki alanı adıdır, ancak bu adın bir sonekiyle (ve yalnızca bir sonekle) değiştirilebilir. Bu, aynı etki alanı sonekini paylaşmaları koşuluyla, farklı sunuculardan teslim edilen belgeler arasında güvenlik sağlayarak komut dosyası özelliklerinin paylaşılmasına olanak tanır.

Bana öyle geliyor ki, aynı alan adı için siteler arası komut dosyası oluşturmaya izin veriyor (alt alan adı farklı olsa bile).

Document.domain öğesine dokunmazsanız, js motorunun yalnızca aynı etki alanından diğer javascriptlere izin verdiğini varsayabilirim. Bu özellik sayesinde, yörüngeli dokümanlar durumu gibi diğer alt alanlara dağıtım yapabileceksiniz .


6
Bu yüzden açıklamıyor document.domain = document.domainolduğunu değil bir NOOP.
Crescent Fresh

1
Sadece çılgın bir tahmin, ancak söylediğim gibi, mülkiyetin yalnızca bir değere ayarlandığında tetiklendiğini tahmin ediyorum.
Miguel Ping

6

document.domainAçıkça kümesi değilse gerçek URL'den bir varsayılan çeker. Tarayıcılar şunları kaydeder:document.domain , URL'den varsayılan olarak gelip gelmediğini veya açıkça ayarlanmış olup olmadığını . Her ikisi de aynı etki alanı için varsayılan olmalıdır veya bunun çalışması için her ikisi de açıkça aynı etki alanına ayarlanmalıdır. Biri varsayılan ise ve biri açıkça ayarlanmışsa, her ikisi de okunduğunda eşleşiyorsa, iki sayfanın birbiriyle konuşması yine de yasaklanacaktır.

Bakınız: https://developer.mozilla.org/en-US/docs/DOM/document.domain

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.