当前位置: 首页 > news >正文

为什么要点两下才能删除一个li节点 原来是空白节点作怪

奇怪吧,下面的代码居然要点两次button才能删除一个li节点:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <title> New Document </title>
 </head>

 <body>
<ul id="myUl"> <!-- 这样会有空白节点  -->
<li>111</li>
<li>222</li>
<li>333</li>
</ul>

  <button onclick="removeLi();" >removeLi</button>
 </body>
</html>

<script type="text/javascript">
<!--
    // 奇怪吗?为什么要点两下
    function removeLi(){
        var ul=document.getElementById("myUl");
        var li=ul.firstChild;
        ul.removeChild(li);        
    }
//-->
</script>

 

用ul.childNodes.length查看一下,原来是空白节点在作怪,这样就好了:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <title> New Document </title>
 </head>

 <body>
<ul id="myUl"><li>111</li><li>222</li><li>333</li></ul> <!-- 这样就消除了空白节点,firstChild是第一个li了  -->

  <button onclick="removeLi();" >removeLi</button>
 </body>
</html>

<script type="text/javascript">
<!--
    // 现在一下就删除li
    function removeLi(){
        var ul=document.getElementById("myUl");
        var li=ul.firstChild;
        ul.removeChild(li);        
    }
//-->
</script>

选ul的子节点时限定li也可行:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <title> New Document </title>
 </head>

 <body>
<ul id="myUl">
<li>111</li>
<li>222</li>
<li>333</li>
</ul>

  <button onclick="removeLi();" >removeLi</button>
 </body>
</html>

<script type="text/javascript">
<!--
    // 
    function removeLi(){
        var ul=document.getElementById("myUl");
        var li=ul.getElementsByTagName("li")[0];// 这样直接无视空白节点,是推荐做法
        ul.removeChild(li);        
    }
//-->
</script>

 

相关文章:

  • 《中国人工智能学会通讯》——3.30 改革性成就
  • spring+SpringMVC+mybati整合JBPM
  • 《逻辑与计算机设计基础(原书第5版)》——3.7 选择
  • 为什么运营商玩不转物联网?
  • 商业WiFi将与4G网络长期共存
  • Java Python 未修复漏洞导致跨越防火墙大混乱
  • 《中国人工智能学会通讯》——2.30 2015人工智能重大突破
  • 希望云安全为客户提供灵活安全防护策略
  • mybatis的模糊查询写法
  • 布局云计算:OpenFabric数据中心显身手
  • 更多存储:Facebook公司革新设计提高磁盘密度
  • 成都规划建设统一大数据中心 非涉密政务信息上“云”
  • IntPtr 转 string
  • Shiro的记住我功能失效原因
  • Django内置Admin
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 2017-08-04 前端日报
  • CentOS 7 防火墙操作
  • JavaScript设计模式系列一:工厂模式
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Vim 折腾记
  • vue 个人积累(使用工具,组件)
  • 多线程 start 和 run 方法到底有什么区别?
  • 技术:超级实用的电脑小技巧
  • 区块链共识机制优缺点对比都是什么
  • 深入浅出Node.js
  • 通信类
  • 微信公众号开发小记——5.python微信红包
  • ionic入门之数据绑定显示-1
  • Mac 上flink的安装与启动
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​油烟净化器电源安全,保障健康餐饮生活
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • $.ajax中的eval及dataType
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)JAVA中的堆栈
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .net操作Excel出错解决
  • .NET中使用Redis (二)
  • .NET中统一的存储过程调用方法(收藏)
  • /bin/bash^M: bad interpreter: No such file or directory
  • @KafkaListener注解详解(一)| 常用参数详解
  • @selector(..)警告提示
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [Angular] 笔记 8:list/detail 页面以及@Input
  • [AR Foundation] 人脸检测的流程
  • [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [C++数据结构](31)哈夫曼树,哈夫曼编码与解码