使用IE和SSL编码Dojo
我的应用程序在仅SSL的网站上使用Dojo 1.1.1. 它目前正在利用dijit.ProgressBar
和dijit.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()中的所有内容。
一切都很好!页面加载不会出现零星的安全问题。