js DOM操作时childNodes的空格问题解决方法

问题描述:把下面左边的四个节点一次性全部移到右边或把右边的节点一次性移到左边(>>右移,<<左移),


开始的实现是这样的:

<html>
  <head>
    <title>MyHtml.html</title>    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
   <script type="text/javascript">     
       function allToRigth(){
           var nodes = document.getElementById("leftSelect").childNodes;//得到leftSelect的所有孩子节点
           for(var i = 0; i < nodes.length; i ++){  //遍历所有孩子节点
               if(nodes [i].nodeType == 1){         
                   document.getElementById("rightSelect").appendChild(nodes[i]);  //当孩子节点是元素节点时就右移               
               }
            }
       }
           
       function allToLeft(){
           var nodes= document.getElementById("rightSelect").childNodes;//得到rightSelect的所有孩子节点
           for(var i = 0; i < nodes.length; i ++){//遍历所有孩子节点
              if(nodes[i].nodeType == 1){
                  document.getElementById("leftSelect").appendChild(nodes[i]);     //当孩子节点是元素节点时就左移             
              }
           }
       }
     
   </script>
  </head>
  
  <body>
    <table width="200">
       <td>
           <select size="4" id="leftSelect">
               <option>hadoop</option>
               <option>hbase</option>
               <option>hive</option>
               <option>pig</option>
           </select>
       </td>
              
       <td>
           <input type="button" value=">>" id="allToRigth" onclick="allToRigth()"><br>
           <input type="button" value="<<" id="allToLeft" onclick="allToLeft()"> 
       </td>
                
       <td>
           <select size="4" id="rightSelect">
           </select>
       </td>  
         
    </table>
  </body>
</html>

 

结果:

右移:


再左移:


(问题出现了:在再进行左移时并不能一次性把节点都移到左边)。

这里我我先分析下用 元素.childNodes 得到的节点的空格问题(测试所用浏览器及版本号:chrom
64位,IE11,火狐39.0,Edge);

现在的大部分浏览器在解析childNodes时都会把"#text"(空格,制表符,换行符等一些表示空白文本的符号)当成一个节点,但低版本的IE不会。

所以document.getElementById("leftSelect").childNodes得到的节点个数为9;


(左列表:两块黄色的部分表示一个节点,表示一个节点,有9个节点)


(右列表:两块黄色的部分表示一个节点,有1个节点)

下面是用FireBug调试的过程:

1.开始状态:


注意红色框部分,节点分别是TextNode,option,TextNode,option,TextNode,option,TextNode,option,TextNode.这9个节点(TextNode是空白文本)

2.第一个option节点移到右边后:


注意:在第一个option节点移走后,option后面的节点TextNode补了上来, 但在这次右移过程中这并不影响我们。

在全部节点移到右边后,我们来看左移这部分;

3.开始状态:有5个节点,一个TextNode节点,四个option节点。


4,第一个option节点移到左边后:


看吧,在第一个option节点移到左边后,i=2,后面的option节点补了上来,但补的位置又是已经访问过的位置(i=1)了,这样就造成了节点"遗漏"了,最后变成这样


这就是问题的根本原因了。

这里给出其中一个解决方案。

思路:在取孩子节点时我们从最后一个孩子节点开始取,这样即使移走一个孩子节点后,后面的节点补上来也不影响前面孩子节点的位置。

代码实现:

<html>
  <head>
    <title>example2.html</title>
    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
   <script type="text/javascript">     
       function allToRigth(){
           var nodes = document.getElementById("leftSelect").childNodes;//得到leftSelect的所有孩子节点
           for(var i = nodes .length-1; i >=0 ; i --){  //倒着遍历所有孩子节点
               if(nodes [i].nodeType == 1){
                   //当孩子节点是元素节点时就插入到rightSelect的第一个孩子节点之前
                     document.getElementById("rightSelect").insertBefore(nodes [i],document.getElementById("rightSelect").firstChild);
                   
               }
            }
       }
           
       function allToLeft(){
           var nodes = document.getElementById("rightSelect").childNodes;//得到rightSelect的所有孩子节点
           for(var i = nodes .length-1; i >=0 ; i --){     //倒着遍历所有孩子节点
              if(nodes [i].nodeType == 1){
                   //当孩子节点是元素节点时就插入到leftSelect的第一个孩子节点之前    
                    document.getElementById("leftSelect").insertBefore(nodes [i],document.getElementById("leftSelect").firstChild);                  
              }
           }
       }
   
   
   </script>
  </head>
  
  <body>
    <table width="200">
       <td>
           <select size="4" id="leftSelect">
               <option>hadoop</option>
               <option>hbase</option>
               <option>hive</option>
               <option>pig</option>
           </select>
       </td>
              
       <td>
          <input type="button" value=">>" id="allToRigth" onclick="allToRigth()"><br>
          <input type="button" value="<<" id="allToLeft" onclick="allToLeft()"> 
       </td>
           
       
       <td>
       <select size="4" id="rightSelect">
       </select>
       </td>
    
    </table>
  </body>
</html>

这样,无论我们怎样移动都能正常的全部移到一边。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索dom
dom childnodes、js dom childnodes、js childnodes空格、childnodes、js childnodes,以便于您获取更多的相关知识。

时间: 2024-10-30 19:17:32

js DOM操作时childNodes的空格问题解决方法的相关文章

js使用DOM操作实现简单留言板的方法_javascript技巧

本文实例讲述了js使用DOM操作实现简单留言板的方法.分享给大家供大家参考.具体分析如下: 如图所示简易留言板,也就是自娱自乐版,说白了就是练习DOM操作. 要点一:document.createElement("标签名") 新建元素 要点二:父元素.appendChild("元素")  把新建的元素插入到页面的标签中(在标签的最后一个显示),这样才会在浏览器中显示出来 要点三:父元素.insertBefore("元素","要插入哪个元

mysql 登录时闪退的问题解决方法_Mysql

mysql 登录时闪退的问题解决方法 之前mysql用着好着,可是今天在启动mysql后输入密码出现了闪退,在任务管理器中发现mysql服务没有启动,当手动启动时提示拒绝访问.在网上查找原因发现问题所在. 问题原因:mysql服务没有安装. 解决办法: 在cmd操作下找到mysql的安装目录(注意要用管理员身份运行cmd) 在 mysql bin目录下 以管理员的权限 执行 mysqld -install命令 然后仍然以管理员的权限 net start mysql 开启Mysql服务了.  输入

js使用DOM操作实现简单留言板的方法

 如图所示简易留言板,也就是自娱自乐版,说白了就是练习DOM操作. 要点一:document.createElement("标签名") 新建元素 要点二:父元素.appendChild("元素") 把新建的元素插入到页面的标签中(在标签的最后一个显示),这样才会在浏览器中显示出来 要点三:父元素.insertBefore("元素","要插入哪个元素的前面") 把新建的元素插入到页面中指定的标签前面,这样后面输入的内容才会显示到

js检测输入内容全为空格的方法_javascript技巧

JavaScript判断输入内容不能全为空格的方法,用来避免输入框的内容输入的全是空格: 复制代码 代码如下: <html> <head>  <script>   function checkBlankSpace(str){    while(str.lastIndexOf(" ")>=0){      str = str.replace(" ","");    }    if(str.length ==

JS DOM 操作实现代码_javascript技巧

简单的表格: 复制代码 代码如下: <table> <tr> <td id="TEST"> <input type="submit" value="确定"> <input type="button" value="取消"> </td> </tr> </table> 经测试: 复制代码 代码如下: var td=

Office 2007提示"向程序发送命令时出现错误"问题解决方法

  前段时间装了个win7和office 2007,但有次win7更新重启后,office 2007就出现"向程序发送命令时出现错误"的问题,也就是双击文档,会出现"向程序发送命令时出现错误",只能打开office程序,然后从程序中打开文档,而且word,excel,powerpoint都这样子,非常麻烦. 试了下PCbeta上的2个方法,都不管用! "鼠标右击桌面word(或其他)的快捷方式,选"兼容性",把以管理员身份运行此程序前的

Android输入法与表情面板切换时的界面抖动问题解决方法_Android

昨天琢磨了下Android的输入法弹出模式,突然发现利用动态切换输入法的弹出模式可以解决输入法抖动的问题.具体是怎样的抖动呢?我们先看微博的反面教材. [具体表现为:表情面板与输入法面板高度不一致,从而导致弹出输入法(layout被挤压)时,同时又需要隐藏表情面板(layout被拉升),最终让界面产生了高度差抖动,所以在切换时明显会有不大好的抖动体验)] 使用了解决抖动的解决方案后,效果如下: [这样的方案明显比微博的切换更平滑] 老样子,先说思路.主要我们要用到两个输入法弹出模式,分别是:ad

网页设计时遇到CSS BUG问题解决方法详解

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 网页切片是网页设计过程中一个非常重要的技术,能够让网站在用户的浏览器里面下载的比较快,要不然需要用户浏览器下载完整个页面才能够打开,如果用户的脾气比较急的话,你的网站可能还没有打开,这些用户就等不及关闭了网站了!如果要使用到网页切片技术,就不可避免会遇到CSS BUG问题!对于很多站长而言,或者网页设计师而言,一旦出现了CSS BUG,往往会

mysql中文查询时的字符集匹配问题解决方法

我在写一个查询条件时的问题如下: 如我想写一个字段中包含"李"字的所有记录 ?$str="李"; select * from table where field like ''%?$str%'' ; 显示的记录中除了包含"李"字的记录,还有不包含"李"字的记录.为什么? 在MySQL中,进行中文排序和查找的时候,对汉字的排序和查找结果是错误的.这种情况在MySQL的很多版本中都存在.如果这个问题不解决,那么MySQL将无法实际