document.getElementById或者只使用id
一、如果一个元素有id特性(attribute),那我们就可以使用document.getElementById(id)方法获取该元素,无论它在哪里。
【示例1】
<div id="elem">
<div id="elem-content">Element</div>
</div>
<script>
// 获取该元素
let elem = document.getElementById('elem');
// 将该元素背景改为红色
elem.style.background = 'red';
</script>
【示例2】一个通过id命名的全局变量,它引用了元素
<div id="elem">
<div id="elem-content">Element</div>
</div>
<script>
// elem 是对带有 id="elem" 的 DOM 元素的引用
elem.style.background = 'red';
// id="elem-content" 内有连字符,所以它不能成为一个变量
// ...但是我们可以通过使用方括号 window['elem-content'] 来访问它
</script>
1、除非我们声明一个具有相同名称的JavaScript变量,否则它具有优先权
<div id="elem"></div>
<script>
let elem = 5; // 现在 elem 是 5,而不是对 <div id="elem"> 的引用
alert(elem); // 5
</script>
2、请不要使用以id命名的全局变量来访问元素。
(1)在规范中对此行为进行了描述,所以它是一种标准。但这是注意考虑到兼容性才支持的。
①优点
浏览器尝试通过混合JavaScript和DOM的命名空间来帮助我们。
对于内联到HTML中的简单脚本来说,这还行。
②缺点
当人们阅读JavaScript代码且看不到对应的HTML时,变量的来源就会不明显。
3、id必须是唯一的。
(1)如果有多个元素都带有同一个id,那么使用它的方法的行为是不可预测的。
【示例1】document.getElementById,可能会随机返回其中一个元素。
querySelectorAll
一、elem.querySelectorAll(css),它返回elem中与给定CSS选择器匹配的所有元素。
【示例1】查找所有为最后一个子元素的
<ul>
<li>The</li>
<li>test</li>
</ul>
<ul>
<li>has</li>
<li>passed</li>
</ul>
<script>
let elements = document.querySelecorAll('ul > li:last-child');
for (let elem of elements) {
alert(elem.innerHTML); // 'test', 'passed'
}
</script>
二、也可以使用CSS选择器的伪类
【示例1】以下代码将会返回鼠标指针现在已经结束的元素的集合(按嵌套顺序:从最外层到嵌套最多的元素)
document.querySelectorAll(':hover')
querySelector
一、elem.querySelector(css)调用会返回给定CSS选择器的第一个元素。
二、其结果与elem.querySelectorAll(css)[0]相同,但是后者会查找所有元素,并从中选取一个,而elem.querySelector只会查找一个。因此它在速度上跟快,并且写起来更短。
matches
一、elem.matches(css)不会查找任何内容,它只会检查elem是否与给定的CSS选择器匹配。它返回true或false。
【示例1】遍历元素(例如数组或其他内容)并试图过滤那些我们感兴趣的元素时,这个方法会很有用。
<a href="http://example.com/file.zip">...</a>
<a href="http://ya.ru">...</a>
<script>
// 不一定是document.body.children,还可以是任何集合
for (let elem of document.body.children) {
if (elem.matches('a[href$="zip"]')) {
alert('the archive reference:' + elem.href)
}
}
</script>
二、elem.matches(css)用于检查elem与给定的CSS选择器是否匹配。
closest
一、元素的祖先(ancestor)是:父级,父级的父级,它的父级等。
1、祖先们一起组成了从元素到顶端的父级链。
二、elem.closest(css)方法会查找与CSS选择器匹配的最近的祖先。elem自己也会被搜索。
三、总结来说,方法closest在元素中得到了提升,并检查每个父级。如果它与选择匹配,则停止搜索并返回给该祖先。
【示例1】
<h1>Contents</h1>
<div class="contents">
<ul class="book">
<li class="chapter">Chapter 1</li>
<li class="chapter">Chapter 1</li>
</ul>
</div>
<script>
let chapter = document.querySelector('.chapter'); // LI
alert(chapter.closest('.book')); // UL
alert(chapter.closest('.contents')); // DIV
alert(chapter.closest('h1;)); // null (因为h1不是祖先)
</script>
getElementsBy*
一、elem.getElementsByTagName(tag)查找具有给定标签的元素,并返回给它们的集合。tag参数也可以是对于“任何标签”的星号“*”.
二、elem.getElementsByClassName(className)返回具有给定CSS类的元素。
三、document.getElementsByName(name)返回在文档范围内具有给定name特征的元素。
【示例1】
// 获取文档中的所有div
let divs = document.getElementsByTagName('div')
// 查找table中的所有input标签
<table id="table">
<tr>
<td>Your age:</td>
<td>
<label>
<input type="radio" name="age" value="young" checked> less than 18
</label>
<label>
<input type="radio" name="age" value="mature"> from 18 to 50
</label>
<label>
<input type="radio" name="age" value="senior"> more than 60
</label>
</td>
</tr>
</table>
<script>
let inputs = table.getElementsByTagName('input');
for (let input of inputs) {
alert( input.value + ': ' + input.checked );
}
</script>
1、返回的是一个集合,不是一个元素
// 错误写法
document.getElementsByTagName('input').value = 5;
// 正确写法(如果有input)
document.getElementsByTagName('input')[0].value = 5;
【示例2】查找.article元素
<form name="my-form">
<div class="article">Article</div>
<div class="long article">Long article</div>
</form>
<script>
// 按 name 特性查找
let form = document.getElementsByName('my-form')[0];
// 在 form 中按 class 查找
let articles = form.getElementsByClassName('article');
alert(articles.length); // 2, found two elements with class "article"
</script>
getElementsBy*、querySelectorAll返回的集合的区别
一、所有的”getElementsBy*”方法都会返回一个实时的(live)集合。这样的结合始终反映的是文档的当前状态,并且在文档发生更改时会“自动更新”。
【示例1】下面有2个脚本
第一个创建了对
第二个脚本在浏览器再遇到一个
<div>First div</div>
<script>
let divs - document.getElementsByTagName('div');
alert(divs.length); // 1
</script>
<div>Second div</div>
<script>
alert(divs.length); // 2
</script>
二、querySelectorAll返回的是一个静态的集合。就像元素的固定数组。
【示例1】如果我们使用它,两个脚本都会输出1。
<div>First div</div>
<script>
let divs = document.querySelectorAll('div');
alert(divs.length); // 1
</script>
<div>Second div</div>
<script>
alert(divs.length); // 1
</script>
总结
一、在DOM中搜索节点
Method | Searches by… | Can call on an element? | Live |
---|---|---|---|
querySelector | CSS-selector | ✔ | - |
querySelectorAll | CSS-selector | ✔ | - |
getElementById | id | - | - |
getElementsByName | name | - | ✔ |
getElementsByTagName | tag or ‘*’ | ✔ | ✔ |
getElementsByClassName | class | ✔ | ✔ |
1、20210305,目前为止,最常用的是querySelector和querySelectorAll,但是getElement(s)By*可能会偶尔有用,或者可以在就脚本中找到。
二、contains可用来检查子级与父级之间关系的方法,因为它有时很有用
【示例1】如果elemB在elemA(elemA的后代)或者elemA==elemB, elmA.contains(elemB)将返回true。