JS:qurySelector和qurySelectorAll
本帖最后由 马黑黑 于 2022-3-27 22:18 编辑 <br /><br /><style type="text/css">.codeBox { margin: auto; padding: 12px 10px; max-width: 760px; box-shadow: 1px 1px 2px #ccc; border-radius: 4px; background: rgba(0, 0, 0, .25); }
.codeBox pre { font: 14px Sans-serif; color: #8b4513; }
</style>
<p>qurrySelector()是基于HTML5新增的DOM(document)方法,用于查找HTML元素,较之于 getElementByXxx() 方法集合更为简洁、直接、高效。其中,query是查询之意,Selector是选择器的意思,合起来意为查找、查询特定CSS选择器的HTML元素。现代所有浏览器都支持该方法。<br><br></p>
<p>如上已述,querySelector()可以获取基于CSS选择器的HTML元素,意思是只要元素具备id、class之类的属性,该方法就可以找到并获得操作句柄。例如:<br><br></p>
<p>
<span style='color: blue'>var</span> ele = <span style='color: red'>document</span>.querySelector(<span style='color: magenta'>"#myBox"</span>); <span style='color: green'>//获得 id=<span style='color: magenta'>"myBox"</span> 的元素句柄</span><br>
<span style='color: blue'>var</span> ec = <span style='color: red'>document</span>.querySelector(<span style='color: magenta'>".myDiv"</span>); <span style='color: green'>//获得 class=<span style='color: magenta'>"myDiv"</span> 的元素句柄</span>
<br><br></p>
<p>值得注意的是,当要获取的对象元素是类选择器,querySelector()方法得到的是web document文档流中此类元素第一个出现的元素,它不管后面的其他同类元素。所以,JS还提供另一个方法,querySelectorAll(),它可以操纵document中所有的相同类名的选择器。举个热乎乎的栗子:<br><br></p>
<p>
<span style='color: blue'>var</span> qb = <span style='color: red'>document</span>.querySelectorAll(<span style='color: magenta'>".book"</span>);<br>
<span style='color: blue'>if</span>(qb.length>0) qb.style.color = <span style='color: magenta'>"red"</span>;
<br><br></p>
<p>上栗中,我们查找到所有 class="book" 的元素,如果有(qb.length>0表示至少有一个),则将最后一个的前景色设置为红色。当然,我们还可以来个骚操作,把全部的元素文本设置为红色:<br><br></p>
<span style='color: blue'>if</span>(qb.length>0) {<br>
for(<span style='color: blue'>var</span> key <span style='color: blue'>in</span> qb){<br>
<span style='color: blue'>if</span>(parseInt(key)<=qb.length) qb.style.color = <span style='color: magenta'>"red"</span>;<br>
}
}
<br><br></p>
<p>改变前景色语句 qb.style.color = "red" 执行之前我们用了一个条件语句,如果key的值小于等于qb数组长度,key还做了强制整数转换,这是为什么呢?for in 循环的循环变量 key 不是数值变量,是字符串变量,但在数组里,但key是以 0、1、2、3等看上去是数字的形式出现的,所以强制它为数值变量没啥问题,我们这么做主要是让key变量与qb数组长度作比较,防止对不存在的元素进行上色操作。<br><br></p>
<div class="codeBox">
<pre>
<<span style='color:darkred'>div</span> <span style='color: red'>id</span><span style='color: blue'>=</span><span style='color: magenta'>"a"</span> <span style='color: red'>class</span><span style='color: blue'>=</span><span style='color: magenta'>"book"</span>>
This is div1<<span style='color:darkred'>br</span>>
<<span style='color:darkred'>div</span> <span style='color: red'>id</span><span style='color: blue'>=</span><span style='color: magenta'>"b"</span> <span style='color: red'>class</span><span style='color: blue'>=</span><span style='color: magenta'>"book bag"</span>>Hi this is div2<<span style='color: darkred'>/div</span>>
<<span style='color: darkred'>/div</span>>
<<span style='color:darkred'>p</span> <span style='color: red'>id</span><span style='color: blue'>=</span><span style='color: magenta'>"c"</span> <span style='color: red'>class</span><span style='color: blue'>=</span><span style='color: magenta'>"book"</span>>Hello this is P<<span style='color: darkred'>/p</span>>
<script>
<span style='color: blue'>var</span> qb = <span style='color: red'>document</span>.querySelectorAll(<span style='color: magenta'>".book"</span>);
<span style='color: blue'>if</span>(qb.length>0) {
for(<span style='color: blue'>var</span> key <span style='color: blue'>in</span> qb){
<span style='color: blue'>if</span>(parseInt(key)<=qb.length) qb.style.color = <span style='color: magenta'>"red"</span>;
}
}
</script>
</pre>
</div>
<p>以下是上述代码的运行情况:<br><br></p>
<div id="a" class="book">
This is div1<br>
<div id="b" class="book bag">Hi this is div2</div>
</div>
<p id="c" class="book">Hello this is P</p>
<script>
var qb = document.querySelectorAll(".book");
if(qb.length>0) {
for(var key in qb){
if(parseInt(key)<=qb.length) qb.style.color = "red";
}
}
</script>
本帖最后由 马黑黑 于 2022-3-27 11:44 编辑
二楼效果中,我们没有用CSS定义各元素的前景色,HTML代码也没有指定文本颜色:
<div id="a" class="book">
This is div1<br>
<div id="b" class="book bag">Hi this is div2</div>
</div>
<p id="c" class="book">Hello this is P</p>
如果是document.querySelector(".book") 是不是第二个就不会上色了? 不知道黑黑讲这个是准备派什么用途的{:4_204:} 红影 发表于 2022-3-27 13:48
如果是document.querySelector(".book") 是不是第二个就不会上色了?
是的,它只针对第一个 红影 发表于 2022-3-27 13:49
不知道黑黑讲这个是准备派什么用途的
已经用上了,彩色球的两个帖子,一个送给你的 马黑黑 发表于 2022-3-27 14:42
是的,它只针对第一个
哦哦,嗯,现在理解了。 马黑黑 发表于 2022-3-27 14:43
已经用上了,彩色球的两个帖子,一个送给你的
哦哦,原来是对那个帖子的进一步解说。我看到难的部分就自动跳过了,所以印象不深{:4_189:} 红影 发表于 2022-3-27 20:55
哦哦,原来是对那个帖子的进一步解说。我看到难的部分就自动跳过了,所以印象不深
获得web元素是基本功,JS控制它需要这个前提。实现方法不少,querySelector是方法之一 红影 发表于 2022-3-27 20:54
哦哦,嗯,现在理解了。
知识点太多太零散 马黑黑 发表于 2022-3-27 22:17
获得web元素是基本功,JS控制它需要这个前提。实现方法不少,querySelector是方法之一
嗯,获得元素,进行控制,然后在html里展现。 马黑黑 发表于 2022-3-27 22:18
知识点太多太零散
没事,一点点学习,最后融会贯通{:4_187:} 红影 发表于 2022-3-27 23:06
没事,一点点学习,最后融会贯通
应该是这样的 马黑黑 发表于 2022-3-27 23:35
应该是这样的
谢谢黑黑的耐心讲解。 红影 发表于 2022-3-28 11:16
谢谢黑黑的耐心讲解。
能理解就好 马黑黑 发表于 2022-3-28 12:02
能理解就好
跟着看的时候大都能理解,只是过后常常又迷糊了{:4_173:} 红影 发表于 2022-3-28 16:26
跟着看的时候大都能理解,只是过后常常又迷糊了
嗯,这个需要一个过程 马黑黑 发表于 2022-3-28 18:05
嗯,这个需要一个过程
希望能尽快熟悉起来。 红影 发表于 2022-3-28 20:19
希望能尽快熟悉起来。
会的