Logo

never-online

A crisis is a terrible thing to waste.
  • Blog首页
  • 推荐日志
  • 关于我
  • 留言簿
  • 设计
  • 订阅RSS
  • 登录
« 《代码大全》(Code C...
在IE下用getAttribut... »
分类: Web Dev
推荐日志

IE在DOM操作有表单控件时的bug

[ 2008-07-20 19:44:21 | 作者: Rank ]
字体大小: 大 | 中 | 小
Close Advertisement
影响的范围: IE的所有版本
在表单的radio/checkbox控件中,一旦他们的DOM结构被更改过就会出现这个bug。
bug描述
当象下例中那样操作了表单radio/checkbox的DOM结构时(或者直接影响了他们的结构时)选中的checkbox/radio将会自动恢复到默认状态,有如点了reset按钮一样。

bug重现
Copy Code(拷贝代码)-Run HTML(运行代码)-Save Code(另存代码)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
 <head>
 <title>Rank's HTML document</title>
 <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
 <meta http-equiv="Pragma" content="no-cache" />
 <meta http-equiv="Cache-Control" content="no-cache" />
 <meta http-equiv="Expires" content="0" />
 <meta http-equiv="ImageToolbar" content="no" />
 <meta http-equiv="Creator.name" content="Rank, BlueDestiny, never-online" />
 <style type="text/css" title="default" media="screen">
 /*<![CDATA[*/
      body { font-size:80%; line-height:1.5; }
      body, button { font-family:arial; }
      button { padding:0 0.3em 0 0.3em; }
      h1, h3 { margin:0; padding:0; }
      h1 { font-size:2.3em; }
      h3 { font-size:1.3em; }
      form { display:inline-block; }
      div.link { padding:1em; }
      div.content { background:#ffc; padding:1em; border:1px solid #222; margin:1em 0 1em; }
      #rdoWrapper { }
      #hd { text-align:center; }
 /*]]>*/
 </style>
 </head>
 <body>
    <div id="hd">
      <h1> IE form control bug </h1>
      <div class="link">from: <a href="http://www.never-online.net/blog"><em>never-online weblog</em></a></div>
    </div>
    <div id="rdoWrapper" class="content">
      <h3> 1. Select radio to checked </h3>
      <form method="post">
      <input type="radio" name="rdo" id="rdo-1" value="rdo-1" checked><label for="rdo-1">radio1</label>
      <input type="radio" name="rdo" id="rdo-2" value="rdo-2"><label for="rdo-2">radio2</label>
      <input type="radio" name="rdo" id="rdo-3" value="rdo-3"><label for="rdo-3">radio3</label>
      <input type="radio" name="rdo" id="rdo-4" value="rdo-4"><label for="rdo-4">radio4</label>
      </form>
    </div>
    <div class="content">
      <h3> 2. Click button to change dom structure </h3>
        <p class="p"><button type="button" onclick="handleChangeDom()">test</button></p>
    </div>
    <script type="text/javascript">//<![CDATA[
      function getRadioValue(ctlName) {
        var ctls = document.getElementsByName(ctlName);
        var len = ctls.length;
        for (var i=0; i<len; i++) {
          if (ctls[i].checked) {
            return ctls[i].value;
          }
        }
      }
      function handleChangeDom() {
        alert('before append, you select radio value is "'+getRadioValue('rdo')+'"');
        var wrapper = document.getElementById('rdoWrapper');
        document.body.appendChild(wrapper);
        alert('after append, you select radio value is "'+getRadioValue('rdo')+'"');
      }
    //]]></script>
 </body>
</html>

解决方法
可以在操作DOM之前,用defaultChecked来设置checked的值。
Copy Code(拷贝代码)-Run HTML(运行代码)-Save Code(另存代码)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
 <head>
 <title>Rank's HTML document</title>
 <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
 <meta http-equiv="Pragma" content="no-cache" />
 <meta http-equiv="Cache-Control" content="no-cache" />
 <meta http-equiv="Expires" content="0" />
 <meta http-equiv="ImageToolbar" content="no" />
 <meta http-equiv="Creator.name" content="Rank, BlueDestiny, never-online" />
 <style type="text/css" title="default" media="screen">
 /*<![CDATA[*/
      body { font-size:80%; line-height:1.5; }
      body, button { font-family:arial; }
      button { padding:0 0.3em 0 0.3em; }
      h1, h3 { margin:0; padding:0; }
      h1 { font-size:2.3em; }
      h3 { font-size:1.3em; }
      form { display:inline-block; }
      div.link { padding:1em; }
      div.content { background:#ffc; padding:1em; border:1px solid #222; margin:1em 0 1em; }
      #rdoWrapper { }
      #hd { text-align:center; }
 /*]]>*/
 </style>
 </head>
 <body>
    <div id="hd">
      <h1> fixed IE form control bug </h1>
      <div class="link">from: <a href="http://www.never-online.net/blog"><em>never-online weblog</em></a></div>
    </div>
    <div id="rdoWrapper" class="content">
      <h3> 1. Select radio to checked </h3>
      <form method="post">
      <input type="radio" name="rdo" id="rdo-1" value="rdo-1" checked><label for="rdo-1">radio1</label>
      <input type="radio" name="rdo" id="rdo-2" value="rdo-2"><label for="rdo-2">radio2</label>
      <input type="radio" name="rdo" id="rdo-3" value="rdo-3"><label for="rdo-3">radio3</label>
      <input type="radio" name="rdo" id="rdo-4" value="rdo-4"><label for="rdo-4">radio4</label>
      </form>
    </div>
    <div class="content">
      <h3> 2. Click button to change dom structure </h3>
        <p class="p"><button type="button" onclick="handleChangeDom()">test</button></p>
    </div>
    <script type="text/javascript">//<![CDATA[
      function getRadioValue(ctlName) {
        var ctls = document.getElementsByName(ctlName);
        var len = ctls.length;
        for (var i=0; i<len; i++) {
          if (ctls[i].checked) {
            return ctls[i].value;
          }
        }
      }
      function setRadioDefaultValue(ctlName) {
        var ctls = document.getElementsByName(ctlName);
        var len = ctls.length;
        for (var i=0; i<len; i++) {
          ctls[i].defaultChecked = ctls[i].checked;
        }
      }
      function handleChangeDom() {
        alert('before append, you select radio value is "'+getRadioValue('rdo')+'"');
        setRadioDefaultValue('rdo');
        var wrapper = document.getElementById('rdoWrapper');
        document.body.appendChild(wrapper);
        alert('after append, you select radio value is "'+getRadioValue('rdo')+'"');
      }
    //]]></script>
 </body>
</html>
[最后修改由 Rank, 于 2008-07-20 20:47:19]
评论Feed 评论Feed: http://www.never-online.net/blog/feed.asp?q=comment&id=227

浏览模式: 显示全部 | 评论: 5 | 引用: 0 | 排序 | 浏览: 2632
引用 muxrwc
[ 2008-07-22 17:32:30 ]
[lol] 赞。。。
这都被发现啦。。。
引用 muxrwc
[ 2008-07-22 17:33:53 ]
我前几天发现了个FF的注释的BUG。。
重现不出来了。。郁闷。。。大概情况是

<!--------------------xx------------------------------->

html

<!--------------------xx------------------------------->

从<!开始包括它都是注释
引用 path*
[ 2008-08-06 18:32:39 ]
[sweat]
引用 agvasd*
[ 2009-01-07 12:55:23 ]
[razz]
引用 lgy*
[ 2009-09-09 23:06:34 ]
高人啊,这个问题我也遇到过,也跟踪调试了,可是一直不明白为什么会出现。

发表
表情图标
[smile] [confused] [cool] [cry]
[eek] [angry] [wink] [sweat]
[lol] [stun] [razz] [redface]
[rolleyes] [sad] [yes] [no]
[heart] [star] [music] [idea]
UBB代码
转换链接
表情图标
悄悄话
昵        称:  3-24字符, 不可使用特殊字符 *
安全规则: 请输入规则答案: 2+5=? *
 
Language Package
  • ENGLISH
  • 简体中文
用户面板
用户名:
密码:
安全规则: 2+5=?
注册
分类
  • Blog首页
  • Android [2] Android RSS Feed
  • Diary & Misc [115] Diary & Misc RSS Feed
  • Web Dev [112] Web Dev RSS Feed
  • Never Modules(JS) [12] Never Modules(JS) RSS Feed
  • Flash & Flex & Air [4] Flash & Flex & Air RSS Feed
  • PHP & Apache [1] PHP & Apache RSS Feed
  • XML [7] XML RSS Feed
  • CSS [7] CSS RSS Feed
  • ASP & .NET [3] ASP & .NET RSS Feed
  • Literature Archives [4] Literature Archives RSS Feed
  • Design [17] Design RSS Feed
  • Visual Basic [3] Visual Basic RSS Feed
最新评论
  • [cry] 非常感谢,这是我...
  • 很精彩,学习了:) [smi...
  • 很精彩
  • 好文,收藏至20ju.com
  • 好文,收藏至20ju.com
  • 弹出的匹配框不能随着页...
  • @lily 多年前的东西了,...
  • 为什么在chrome中不支持...
  • @gzman 那阵子确实想蛮多...
  • 兄弟,想太多了吧
  • [smile] [wink] [sweat] ...
  • javascript:insertSmilie...
  • 我新建了两个sliderbar都...
  • 不错哦````````
  • 好文,收藏至20ju.com
搜索

统计数据
日志: 287
评论: 853
引用: 0
用户: 117
到访: 4144628
在线: 1

新浪微博
Links
  • 阿肆
  • 好奇
  • 小龙人
  • 小萌
  • Zerray
  • realdodo
  • ps album
  • my flickr
  • XiaoFeng
  • 神~ORZ
  • Jiuan's blog
  • yanpeng's blog
  • zhoux's blog
  • winter
  • aoao
  • jerry.qu
  • JoelLeung
  • monyer
  • Miller
  • PuterJam
  • Terry
  • JK
  • akira
  • dh20156's New World!
  • Joshua
  • Estyle
  • 互联网人
  • 兔子
  • 电脑爱好者
  • 阿笨狗
Favorite
  • leica china
  • Douglas Crockford
  • dhteumeuleu
  • regexplib
  • webfx
  • ajaxian
  • John Resig
  • dean
  • Adam McCrea
  • css beauty
  • livepipe
  • smashing magazine
  • ericlippert
  • narcissus
  • PPK
widget

Powered by LBS Version 2.0.304 © 2003-2005 SiC/CYAN. - Template writen by never-online - 桂ICP备07010684号
17 DB Queries | Proccessed in 141ms