创建样式节点、添加innerHTML、添加到DOM、以及IE令人头疼的问题

2024-01-16

我有一个由两部分组成的问题。

一、场景:

由于我们在移动浏览器对 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 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 上有此代码的示例:

http://jsbin.com/ucesi4/4 http://jsbin.com/ucesi4/4

有谁知道IE是怎么回事吗?

UPDATE:

我通过谷歌偶然发现了这个链接。注意最后一条评论:

http://msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx http://msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx

也就是说,你真的应该把所有 HEAD 中的样式规则严格 符合 XHTML。这样做可以 也有点棘手,因为你 无法使用innerHTML注入 直接使用 HEAD 或 STYLE 元素。 (这两个标签都是只读的。)

哎呀!真的? FireFox 是否过于宽容?或者这只是一个非常奇怪的 IE 怪癖?

更新2:

关于我们在这里试图解决的问题的更多背景知识。我们正在处理移动设备和一些过时的设备 a) 不支持 NOSCRIPT b) 具有缓慢的 JS 引擎。

由于他们不支持 NOSCRIPT,我们默认显示错误,然后通过 JS 隐藏它(如果有),并向他们提供正确的内容。由于这些 JS 引擎速度较慢,人们会看到 DIV 显示/隐藏的“闪烁”。这是解决这个问题的建议解决方案,因为它会在 DIV 渲染之前加载 CSS。

由于它似乎无效,解决方案是在这些旧设备上,我们将使用此方法(因为它似乎有效,即使不在 IE 中),然后所有其他正确的浏览器将按照建议执行...我们在每个 DIV 加载到 DOM 中后,将通过内联 JS 更新 DISPLAY CSS 属性。

尽管如此,我仍然很好奇这个问题是否是 IE 的错误,或者 IE 是否实际上通过将 STYLE 设为只读元素来遵守正确的标准。


在 IE 中你可以使用style.styleSheet.cssText:

var style = document.createElement('style');
style.type = 'text/css';

if (style.styleSheet) { // IE
    style.styleSheet.cssText = css;
} else {
    style.appendChild(document.createTextNode(css));
}

document.getElementsByTagName('head')[0].appendChild(style);

在这里试试这个:http://jsfiddle.net/QqF77/ http://jsfiddle.net/QqF77/

请参阅这个问题的答案:如何使用 Javascript 创建 标签 https://stackoverflow.com/questions/524696/how-to-create-a-style-tag-with-javascript

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建样式节点、添加innerHTML、添加到DOM、以及IE令人头疼的问题 的相关文章

随机推荐

  • 未找到 JavaFX 包

    我正在尝试使用组合的 Swing 和 JavaFX 组件创建一个项目 但我的 IDE 找不到 JavaFX 包 尝试使用 Netbeans 和 Eclipse import javafx embed swing JFXPanel says
  • 尝试完成输入事件,但输入事件接收器已被释放

    我正在尝试我在网上看到的教程 该应用程序从服务器获取并显示 JSONfeed 这部分工作正常 我试图在自定义列表视图中显示此提要 但是当我尝试这样做时 我得到 尝试完成输入 事件 但输入事件接收器已被处理 logcat 中的错误 并且应用程
  • 生成和执行之间有什么区别?

    我正在学习编写 TCL 期望 脚本 我注意到一些示例显示了如何使用 spawn 而其他示例则显示了命令 exec 我尝试谷歌搜索 但找不到有什么区别 假设我在一个很长的期望脚本中间调用 exec 我会期望发生什么 spawn is an e
  • 数组和线程安全访问

    如果我有一个可以 将在任何给定时间点被多个线程访问的数组 到底是什么导致它是非线程安全的 以及确保该数组在大多数情况下是线程安全的步骤是什么情况 我在互联网上进行了广泛的查找 发现几乎没有关于这个主题的信息 一切似乎都是特定的场景 例如 这
  • 使用 Entity FrameworkWork 保存更改/更新数据集中的现有对象,而不必单独设置每个属性

    我可以做类似下面的事情 这不起作用 而不必显式设置对象的每个属性吗 Product 是默认模型绑定程序从表单提交创建的对象 ProductInDb 是我希望覆盖 更新的上下文 数据库中的对象 两者的 ProductID 主键相同 var P
  • Ubuntu:无法纠正问题,您持有损坏的软件包

    尝试安装此程序时 我收到 无法纠正问题 您持有损坏的软件包 错误消息 阿帕奇版本 服务器版本 Apache 2 4 2 Ubuntu 服务器建成 2012 年 6 月 27 日 07 23 35 aptitude install libap
  • while(true) 与 setInterval(function(),0) [重复]

    这个问题在这里已经有答案了 设置间隔 重复调用函数或执行代码片段 每次调用该函数之间有固定的时间延迟 while 创建一个循环 只要测试条件的计算结果为 true 该循环就会执行指定的语句 之前评估过条件 执行该语句 如果我使用while
  • 公共属性的默认值

    我在某个班级有一个公共财产 我想要这个属性的默认值 1 而不需要像 MyField这样的私有变量 因为这个类中的属性太多 我不会一一添加它们 public int MyProperty get set 我认为 DefaultValue At
  • 在unittest中覆盖python函数局部变量

    我在 python 2 7 中有一个方法可以执行 foo 操作 如果 foo 不起作用 则在 5 分钟后放弃 def keep trying self timeout 300 empirically derived appropriate
  • GoogleFit 示例不起作用

    我正在尝试使用 BasicHistory Sample 来存储数据 然后读取它 但在我的情况下 代码卡在插入调用中 await 调用不会返回我尝试使用异步方式的任何内容 这里是代码 com google android gms common
  • 在哪里可以找到 Microsoft SQL Server 2008 的 Northwind 数据库?

    我正在尝试查找并创建 导入 Northwind 数据库来练习我的 Linq fu 我一生都找不到它 搜索只是将我转到此页面 这反过来又告诉我在不存在的官方页面上找到它 http msdn microsoft com en us librar
  • 数据绑定在表单加载之前不起作用 - 组合框项仅在表单加载后初始化

    我在 winform 上有两个组合框 一个包含列表 MyList 中的所有值 另一个我想拥有第一个选定索引中的所有值 但我认为将项目加载到组合框中时存在问题 public partial class Form1 Form public Fo
  • 在 Chrome 中禁用表单自动填充而不禁用自动完成[重复]

    这个问题在这里已经有答案了 我们如何禁用 Chrome 的自动填充功能
  • 如何在 Internet Explorer 中创建跨域 XMLHTTPRequest

    我的代码如下所示 推荐在 IE 下运行 但仅在 Chrome 和 FF 下运行 是否有正确的方法从另一个域访问 url 此外 该域是我拥有的域 可以允许访问尝试访问它的脚本
  • 如何检测 Topshelf 是否在控制台模式下运行

    我将 Topshelf 与 FluentSchedule 结合用于 Windows 服务 但是 我希望能够试运行应用程序以简单地启动而不是执行设置计时器等的 FluentSchedule 代码 从命令行运行 exe 文件 即没有 安装 命令
  • 在 PHP 中打印多维数组的单个值

    我正在使用以下数组 Array 0 gt Array id gt 6 key gt SITE NAME value gt Webg Smarty CMS Small name gt general title gt website name
  • ConstraintLayout - 如何垂直对齐两个视图的中心

    我有两个视图 A 和 B 它们有不同的高度 如何在内部垂直对齐这些视图的中心ConstraintLayout 例如 在下面的 XML 中 我想要中心img change picture与中心对齐txt change picture
  • 在用户空间处理 GPIO ARM9 嵌入式 Linux AM1808

    我必须将我的 GSM 模块与基于 ARM9 的 AM1808 连接起来 我已将所有 GPIO 引脚分配给 Da850 c 以及 mux h 文件 我成功创建了一个 uImage 并将该图像插入到我的 Flash 中 我需要处理用户应用程序中
  • 如何从 PDF 文档中提取表格?

    我正在尝试从 PDF 文档中提取表格 example http www nea org np images supportive docs 55082070 3 19 pdf 它不是扫描 图像 因此请关注非 OCR 解决方案 OCR表格提取
  • 创建样式节点、添加innerHTML、添加到DOM、以及IE令人头疼的问题

    我有一个由两部分组成的问题 一 场景 由于我们在移动浏览器对 NOSCRIPT 的支持方面遇到了一些奇怪的问题 我的任务是提出一种替代解决方案来 检测 JS 解决方案逻辑是页面上有两个 DIV 一种是错误提示你没有 JS 并且默认显示他 如