在查看了 Dijit 的 JavaScript 源代码后,我认为错误可能是由于对动态生成的 IFRAME 的“不安全”引用造成的。请注意,脚本文件有两个版本,未压缩的代表原始源 (dijit.js.uncompressed.js) 和标准 (dijit.js) 已被压缩以获得最佳传输时间。
由于未压缩的版本是最易读的,我将以此为基础描述我的解决方案。在第 #1023 行,一个 IFRAME 在 JavaScript 中呈现:
if(dojo.isIE){
var html="<iframe src='javascript:\"\"'"
+ " style='position: absolute; left: 0px; top: 0px;"
+ "z-index: -1; filter:Alpha(Opacity=\"0\");'>";
iframe = dojo.doc.createElement(html);
}else{...
有什么问题?IE 不知道 IFRAME 的 src 是否“安全” - 所以我将其替换为以下内容:
if(dojo.isIE){
var html="<iframe src='javascript:void(0);'"
+ " style='position: absolute; left: 0px; top: 0px;"
+ "z-index: -1; filter:Alpha(Opacity=\"0\");'>";
iframe = dojo.doc.createElement(html);
}else{...
这是 IE 中 JavaScript 工具包和 SSL 最常见的问题。由于 IFRAME 被用作垫片,因为对 DIV 的覆盖支持不佳,所以这个问题非常普遍。
我的前 5-10 个页面重新加载很好,但随后安全错误再次开始弹出。这怎么可能?相同的页面在 5 次重新加载时是“安全的”,然后在第 6 次加载时被 IE 选择为“不安全”。
事实证明,在 dijit.wai 的 onload 事件中还设置了一个背景图像(第 1325 行)。这读起来像这样;
div.style.cssText = 'border: 1px solid;'
+ 'border-color:red green;'
+ 'position: absolute;'
+ 'height: 5px;'
+ 'top: -999px;'
+ 'background-image: url("' + dojo.moduleUrl("dojo", "resources/blank.gif") + '");';
这不起作用,因为 background-image 标记不包含 HTTP。尽管该位置是相对的,但 IE7 不知道它是否安全,因此会发出警告。
在此特定实例中,此 CSS 用于测试 Dojo 中的可访问性 (A11y)。由于这不是我的应用程序将支持的内容,并且由于此方法存在其他一般错误问题,因此我选择删除 dijit.wai 的 onload() 中的所有内容。
一切都很好!页面加载没有零星的安全问题。