IE的setAttribute中与标准浏览器的有许多不同,主要表现在IE对setAttribute的功能上有些限制,就是不能用setAttribute来设定class、style于onclick等事件的值以及设置name属性,那这样就会导致setAttribute在IE浏览器里失去很多的用途!而在IE6,IE7中,如果动态生成input元素,是无法为其设置name属性的。不过当然这bug已经在最新版的IE8中被修复,详情可以浏览微软官网给出的资料。由于name属性对表单元素非常重要(在提交表单时,与value属性组成键值对,发送到后台),因此必须留意这个bug。
微软的相关资料:NAME Attribute | name Property
<!doctype html>
<html dir=”ltr” lang=”zh-CN”>
<head>
<meta charset=”utf-8″/>
<title>setAttribute bug By 司徒正美</title>
<meta http-equiv=”X-UA-Compatible” content=”IE=7″>
<script type=”text/javascript”>
window.onload = function(){
var form = document.createElement(”form”);
var input = document.createElement(”input”);
var root = document.body;
input.setAttribute(”name”, “test”);
root.appendChild(form);//注意添加顺序,添加顺序错的话,IE会内存泄漏
form.appendChild(input);
alert(form.elements.test)
}
</script>
</head>
<body>
<h3>请在IE6与IE7下浏览,当然IE8也可以,我已让IE8处在IE7的兼容模式下运作。兼容模式连bugs也兼容了……</h3>
</body>
</html>
解决办法有两个,如用innerHTML,觉得innerHTML真是一个伟大的发明
<!doctype html>
<html dir=”ltr” lang=”zh-CN”>
<head>
<meta charset=”utf-8″/>
<title>setAttribute bug By 司徒正美</title>
<meta http-equiv=”X-UA-Compatible” content=”IE=7″>
<script type=”text/javascript”>
window.onload = function(){
var body = document.body;
var form = document.createElement(”form”);
form.innerHTML = “<input name=’test’ type=’text’ />”
body.appendChild(form);
alert(form.elements.test)
}
</script>
</head>
<body>
<h3>请在IE6与IE7下浏览</h3>
</body>
</html>
另一个利用IE强大的createElement特征,它能在创建元素的同时,连属性也一起创建。
<!doctype html>
<html dir=”ltr” lang=”zh-CN”>
<head>
<meta charset=”utf-8″/>
<title>setAttribute bug </title>
<meta http-equiv=”X-UA-Compatible” content=”IE=7″>
<script type=”text/javascript”>
window.onload = function(){
var body = document.body;
var form = document.createElement(”form”);
try{
var input = document.createElement(”<input type=’text’ name=’test’>”);
}catch(e){
var input = document.createElement(”input”);
input.setAttribute(”name”, “test”)
}
body.appendChild(form);//注意添加顺序,添加顺序错的话,IE会内存泄漏
form.appendChild(input);
alert(form.elements.test)
}
</script>
</head>
<body>
<h3>请在IE6与IE7下浏览</h3>
</body>
</html>
但name只是冰山一角,setAttribute在设置属性时,有许多属性在IE下与标准浏览器的命名是不一样的,看一下jQuery,发现它也是不全的。许多地雷埋在这里,总有一个你迟早会中的。下面是一个详尽的参照表:左边为标准游览器的,右边是IE的。
var IEfix = {
acceptcharset: “acceptCharset”,
accesskey: “accessKey”,
allowtransparency: “allowTransparency”,
bgcolor: “bgColor”,
cellpadding: “cellPadding”,
cellspacing: “cellSpacing”,
“class”: “className”,
colspan: “colSpan”,
checked: “defaultChecked”,
selected: “defaultSelected”,
“for”: “htmlFor” ,
frameborder: “frameBorder”,
hspace: “hSpace”,
longdesc: “longDesc”,
maxlength: “maxLength”,
marginwidth: “marginWidth”,
marginheight: “marginHeight”,
noresize: “noResize”,
noshade: “noShade”,
readonly: “readOnly”,
rowspan: “rowSpan”,
tabindex: “tabIndex”,
valign: “vAlign”,
vspace: “vSpace”
}
IE不能用setAttribute为dom元素设置onXXX属性,换言之,不能用setAttribute设置事件。
<!doctype html>
<html dir="ltr" lang="zh-CN">
<head>
<meta charset="utf-8"/>
<title>setAttribute bug By 司徒正美</title>
<meta http-equiv="X-UA-Compatible" content="IE=7">
<script type="text/javascript">
window.onload = function(){
var body = document.body;
var form = document.createElement("form");
form.innerHTML = "<input name='test' type='text' />"
body.appendChild(form);
form.elements.test.setAttribute("onfocus", "alert(this.name)");
}
</script>
</head>
<body>
<h3>用setAttribute设置事件</h3>
<p>在IE下文本域获得焦点后并没有弹出预期的alert!</p>
</body>
</html>
IE要直接赋给一个函数!
var body = document.body;
var form = document.createElement(“form”);
form.innerHTML = “<input name=’test’ type=’text’ />”
body.appendChild(form);
if(!+“\v1″){
form.elements.test.setAttribute(“onfocus”, function(){alert(this.name)});
}else{
form.elements.test.setAttribute(“onfocus”, “alert(this.name)”);
}
<!doctype html>
<html dir="ltr" lang="zh-CN">
<head>
<meta charset="utf-8"/>
<title>setAttribute bug By 司徒正美</title>
<meta http-equiv="X-UA-Compatible" content="IE=7">
<script type="text/javascript">
window.onload = function(){
var body = document.body;
var form = document.createElement("form");
form.innerHTML = "<input name='test' type='text' />"
body.appendChild(form);
if(!+"\v1"){
form.elements.test.setAttribute("onfocus", function(){alert(this.name)});
}else{
form.elements.test.setAttribute("onfocus", "alert(this.name)");
}
}
</script>
</head>
<body>
<h3>IE用setAttribute设置事件要直接赋函数!</h3>
</body>
</html>
在IE6与IE7中也不能用setAttribute设置样式:dom.setAttribute(”style”,”font-size:14px”)
<!doctype html>
<html dir="ltr" lang="zh-CN">
<head>
<meta charset="utf-8"/>
<title>setAttribute bug By 司徒正美</title>
<meta http-equiv="X-UA-Compatible" content="IE=7">
<script type="text/javascript">
window.onload = function(){
var styleData = 'border:1px solid #000;background:#F1FAFA;font-weight:bold;';
var h3 = document.getElementsByTagName("h3")[0]
h3.setAttribute(’style’, styleData);
}
</script>
</head>
<body>
<h3>IE6与IE7看不到效果!</h3>
</body>
</html>
这时要统一用dom元素的style.csstext属性赋值比较安全。
<!doctype html>
<html dir="ltr" lang="zh-CN">
<head>
<meta charset="utf-8"/>
<title>setAttribute bug</title>
<meta http-equiv="X-UA-Compatible" content="IE=7">
<script type="text/javascript">
window.onload = function(){
var styleData = 'border:1px solid #000;background:#F1FAFA;font-weight:bold;';
var h3 = document.getElementsByTagName("h3")[0]
if(!+”\v1″){
//use the .cssText hack
h3.style.setAttribute(’cssText’, styleData);
} else {
//use the correct DOM Method
h3.setAttribute(’style’, styleData);
}
}
</script>
</head>
<body>
<h3>h3.style.setAttribute('cssText', styleData);</h3>
</body>
</html>
分享到:
相关推荐
1. **获取IE浏览器实例**:在C#中,我们可以通过枚举所有活动的窗口,识别出IE浏览器窗口,并获取其句柄。常用的API函数有`FindWindow`和`FindWindowEx`,它们可以找到具有特定类名或标题的窗口。一旦获取了句柄,...
总结来说,"IE6用setAttribute添加事件无效"的问题提醒我们在进行前端开发时,必须考虑到浏览器的兼容性问题,尤其是对老旧版本的IE浏览器。通过使用条件判断、库或适配器模式,我们可以编写出能够在各种浏览器环境...
在本场景中,我们探讨的是如何使用C#编程语言在WinForm应用中操作IE浏览器的Document Object Model (DOM)。DOM是HTML和XML文档的结构化表示,它允许程序和脚本动态更新、添加或删除页面元素。 首先,我们需要引入对...
标题 "IE浏览器去掉FLASH虚线框的两种方法" 涉及的是在使用Internet Explorer(IE)浏览含有Flash内容的网页时,如何消除Flash对象周围的虚线边框的问题。这通常是一个视觉上的优化,因为虚线边框可能会影响网页的...
其中一个问题是`setAttribute`方法在这些老版本的IE浏览器中对某些属性的支持不足。`setAttribute`是DOM操作中常用的一个函数,用于动态地设置HTML元素的属性。然而,在IE6和IE7中,它并不支持像"class"、"for"、...
在标准模式下,IE8及以下版本不支持通过`setAttribute`直接为元素添加事件监听器,这与现代浏览器如Chrome和Firefox存在差异。为了确保兼容性,通常推荐使用`addEventListener`方法为元素添加事件监听器,但由于IE8...
在Java Web开发中,我们经常遇到各种运行时错误或编译错误,其中一种较为常见的问题是`request.setAttribute`方法调用时出现红色感叹号提示,并且伴随着HTTP 500错误。这种问题通常是由类型不匹配导致的,比如尝试将...
本文将详细讨论一个特定的问题,即在IE6/7中使用JavaScript的setAttribute方法设置table的cellpadding和cellspacing属性时出现的bug。 首先,我们需要了解`cellpadding`和`cellspacing`属性。这两个属性是HTML中...
在大多数情况下,可以使用`setAttribute`方法,但对于IE浏览器,则需要使用`className`属性: ```javascript var element = document.getElementById('myElement'); // 非IE浏览器 element.setAttribute('class', ...
然而,在某些情况下,尤其是当动态创建并添加元素到DOM后,直接调用`input.focus()`在IE浏览器中可能无法正常工作。这通常是因为浏览器的渲染机制与JavaScript执行顺序之间存在冲突,导致新创建的元素尚未完全渲染到...
通过创建一个映射对象`fixAttr`,我们可以将那些在老版本IE浏览器中存在兼容性问题的属性名称进行转换。通过这个映射对象,我们就可以将不符合标准的属性名称转换为正确的属性名称,从而保证`setAttribute()`在所有...
但是,在使用 setAttribute 方法设置 class 属性时,存在一个冲突问题,那就是在不同的浏览器中,setAttribute 方法的行为不同。 问题的根源在于,IE 浏览器和 Firefox 浏览器对 class 属性的处理方式不同。在 Fire...
尤其是在处理DOM (Document Object Model) 操作时,IE浏览器与其他现代浏览器相比存在一些差异,这些差异可能导致网页在IE中的表现与预期不符。本文将针对IE中DOM实现存在的部分问题及其解决方法进行详细探讨。 ###...
在IE浏览器中,可以通过直接赋值的方式来设置`onclick`事件监听器,如`element.onclick = function() { /* 事件处理逻辑 */ };`。这种方法虽然可以兼容IE,但并不符合使用`setAttribute`的初衷。 此外,通过分析...
然而,不同浏览器之间对于HTML元素的解析和处理可能存在差异,其中IE浏览器就存在一个特定的问题,即在初始状态下无法通过`checked`属性正确设置`radio`或`checkbox`为选中状态。这个问题主要体现在`IE`的早期版本,...
### IE浏览器中的JavaScript不兼容性问题及解决方案 #### 一、Table操作问题 **问题描述:** 在使用JavaScript动态创建`<table>`元素并添加行(`<tr>`)或单元格(`<td>`)时,直接使用`document.createElement()`...
然而,值得注意的是,对于CSS类的设置,Firefox浏览器接受`setAttribute("class", value)`,而Internet Explorer(IE)则需要使用`setAttribute("className", value)`。为了确保跨浏览器兼容性,通常需要同时使用这...