使用IE和SSL编码Dojo

时间:2020-03-05 18:52:27  来源:igfitidea点击:

我的应用程序在仅SSL的网站上使用Dojo 1.1.1. 它目前正在利用dijit.ProgressBardijit.form.DateTextBox的优势。

在Firefox 2和3中,一切工作都很棒,但是当我在IE7中尝试相同的脚本时,结果是一个令人讨厌的"安全信息"对话框:

This page contains both secure and non-secure items. Do you want to display the non-secure items?

我已仔细检查了该页面是否有任何非HTTPS引用,但均无济于事。它似乎是特定于dojo.js的东西。曾经有一个" iframe"故障,其中" src"被设置为" nothing",但现在似乎已修复(在查看源代码时)。

还有其他人有这个问题吗?要使Dojo在仅SSL的Web服务器上与IE完美兼容的最佳实践是什么?

解决方案

回答

如果页面正在从非https URL加载文件,则Firefox应该告诉我们同样的事情。应该划掉底部(状态栏中)的锁定符号,而不是错误。我们确定不是这种情况吗?

如果看到该符号,请单击它,然后检查哪些文件是"不安全的"。

回答

回顾了Dijit的JavaScript源代码之后,我认为该错误很可能是由于对动态生成的IFRAME的"不安全"引用导致的。请注意,脚本文件有两个版本,未压缩代表原始源(dijit.js.uncompressed.js),标准(dijit.js)已被压缩以获得最佳传输时间。

由于未压缩版本是最易读的版本,因此我将在此基础上描述我的解决方案。在第1023行,使用JavaScript呈现了一个IFRAME:

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次重新加载,同一页面是"安全的",然后在第六次加载时被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()中的所有内容。

一切都很好!页面加载不会出现零星的安全问题。