HEAD中LINK和STYLE元素的求值顺序
Evaluation order of LINK and STYLE elements in HEAD
在我看来,所有现代浏览器,包括最新版本的Chrome、Safari和FireFox(可能从一开始),都尊重head
中style
和link
元素的顺序;即使在动态创建并在运行时使用JavaScript添加时也是如此。
例如,这里red.css
和green.css
都指定主体背景颜色;第一个设置机身背景为红色,第二个设置为绿色:
<head>
<!-- other code -->
<link rel="stylesheet" href="red.css" type="text/css">
<link rel="stylesheet" href="green.css" type="text/css">
</head>
结果是,由于green.css
被放置在red.css
之后并且随后被评估,所以主体的背景颜色是绿色。
即使动态创建link
元素并将其插入头中,元素的排序似乎也是正确的。例如,动态创建一个加载green.css
的link
元素,如果它插入在red.css
之后,则只会将主体背景颜色设置为绿色。
然而,唯一不尊重这一点的浏览器似乎是Internet Explorer(至少IE 7-9不尊重)。对于IE,最近添加的link
或style
元素似乎是在已经评估的所有元素之上评估的;在运行时添加时,它不尊重树顺序。
尊重订单是非标准行为,还是这是Internet Explorer的错误?如何为Internet Explorer修复此问题?
我提出的一个想法(有效)是动态删除所有现有的link
和style
元素,并按相同的树顺序将它们添加回来——这就是我希望对它们进行评估的顺序。
如有任何见解,我们将不胜感激。
更新
根据要求,这里有一个更详细的代码示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="red.css" type="text/css"> <!-- sets red -->
</head>
<body>
<script type="text/javascript">
setTimeout(function() {
// IE7-8 does not support referencing document.head
var head = document.getElementsByTagName("head")[0];
var link = document.createElement("link");
link.setAttribute("href", "green.css");
link.setAttribute("rel", "stylesheet");
link.setAttribute("type", "text/css");
// All modern browesers will leave the background
// color red, except IE will set it green.
head.insertBefore(link, head.firstChild);
// Now comment out the above line and try adding the link
// using this instead. All modern browsers (including IE)
// will set the body background color green after two seconds.
// IE seems to always evaluate the last dynamically added link.
// head.appendChild(link);
}, 2000);
</script>
</body>
</html>
red.css
:的内容
body { background-color: red; }
green.css
:的内容
body { background-color: green; }
如果不是重新附加样式表,而是切换样式表的一个属性以强制重新渲染,该怎么办?例如,您可以尝试对所有link
/style
元素进行迭代,将其media
属性设置为none
,然后将其重新设置为原始属性。
您没有告诉我们您真正想通过插入样式表来解决什么问题的细节,但很可能有更好的方法来解决真正的问题,而不是在列表中按特定顺序动态插入样式表。
例如,您可以将两个样式表(稍作修改以关闭另一个类)都放在适当的位置,通过向<body>
标记添加或删除一个类,您可以触发从绿色到红色的更改,反之亦然。
您所指的是CASCADING-CASCADING样式表(CSS)工作方式中的一个非常重要的功能。所有浏览器都是这样工作的,包括IE。如果它们不级联,那将是一个大问题。
然而,有些样式在某些版本的IE中不起作用——也许你看到的是样式不能正常工作,而不是级联不能正常工作。你想发布一个具体的例子吗?
- 按我自己的类克隆另一个元素的内容和顺序
- 重新排列HTML元素的顺序并更改内容
- 在Javascript中列出顺序子集元素
- HEAD中LINK和STYLE元素的求值顺序
- 如何在php中按元素按字母顺序排列json文件
- Javascript - 如何按顺序从数组中挑选随机元素
- 使用 KNOCKOUT.js 在禁用元素的 HTML 中保持 Tab 键顺序
- 如何将.append()创建的元素顺序添加到先前添加的元素中
- 排列<p>使用jQuery按日期顺序排列的元素
- 通过普通JS更改元素的索引(顺序)
- 按随机顺序对元素进行动画处理
- 在不使用jQuery sortable的情况下警告丢弃元素的顺序
- 如何使用jQuery以与多选框中相同的顺序检索多选框中所有选定和未选定的元素
- 循环中元素的显示顺序
- 在Firefox中的keydown事件中隐藏元素时焦点顺序错误
- 使用动态构建的 jQuery 承诺链按顺序激活特定元素
- 如何按顺序将类添加到元素集合
- 如何反转 JavaScript 变量中 HTML DOM 元素的顺序
- 按顺序显示动画 SVG 元素
- Jquery/CSS带回调的顺序元素动画