Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否获取具有给定标记名的所有直接子元素?仅限本机JS_Javascript_Html_Css Selectors - Fatal编程技术网

Javascript 是否获取具有给定标记名的所有直接子元素?仅限本机JS

Javascript 是否获取具有给定标记名的所有直接子元素?仅限本机JS,javascript,html,css-selectors,Javascript,Html,Css Selectors,请不要用JQuery 我很惊讶没有找到这个问题的答案。我可能会被“欺骗” 问题是只获取具有给定标记名(例如DIV)的立即子元素,因此getElementsByTagName不起作用:这将返回具有该标记名的所有子元素 使用queryselectoral(),有一个漂亮的答案: 。。。但我所做的只是动态创建一个元素(DIV),并使其innerHTML等于fetch'd HTML文件的内容。这样做的结果是使主体的子元素成为所创建元素的子元素 所以它没有ID或类,甚至不在DOM树中。当然我可以迭代。。。

请不要用JQuery

我很惊讶没有找到这个问题的答案。我可能会被“欺骗”

问题是只获取具有给定标记名(例如DIV)的立即子元素,因此
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确实有这一点。