Javascript 是否获取具有给定标记名的所有直接子元素?仅限本机JS
请不要用JQuery 我很惊讶没有找到这个问题的答案。我可能会被“欺骗” 问题是只获取具有给定标记名(例如DIV)的立即子元素,因此Javascript 是否获取具有给定标记名的所有直接子元素?仅限本机JS,javascript,html,css-selectors,Javascript,Html,Css Selectors,请不要用JQuery 我很惊讶没有找到这个问题的答案。我可能会被“欺骗” 问题是只获取具有给定标记名(例如DIV)的立即子元素,因此getElementsByTagName不起作用:这将返回具有该标记名的所有子元素 使用queryselectoral(),有一个漂亮的答案: 。。。但我所做的只是动态创建一个元素(DIV),并使其innerHTML等于fetch'd HTML文件的内容。这样做的结果是使主体的子元素成为所创建元素的子元素 所以它没有ID或类,甚至不在DOM树中。当然我可以迭代。。。
getElementsByTagName
不起作用:这将返回具有该标记名的所有子元素
使用queryselectoral()
,有一个漂亮的答案:
。。。但我所做的只是动态创建一个元素(DIV),并使其innerHTML
等于fetch
'd HTML文件的内容。这样做的结果是使主体的子元素成为所创建元素的子元素
所以它没有ID或类,甚至不在DOM树中。当然我可以迭代。。。但谁想在2020年迭代呢!荒谬的那么,我该怎么说:
const childDivs = container.querySelectorAll('ME > DIV');
编辑
尝试了Barmer的过滤器理念:
const childEls = container.children
function checkDiv( el ){
return el.tagName === 'DIV'
}
const childDivs = childEls.filter( checkDiv )
错误:“childEls.filter不是函数”
。。。我认为上面的childEls
(类)是一个“类似数组”的对象。所以我相信你必须这样做:
const childEls = container.children
const newArr = Array.prototype.slice.call( childEls );
const childDivs = newArr.filter( function( el ){ return el.tagName === 'DIV' } )
。。。哪个有效。。。但事实上,这是一次迭代。嘘。
使用:范围
伪类
scope:CSS伪类表示作为引用的元素
选择器要匹配的点
IE解决方案:
const childDivs = Array.prototype.filter.call(childEls,checkDiv );
const childDivs = Array.prototype.filter.apply(childEls,[checkDiv] );
const childDivs = Array.prototype.filter.bind(childEls)(checkDiv);
我们需要将HTMLCollection
对象设置为Array.prototype.filter
的范围,以过滤HTMLCollection
对象。这可以通过调用
、应用
或绑定
来实现
使用呼叫:
const childDivs = Array.prototype.filter.call(childEls,checkDiv );
const childDivs = Array.prototype.filter.apply(childEls,[checkDiv] );
const childDivs = Array.prototype.filter.bind(childEls)(checkDiv);
使用Apply:
const childDivs = Array.prototype.filter.call(childEls,checkDiv );
const childDivs = Array.prototype.filter.apply(childEls,[checkDiv] );
const childDivs = Array.prototype.filter.bind(childEls)(checkDiv);
使用绑定:
const childDivs = Array.prototype.filter.call(childEls,checkDiv );
const childDivs = Array.prototype.filter.apply(childEls,[checkDiv] );
const childDivs = Array.prototype.filter.bind(childEls)(checkDiv);
它不只是el.children()
其中el
是您刚刚创建的元素吗?呃。。。这将返回所有子元素,而不管标记名如何。然后我必须反复浏览这个列表。我可能需要反复浏览一下这个列表!我没有意识到“一个给定的标记名”指的是您正在寻找的元素,我认为这就是您得到的子元素。获取所有子元素,然后调用filter()
检查标记名。啊哈。。。我只是想澄清一下我可能不清楚的地方。干得好。我有一种感觉,在这些方面有一些东西<代码>呼叫
,右侧。但是,它是否比简单的迭代有任何优势…:-)这不是一个很大的优势……只是更简短易读的代码:)。过滤器只能在迭代中工作。@您可以使用:scope
。如果你不支持我们,那太好了。谁会想到在2020年IE会成为唯一一个无法采用合理CSS标准的浏览器(讽刺)。然而,Edge确实有这一点。