JavaScript取HTML DOM一个元素的前一个元素引出的问题

朋友“小平的 fans ”和我讨论一个问题,他发一个文件给我,说 JavaScript 不能取到一个元素的前一个元素。

test.html 代码如下

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" >

< html >

    < head >

       < title > test </ title >

       < script type = "text/javascript" >

           function f(){               

                 var sub = document.getElementById( "ME-26934" );

sub = sub.previousSibling; 

alert(sub .getAttribute( "id" ) );

         }

    </ script >     

    </ head >

    < body onload = "f();" >

  < input type = "text" id = "ME-26933" value = "aaa" > dddddd </ input >

  < input type = "text" id = "ME-26934" > eeee </ input >

  < input type = "text" id = "ME-26935" > rrr </ input >

    </ body >

</ html >

这个问题我遇到过, previousSibling 返回元素之前紧随的兄弟节点。

元素后面会有一个文本节点,无论它是不是含有文本。所以这里的脚本应修改

sub = sub .previousSibling .previousSibling;

alert(sub.getAttribute( "id" ));

我用的 FireFox3.6 ,试了下,可以了,就发给朋友。

过了一会儿他回复说, IE6 下还是不行,输出( alert )了空字符串。

我实验了下,果真不行,看不出来出了什么问题。

sub = sub.previousSibling.previousSibling;

alert(sub.nodeType+ ":" +sub.getAttribute( "id" ));

IE6 输出的是 1:

1 代表的是元素 element ,这没错啊,取到元素了。

我首先想到的是令人郁闷的浏览器差异,惯性的想是不是方法兼容问题。

于是试着换了几个方法、属性,结果都不行。

正卡壳,忽然想到干嘛这么毫无逻辑的瞎猜,既然有输出(虽然是空字符串),那么方法是可用的,可能是取错了。

alert(sub.nodeType+ ":" +sub.tagName);

IE6 下输出的是 1:/INPUT

发现问题了!

< input type = "text" id = "ME-26933" value = "aaa" > dddddd </ input >

IE6 下这种书写格式,同级节点分别是: <input> 元素、 </input> 元素 、文本节点。

FireFox3.6 <input> 元素 &</input> 元素算一个元素。

如此,问题迎刃而解。整理后的文档如下:

test.html 文件

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" >

< html >

    < head >

       < title > test </ title >

       < script type = "text/javascript" >

           function f(){               

                 var sub = document.getElementById( "ME-26934" );

                  sub = sub.previousSibling.previousSibling; 

alert(sub.nodeType+ ":" +sub.tagName+ ":" +sub.getAttribute( "id" ));

               

                 var sub1 = document.getElementById( "ME-26935" );

                 sub1 = sub1.previousSibling.previousSibling;

alert(sub1.nodeType+ ":" +sub1.tagName);

         }

    </ script >     

    </ head >

    < body onload = "f();" >

  < input type = "text" id = "ME-26933 " value = "aaa" /> dddddd

  < input type = "text" id = "ME-26934" > eeee </ input >

  < input type = "text" id = "ME-26935" > rrr </ input >

    </ body >

</ html >

 

第一个 alert 1:INPUT: ME-26933

第二个 alert 1:/INPUT

 

小结: 1. < input type = "text" id = "ME-26933" value = "aaa" > dddddd </ input >

IE6 下这种书写格式,同级节点分别是: <input> 元素、 </input> 元素、文本节点。

2. 分析问题要条理清晰,步步为营,而不是“投机式”的试错,虽然有些时候“投机式”方法能够快速的解决问题,但分析问题就不太适用了,什么问题用什么方法。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值