我正在开发一个Django项目,作为良好实践的一部分,我的静态内容和媒体是从无cookie域提供的。当然,为了做到这一点并仍然使用谷歌分析等,我提供来自www.domain.tld的所有文件,而媒体来自media.domain.tld,静态来自static.domain.tld。
这最初引起了我选择的wywiwyg编辑器TinyMCE的问题,但是通过编辑tiny_mce.js
和tiny_mce_popup.js
以包含该行,可以轻松解决这个问题:
document.domain=window.location.hostname.split('.').splice(-2).join('.');
在顶部。这基本上将我的主编辑窗口的document.domain
和TinyMCE弹出窗口设置为domain.tld,无论它们来自哪个子域很深。效果很好(并且便携)。 (我不关心Array.splice()可能在客户端浏览器中不可用,因为TinyMCE仅用于管理,我们控制浏览器。)
无论如何,我离题了。
一切顺利,直到我尝试使用Django Admin弹出窗口,例如,动态创建一个新的M2M项目。弹出窗口显示正常,但无法正常完成作业,因为弹出窗口的文档域设置为(在本例中为www.domain.tld),而主编辑窗口中的document.domain为domain.tld
(按照上述规定)。
很简单,我想,我只是将相同的JS片段添加到admin的base.html文件的主体中。不行。根据我的包含片段,弹出窗口的document.domain确实在JS控制台中对domain.tld
进行测试时设置了,但是一旦我尝试保存新对象,它就会重置回www.domain'tld
(同样经过测试,在JS控制台中提交后,当然窗口间通信失败了:
Uncaught TypeError: Property 'dismissAddAnotherPopup' of object \
[object Window] is not a function`
在弹出窗口中:
Unsafe JavaScript attempt to access frame with URL \
http://www.domain.tld/admin/project/object/16/ from frame with URL \
http://www.domain.tld/admin/project/object/add/?_popup=1. The frame being \
accessed set 'document.domain' to 'domain.tld', but the frame requesting access \
did not. Both must set 'document.domain' to the same value to allow access.
在两个窗口中检查document.domain
揭示了这个事实:
主窗口:domain.tld
弹出窗口:www.domain.tld
(请记住,提交时已更改)
所以,对你们所有的大师提出质疑,是否有一些Django JS代码在将结果发布回主窗口之前重置弹出框架的document.domain?或者,是否重置了使用主窗口的窗口对象进行通信的副作用?如果是先前的,请你指点一下这会是什么?我似乎无法找到它可能位于哪个文件。如果是后者,有无cookie域名+ TinyMCE + Django Admin弹出窗口的解决方案是什么?
非常感谢您提前考虑此问题!