JavaScript高级程序设计——第十一章(DOM扩展)

本文介绍Selectors API中的querySelector和querySelectorAll方法,用于高效地选取DOM元素。同时,探讨了HTML5新增的getElementByClassName方法,classList属性的实用功能,自定义数据属性的使用,以及innerHTML和outerHTML属性的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.选择符API

Selectors API是W3C发起制定的一个标准,致力于让浏览器原生支持CSS查询。Selectors API的核心的两个方法:querySelector()querySelectorAll(),可以通过Document和ELement类型的实例调用它们。

  • querySelector()

    //取得body元素
    var body = document.querySelector('body')
    
    //取得类为‘button’的第一个图像元素
    var img = document.body.querySelector('img.button')
    

    通过Docuemnt类型调用querySelector()方法时,会在文档元素的范围内查找匹配的元素,而通过Element类型调用querySelector()方法时,只会在该元素后代元素的范围内查找匹配的元素

  • querySelectorAll()
    querySelectorAll()方法接受的参数与querySelector()方法一样,都是一个css选择符,但返回的是所有匹配的元素而不仅仅是一个元素。该方法返回的是一个NodeList实例

二.HTML5

HTML5添加的**getElementByClassName()**可以通过documen对象及所有HTML元素元素调用该方法。

//取得ID为‘myDiv’的元素中带有类名‘divClass’的所有元素
	var selected = document.getElementById('myDiv').getElementByClassName('divClass')

需要注意的是,这个方法返回的对象是NodeList,与getElementByTagName类似。

classList属性:我们在操作类名时,需要通过className属性添加,删除,替换类名。但是这样操作需要遍历类名进行操作,代码量比较大,HTML5添加了一个classList属性,可以直接操作修改多个class类名。

  • add:将给定的字符串值添加到列表中。如果已经存在,就不添加。
  • contains:表示列表中是否存在给定的值,如果存在则返回true,不存在则返回false。
  • remove:从列表中删除给定的字符串。
  • toggle:如果列表中已经存在给定的值,则删除它;如果不存在则添加它。
<div class = 'bd user disabled'>...</div>

var div = document.querySelector('div')
div.classList.remove('user')  //删除类名为user的类
div.classList.add('current')  //添加类名为current的类

自定义数据属性:HTML5规定可以为元素添加非标准的属性,但要添加前缀data-,目的是为元素提供与渲染无关的信息,或者提供语义信息。
添加了自定义属性后,可以通过dataset属性来访问自定义属性的值。

<div id = 'myDiv' data-appID = '123' data-name = 'hjh'>666</div>

var div = document.getElementById('myDiv')
var appId = div.dataset.appId
var name = div.dataset.name

插入标记

  • innerHtml属性:在读模式下,innerHtml会返回与调用元素的所有子节点对应的HTML标记。在写模式下,innerHtml会根据指定的值创建新的DOM树,然后用这个DOM树完全替换调用元素原先的所有子节点
    使用innerHtml属性也有一些限制:比如,在大多数浏览器中,通过innerHtml添加<script>元素并不会执行其中的脚本。IE8及更早的版本是唯一能在这种情况执行脚本的浏览器。(需要满足一些条件,详情见书哦)。

  • outerHtml属性:在读模式下,outerHtml返回调用它的元素及所有子元素及所有子节点的HTML标签。在写模式下,outerHtml会根据指定的HTML字符串创建新的DOM子树,然后用这个DOM子树完全替换调用元素。(调用outerHtml的元素也会被替换

    内存与性能问题:使用述替换子节点的方法可能会导致浏览器的内存占用问题。假设某个元素有一个事件处理程序,在使用上述某个属性将元素从文档树种除后,元素与事件处理程序之间的绑定关系在内存中并没有一并删除。这种情况如果频繁出现,页面占用的内存数量就会明显增加。所以,最好先手动删除要被替换的元素的所有事件处理程序和JavaScript对象属性
    比如:我们可以先创建多个节点再一次innerHtml,比一次次innerHtml效率高的多,因为在设置innerHtml和outHtml时,会创建一个HTML解析器。创建和销毁HTML解析器会带来性能的损失

    //尽量避免这种操作
    for(var i = 0,i<100;i++){
    	ul.innerHtml += '<li>' + 666 + '</li>'
    }
    
    //这样操作能避免性能的损失
    var itemsHtml = ''
    for(var i = 0,i<100;i++){
    	itemsHtml += '<li>' + 666 + '</li>'
    }
    ul.innerHtml = itemsHtml
    

三.专有扩展

  1. contains()方法
    在实际开发中,经常需要知道某个节点是不是另一个节点的后代。这个方法接受一个参数,即要监测的后代节点,如果被检测的节点时后代节点,该方法返回true。否则返回false。

    alert(document.documentElement.contains(document.body))  //true
    
  2. 插入文本

  • innerText:通过innerText属性可以操作元素中包含的所有文本内容,包括子文档树中的文本。

    <div id = 'content'>
    	<p>hello world</p>
    	<ul>
    		<li>item1</li>
    		<li>item2</li>
    		<li>item3</li>
    	<ul>
    </div>
    
    var div = document.getElementById('content')
    alert(div.innText)  //hello world item1 item2 item3
    
    div.innerText = 'hello world'
    //则div变成
    <div id = 'content'>hello world</div>
    

    所以我们如果想通过innerText属性过滤掉HTML标签。方法就是:div.innerText = div.innerText

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值