我有一个两部分的问题。
一、场景:
由于我们在移动浏览器对 NOSCRIPT 的支持方面遇到了一些奇怪的问题,我的任务是提出一种替代解决方案来“检测”JS。解决方案逻辑是在页面上有两个 DIV。一个是错误,说明您没有 JS 并且默认显示他。如果一个人有 JS,那么我们想要向 HEAD 添加一个新的 STYLE 块,它会覆盖以前的 CSS 并隐藏错误并显示内容。
示例 HTML:
<div id="div1">div 1 (should be shown if JS enabled)</div>
<div id="div2">div 2 (should be hidden if JS enabled)</div>
这是我开始的 JS:
var styleNode = document.createElement('style');
styleNode.setAttribute("type", "text/css");
styleNode.innerHTML = "#div1 {display: block;} #div2 {display: none;}";
headTag.appendChild(styleNode);
但是,我遇到了问题。如果您尝试将 innerHTML 插入到创建的元素中,然后再将其放入 DOM 中,则一些谷歌搜索会导致 IE 可能遇到的安全问题的描述:
http://karma.nucleuscms.org/item/101
所以,我这样修改了脚本:
var styleNode = document.createElement('style');
styleNode.setAttribute("type", "text/css");
var headTag = document.getElementsByTagName("head")[0];
headTag.appendChild(styleNode);
var aStyleTags = headTag.getElementsByTagName("style");
var justAddedStyleTag = aStyleTags[aStyleTags.length-1];
justAddedStyleTag.innerHTML = "#div1 {display: block;} #div2 {display: none;}";
问题 1:这是 IE 问题的有效解决方法吗?有没有更有效的解决方案?
问题2:即使进行了调整,脚本在IE中仍然无法运行。它在 Firefox 中运行良好,但在 IE 7 中出现“未知运行时错误”。
我在 JSBIN 上有这段代码的示例:
有谁知道IE是怎么回事?
更新:
我通过谷歌偶然发现了这个链接。注意最后一条评论:
http://msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx
也就是说,您确实应该将所有样式规则放在 HEAD 中,以严格遵守 XHTML。这样做也可能有点棘手,因为您不能使用 innerHTML 直接注入 HEAD 或 STYLE 元素。(这两个标签都是只读的。)
哎呀!真的?火狐只是过于宽容了吗?或者这只是一个非常奇怪的 IE 怪癖?
更新 2:
关于我们在这里尝试解决的问题的更多背景信息。我们正在处理移动设备和一些过时的设备 a) 不支持 NOSCRIPT 和 b) 具有慢速 JS 引擎。
由于他们不支持 NOSCRIPT,我们默认显示一个错误,然后通过 JS 隐藏它(如果有),并为他们提供正确的内容。由于这些 JS 引擎的速度很慢,人们会看到 DIV 显示/隐藏的“闪烁”。这是处理该问题的建议解决方案,因为它会在 DIV 甚至渲染之前加载 CSS。
由于它似乎无效,解决方案将是在这些旧设备上,我们将使用此方法(因为它似乎有效,即使不在 IE 中),然后所有其他合适的浏览器将按照建议进行......我们'将在每个 DIV 加载到 DOM 后通过内联 JS 更新 DISPLAY CSS 属性。
尽管如此,我仍然很好奇这个问题是否是一个 IE 错误,或者 IE 是否通过使 STYLE 成为只读元素实际上遵守了正确的标准。