- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下 DOM 结构:
var parent = document.querySelector(".test");
var navChild = parent.querySelectorAll("ul > li > a");
for (i = 0; i < navChild.length; i++) {
navChild[i].style.backgroundColor = "red";
}
console.log(navChild.lenght);
console.log(navChild);
<!-- begin snippet: js hide: false console: true babel: false -->
<ul>
<li class="test">
<a>ssss</a> <!--this will also be affected -->
<ul>
<li><a>fsfsf</a></li>
<li><a>sff</a></li>
<li><a>ggg</a></li>
</ul>
</li>
</ul>
我想使用 vanilla javascript 选择 3 个 a
标签,并从带有类测试的 li
开始。我将它放在 parent
变量中,然后使用 querySelectorAll 尝试仅获取下一个列表中的 a
标记。但是,返回的节点列表还包括第一个 a
标记,即使它不是后代。这是我的代码:
var navChild = parent.querySelectorAll("ul > li > a");
真正奇怪的是,如果我只查询 li
后代,我只会得到 3。所以我不明白为什么当我查询 li< 的子后代时
我还得到了第一个 a
标记,它在 DOM 上向上两层。
我知道我可以使用 jQuery 来做到这一点,但我不想使用它。
已编辑以展示我如何设置父变量
在第一个 a
上按下输入键盘按钮后,我试图将那些 a
标记添加到 childs
变量> 我不想包含在子节点列表中的标记。
var alinks = document.querySelectorAll('.test > a');
[].forEach.call(alinks, function(link){
link.addEventListener('keyup', function(e){
e.preventDefault();
if(e.keyCode === 13) {
var linkParent = e.target.parentElement;
var childs = menuParent.querySelectorAll('ul > li > a');
}
})
});
当我登录 linkParent
时,它被正确设置为 li
类 test
。我不明白为什么如果我从那里运行查询,它仍然包含第一个 a
标记。正如我之前所说,如果我只查询 ul > li
,它会给我正确的 li
标签。
最佳答案
这是因为第一个<a>
您试图忽略的标签仍然属于选择器规则 ul > li > a
.因此,即使您使用 <li class="test">
开始查询作为根(顺便说一句,我不知道为什么其他答案说文档仍然是根),它找到的第一个子元素是 <a>
标签,事实上,它是 <li>
的 child 这是 <ul>
的 child .这最终会“超过”您指定的根的事实将被忽略。
编辑:如果您希望选择器规则也限定在根目录中,您可以改用它:
parent.querySelectorAll(":scope ul > li > a");
并进一步说明,browser CSS engines evaluate CSS rules right-to-left .在您看来,您希望浏览器从根目录(父级 <li class="test">
)开始,然后找到 <ul>
标记,然后找到一个 <li>
标记,然后找到一个 <a>
标签。
但是,浏览器从根目录开始,然后查找所有 <a>
根下面的标签。然后它检查是否 <a>
标记在 <li>
内然后如果<li>
在 <ul>
内.所以 <li class="parent">
标记确实是根,但之后它不遵循选择器规则的从左到右的层次结构,而是从右到左。
关于javascript - 带有后代的 queryselectorAll 没有正确选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49545252/
我有以下内容: var searchSuggestionsItems = document.querySelectorAll("#search-user-results .live-search-re
我正在尝试查找具有以下内容的元素: doc.querySelectorAll('#divContentList article'); 它运行良好,但另一位开发人员告诉我我应该写: doc.queryS
尝试在错误控制台中执行这 2 个代码块: 第一个。输出节点列表。 var selector = "*[data-type=day][data-day='23']"; var a = document.
这是我的 JavaScript 代码: function answer(){ var list = document.querySelectorAll("#fish"); list[1].onclic
假设我有: ... ... ... ... ... ... ... 如何选择 元素,但仅限于 testimonials-wrapper 内的元素 尝试过:d
我创建了一个表,我们将其命名为 RPT_ACCOUNTS 代码|描述|类型01|银行|BA02|税|TA 当我从数据表中提取信息时,我会在 html 中直观地创建表格 row.dataset.rpt_
document.querySelectorAll('#salary-min, #salary-max').addEventListener('input', event => event.tar
这个问题已经有答案了: What do querySelectorAll and getElementsBy* methods return? (12 个回答) 已关闭 2 年前。 javaScrip
为了简单起见,我有以下 html,它不是我编写的,我无法控制。 我正在尝试为我们的职员编写一个脚本,该脚本必须将数据输入到此 Web 界面,以便她可以将数据从 Excel 复制并粘贴到 Web
我的代码有问题。现在,如果我单击第一个元素,所有元素将变为红色,如果我第二次单击它们将变为绿色。我想为 fa-heart 类的每个元素设置两个独立的事件。我会更好地解释:如果我第一次点击第一个元素 D
我已经创建了简单的 html 表单,我想使用 javascript 为输入字段标签设置动画。我使用 querySellectorAll 方法来识别对象,并使用控制台记录 querySelectorAl
我目前正在尝试适应this demo当您单击应用了相同类的链接时,用于页面转换。 我不确定如何在使用 querySelectorAll 后为具有相同类的所有元素调整以下代码。您认为应该进行哪些调整才能
我目前正在尝试适应this demo当您单击应用了相同类别的链接时,可以实现页面转换。目前,在 @ourmaninamsterdam 的推荐 here 后,我有以下代码:但我似乎无法让它发挥作用。您对
var arr = [].slice.call(document.querySelectorAll("a[href*='pricing']")); 返回一个长度为6的数组。 var arr = [].
我在 querySelectorAll 方面遇到问题。 这是我的代码: $(window).load( function() { // Add animations
在 JavaScript 中使用 :checked 选择器 document.querySelectorAll() 时,我发现存在不一致的行为。当 :checked 选择器用于复选框或单选按钮时,它不
我有一个表单,其中有多个选择框和带有类似名称的数组的输入。所以我有多个名称为 personroom[] 的选择框。我想用这个得到这些 var personroom=document.querySel
不确定这是否是导致我的项目出现错误的原因。 所以我有一堆具有相同类的 div,我通过选择它们 var CampaignInfo = document.querySelectorAll(".campai
假设我有以下标记... 无论如何,我可以使用 querySelectorAll 选择它们吗? 我尝试过 document.querySelectorAll([data-namespace-*])
我想使用 querySelectorAll 获取页面上多个下拉列表的选定值,然后将它们打印在页面上的其他位置。 我正在努力寻找正确的方法来执行此操作,因为它们都有不同的名称(“dropDown[0]”
我是一名优秀的程序员,十分优秀!