IE8、7、6动态添加样式时,CSS hack的BUG

问题描述

下面这段CSS代码通过JS动态添加,结果会怎样呢?

.box {
    background: red; /* normal browsers */
    *background: blue;  /* IE 6 and 7 */
    _background: green; /* IE6 */
}

通过以下代码添加到页面中

var node = document.createElement(‘style‘);
node.type = ‘text/css‘;
if (node.styleSheet) {        // for w3c
	node.styleSheet.cssText = style;
} else {        // for ie
	node.appendChild(document.createTextNode(style));
}
document.getElementsByTagName(‘head‘)[0].appendChild(node);

从代码来看,>=IE8和现代浏览器的.box的颜色是红色的,IE7是蓝色的,IE6是绿色的,那么实际呢?

IE6:

IE7:

IE8:

Chrome:

怎么回事???

从上面的截图可以看到,只有Chrome和IE6是正常的,IE7和IE8表现有问题。

IE7的表现为使用了IE6 hack(_ hack)

IE8的表现为使用了IE7 hack(* hack)

解决方法

直接上代码:

var node = document.createElement(‘style‘);
node.type = ‘text/css‘;
document.getElementsByTagName(‘head‘)[0].appendChild(node);
if (node.styleSheet) {        // for w3c
	node.styleSheet.cssText = style;
} else {        // for ie
	node.appendChild(document.createTextNode(style));
}

其实没什么变化,就是移动了appendChild那一句代码的位置。

由原来的先添加CSS样式,然后再添加到head上,变成了先添加到head上面,再更新CSS样式。

再次刷新IE7、8,现在的表现正常了。

贴上测试代码:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style>
	.box{
		width: 100px;
		height: 100px;
	}
	</style>
</head>
<body>
	<div class="box"></div>
	<script>
	var node = document.createElement(‘style‘),
		style = ‘.box {background: red;*background: blue;_background: green;}‘;
	node.type = ‘text/css‘;
	document.getElementsByTagName(‘head‘)[0].appendChild(node);
	if (node.styleSheet) {        // for w3c
		node.styleSheet.cssText = style;
	} else {        // for ie
		node.appendChild(document.createTextNode(style));
	}
	</script>
</body>
</html>

参考文章:https://www.phpied.com/the-star-hack-in-ie8-and-dynamic-stylesheets/

时间: 2024-08-15 12:05:01

IE8、7、6动态添加样式时,CSS hack的BUG的相关文章

代码动态添加ViewPager时出错

当我们在项目中使用java代码动态添加ViewPager时,需要注意一点:必须调用setId()方法为ViewPager设置一个ID. *.在xml布局中加入ViewPager时,我们一般会为ViewPager指定一个ID,因为当我们往这个控件中加入内容时,需要根据这个ID值来找到Viewpager. *.如果我们不使用xml布局文件,而是用java代码添加ViewPager.从原理上看,对于简单的添加控件,java代码可以替换为相应的xml布局,所以在动态添加时设置ID.

javaScript动态添加样式

[动态添加css样式] <html> <head> <script type="text/javascript"> window.onload=function(){ var head=document.getElementsByTagName('head')[0]; //获取到head元素 var link=document.createElement('link');  //创建link元素节点,也就是link标签 link.rel="

动态添加布局时,addView易引发的错误

今天在做课程设计的时候,因为Adapter里面动态添加View的时候,写了下面的代码 TextView start = new TextView(context,null); holder.start = start; LinearLayout.LayoutParams startl = new LinearLayout.LayoutParams(80,40); start.setLayoutParams(startl); start.setText("("+bean.getStart

jsp include 和EL函数为菜单栏动态添加样式

在模块中出现公用的菜单栏,如果每一页都单独有一个菜单栏维护起来很麻烦,每次增加一个菜单的话,菜单中的每个页面都需要修改菜单栏,稍有不慎,就会出现样式不一样的情况. 这时候就需要用到jsp的包含机制.包含机制有两种:include指令和<jsp:include/>标准动作. <%@ include file=" /jsp/widget/user/menuNavl.jsp"%> <jsp:include page=" /jsp/widget/user

JS检测浏览器版本信息(包含IE11),并动态添加样式

<head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <script src="Scripts/jquery-1.9.1.min.js"></script> <link href="

Activity动态添加Fragment时遇到的问题

1.Activity动态调用代码 TitleFragement a = new TitleFragement();        getFragmentManager().beginTransaction().add(R.id.tt, a)            .commit(); 异常信息: The specified child already has a parent. 经分析: 对应Fragment代码: View view = inflater.inflate(R.layout.ti

ASP.NET动态引用样式表(css)和脚本(js)文件

// 引入js文件 HtmlGenericControl scriptControl = new HtmlGenericControl("script"); scriptControl.Attributes.Add("type", "text/javascript"); scriptControl.Attributes.Add("language", "JavaScript"); scriptControl

动态添加DOM时,绑定的click事件会重复执行

最近因为业务需求,需要重写window的alert和confirm弹窗,但是每次显示的提示按钮不相同,所有每次打开的弹窗都需要重写生成,但是对于相同的按钮会保留上次创建时的click事件,所以当你创建了多少次弹窗,你下次单击该按钮就会执行多少次,面对这个问题有两个解决方法: 1,每次关闭弹窗时都将其销毁,destory() 方法,将创建的dom从document中remove()掉: 2,将一些公共的btn设置为公用的dom,不需要每次都进行创建,这样在下一次为其btn绑定click事件时,un

vue 动态添加样式的方式

一. <li v-for="(chatting,index) in item" :key="index" :class="{'user_right':chatting.user_id}"> 判断chatting中是否有user_id,如果有就追加user_right类名 二. <p :class="coms===1?'hear1':'hear'"></p> 判断coms是否等于1,如果等于就