我正在开发一个 Django 项目,作为良好实践的一部分,我的静态内容和媒体是从无 cookie 域提供的。当然,为了做到这一点并仍然使用 Google Analytics 等工具,我提供来自 www.domain.tld 的所有文档,而媒体来自 media.domain.tld,静态来自 static.domain.tld。
这最初会导致 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 片段添加到管理员的 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?或者,重置是使用主窗口的窗口对象进行通信的副作用吗?如果是先前的,你能指出我在哪里吗?我似乎无法找到它可能在哪个文件中。如果是后者,拥有 cookieless 域 + TinyMCE + Django Admin 弹出窗口的解决方案是什么?
非常感谢您考虑这个问题!