document.querySelectorAll() 函数不适用于所有元素
document.querySelectorAll() function not working on all elements
我正在使用document.querySelectorAll()
函数来捕获<li>
列表中的<a>
,但该函数不适用于我必须像这样定义的所有元素document.querySelectorAll('//elements')[0]
,document.querySelectorAll('//elements')[1]
如果我这样定义,它仅适用于该索引上的元素。
我认为对所有元素进行这样的定义并不好。谁能告诉我我错在哪里,为什么它不适用于所有元素。
这是我当前的代码
.HTML
<ul class="questions">
<li>
<a href="#" class="clearfix"><span class="faq_name">My Account</span><span class="arrow"><img src="images/plus.png"></span></a>
<div class="answerswer_box">
<p>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. </p>
</div>
</li>
<li>
<a href="#" class="clearfix"><span class="faq_name">Categories</span><span class="arrow"><img src="images/plus.png"></span></a>
<div class="answerswer_box">
<p>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. </p>
</div>
</li>
<li>
<a href="#" class="clearfix"><span class="faq_name">Trouble with check-in</span><span class="arrow"><img src="images/plus.png"></span></a>
<div class="answerswer_box">
<p>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. </p>
</div>
</li>
</ul>
.JS
document.querySelectorAll('.questions li a').onclick = function() {myFunction()};
function myFunction(){
alert('asd');
};
querySelectorAll
返回元素集合。DOM 没有"基于集合"的功能,允许您在一个语句中将处理程序分配给整个集合(jQuery 库可以,如果您喜欢使用它),您必须使用循环。
例如:
Array.prototype.forEach.call(
document.querySelectorAll('.questions li a'),
function(element) {
element.onclick = myFunction;
}
);
function myFunction(){
alert('asd');
}
在那里,我们使用Array#forEach
来循环访问集合(因为它可以用于任何类似数组的对象,而不仅仅是数组)。您在此答案的"类似数组"部分中概述了其他几个选项。
旁注 1:我直接在上面使用了MyFunction
,因为它包装在一个只调用它的函数中似乎没有必要,但这会改变它收到的参数,因此如果需要,请添加一个包装器。
旁注2:虽然我没有在上面更改它,但我强烈建议使用addEventListener
(如果您必须支持IE8或IE9-IE11的损坏"兼容模式",则attachEvent
)而不是onclick
。
旁注 3:对于此特定用例,您可以研究事件委托,而不是向每个元素添加处理程序。在事件委派中,您将一个处理程序添加到包含所有链接的容器中(可能是document.body
,但通常有一个更靠近它们的容器更合适),然后当事件发生时,您可以查看它是否在冒泡时通过匹配元素。
旁注4:在你只想要第一场比赛的情况下,querySelectorAll(...)[0]
,使用querySelector(...)
。它返回第一个匹配项,如果没有匹配项,则返回null
。
您需要将"HTMLcollection"转换为数组,然后循环该数组以将事件侦听器绑定到每个元素。
通过在"类似数组的对象"上"calling"
Array.prototype.slice,slice
迭代并填充返回的新数组。然后,可以在该数组上使用数组方法。
Array.prototype.slice.call(document.querySelectorAll('.questions li a'))
//converts HTMLCollection to an array
//or Array.apply(null ,document.querySelectorAll('.questions li a'))
.forEach(function(element){
element.onclick = function(){
//do something
}
})
我找到了一种更简单的循环方法,其中循环将运行到元素的长度
var question = document.querySelectorAll('.questions li a');
var i;
for(i=0;i<question.length;i++){
question[i].addEventListener('click',myFunction)
}
function myFunction(){
alert('adasd');
}
每件事都是一样的,只是调用点击循环。
- 制作 JavaScript 代码适用于任何元素
- 在调整大小和加载时移动 DOM 元素.仅适用于调整大小
- 插件总是只得到最后一个实例,如何让它适用于多个元素
- 我想放一个JS函数,它适用于列表的所有元素,但我可以't将其复制到每个元素中
- JQuery验证仅适用于提交的表单中的第一个元素.[打算验证所有内容]
- 为什么 .data() 适用于一组元素,但不适用于单个元素
- 如何让我的 jQuery 代码适用于所有元素
- 绑定函数仅适用于最后一个元素
- jQuery ID 选择器仅适用于第一个元素
- document.getElementById 适用于一个表单元素,但不适用于另一个表单元素
- 弹出模式仅适用于表格中的第一个元素,第二次单击后不会再次打开
- 代码仅适用于找到的第一个元素,存在多个具有相同 id 的元素
- jQuery.data() 仅适用于附加的元素
- javascript函数只适用于第一个元素
- 在backbonejs视图中,keypress/keyup/keydown事件是否仅适用于输入,而不适用于其他元素
- JQuery fadeOut仅适用于第一个元素
- JS函数只适用于一个(第一个)元素
- aria-expanded和aria-haspopup属性是否适用于元素
- jQuery . addclass()和. removeclass()只适用于元素的第一个实例
- 原型集属性是否适用于元素类选择器