Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.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 getByClassnameHierarchy实现的问题_Javascript_Dom - Fatal编程技术网

Javascript getByClassnameHierarchy实现的问题

Javascript getByClassnameHierarchy实现的问题,javascript,dom,Javascript,Dom,我正在尝试实现getByClassnameHierarchy,但在实现方面遇到了问题我应该使用BFS而不是DFS来遍历节点吗? 有人能给我解释一下使用这些工具的方法和利弊吗 //帮助函数,使输出更易于阅读 const getIds=(elements=[])=>Array.from(elements.map)(x=>x.id); /** *返回所有满足层次结构的_叶_节点u)DOM元素。 *层次结构是由“>”分隔的类名字符串,类似于 *CSS子选择器。 * *例如getByClassname

我正在尝试实现getByClassnameHierarchy,但在实现方面遇到了问题我应该使用BFS而不是DFS来遍历节点吗?

有人能给我解释一下使用这些工具的方法和利弊吗

//帮助函数,使输出更易于阅读
const getIds=(elements=[])=>Array.from(elements.map)(x=>x.id);
/**
*返回所有满足层次结构的_叶_节点u)DOM元素。
*层次结构是由“>”分隔的类名字符串,类似于
*CSS子选择器。
* 
*例如getByClassnameHierarchy(#root,'a>b>c')->[,]
*“给我所有类名为‘c’的元素,它们有一个严格的父元素
*类名“b”,具有严格的父类名称“a”
* 
*@param root DOMElement:从此DOM元素开始搜索
*@param hierarchy string:`>`-以类名称分隔的字符串
*@return数组:满足目标层次结构的所有DOM元素
*/
函数getByClassnameHierarchy(根,层次){
//父节点
常数res=[];
常量级别=hierarchy.split('>');
助手(根,级别,0);
返回res;
函数助手(根、级别、cur){
如果(!root)返回
if(root.classList&&root.classList.contains(级别[cur-1]){//b
if(root.parentNode.classList.contains(级别[cur-2]){//a
if(root.classList.contains(级别[cur-1])){
res.push(根);
}
}
}//c
root.childNodes.forEach(child=>{
助手(儿童,级别,cur+1);
});
}
}
const root2=document.getElementById('root2');
////基本情况:
log('actual:',getid(getByClassnameHierarchy(root2,'a>b>c'));
log(`a>b>c应为:`,`['c-1','c-2']`,'\n')

2020年编辑(感谢@techguy2000的评论)

这个版本应该正确处理根元素本身有一些类的情况。它还修复了以前版本的一些问题:

constgetids=(elements=[])=>Array.from(elements.map)(x=>x.id);
函数getByClassnameHierarchy(元素,层次结构,级别=0){
常量结果=[];
常量classNames=hierarchy.split('>');
const currentClassName=classNames[0];
const isClassFound=element.classList&&element.classList.contains(currentClassName);
const isLastClass=classNames.length==1;
如果(isClassFound){
如果(isLastClass){
结果:推(元素);
}否则{
element.childNodes.forEach(child=>{
push(…getByClassnameHierarchy(子级,classNames.slice(1).join('>'),level+1));
});
}
} 
如果(级别==0){
element.childNodes.forEach(child=>{
push(…getByClassnameHierarchy(子级、层次结构、级别));
});
}
返回结果;
}
//试验
const root2=document.getElementById('root2');
log('a>b>c实际:',getID(getByClassnameHierarchy(root2,'a>b>c'));
log('a>b>c预期为:',['c-1','c-2','c-3','c-4']);
log('b>c实际:',getID(getByClassnameHierarchy(root2,'b>c'));
log('b>c预期为:',['c-1','c-2','c-3','c-4']);
log('b实际:',getID(getByClassnameHierarchy(root2,'b'));
log('b预期为:',['b-1','b-2']);
log('a>c实际:',getID(getByClassnameHierarchy(root2,'a>c'));
log('a>c预期为:',[])

2020年编辑(感谢@techguy2000的评论)

这个版本应该正确处理根元素本身有一些类的情况。它还修复了以前版本的一些问题:

constgetids=(elements=[])=>Array.from(elements.map)(x=>x.id);
函数getByClassnameHierarchy(元素,层次结构,级别=0){
常量结果=[];
常量classNames=hierarchy.split('>');
const currentClassName=classNames[0];
const isClassFound=element.classList&&element.classList.contains(currentClassName);
const isLastClass=classNames.length==1;
如果(isClassFound){
如果(isLastClass){
结果:推(元素);
}否则{
element.childNodes.forEach(child=>{
push(…getByClassnameHierarchy(子级,classNames.slice(1).join('>'),level+1));
});
}
} 
如果(级别==0){
element.childNodes.forEach(child=>{
push(…getByClassnameHierarchy(子级、层次结构、级别));
});
}
返回结果;
}
//试验
const root2=document.getElementById('root2');
log('a>b>c实际:',getID(getByClassnameHierarchy(root2,'a>b>c'));
log('a>b>c预期为:',['c-1','c-2','c-3','c-4']);
log('b>c实际:',getID(getByClassnameHierarchy(root2,'b>c'));
log('b>c预期为:',['c-1','c-2','c-3','c-4']);
log('b实际:',getID(getByClassnameHierarchy(root2,'b'));
log('b预期为:',['b-1','b-2']);
log('a>c实际:',getID(getByClassnameHierarchy(root2,'a>c'));
log('a>c预期为:',[])


请编辑您的示例以使其可运行(其中包含一些HTML)。@Jeto Done:D我已经添加了代码。我的意思是您可以执行
getByClassnameHierarchy(root,hierarchy){返回root.querySelectorAll(“.”+hierarchy.replace(/>/g,“>);}
然后用它完成…@NiettheDarkAbsol我这样做的全部目的就是实现它。。我不想使用querySelectorAll。我在一次采访中被问到这个问题。谢谢你的回答。请编辑你的示例使其可运行(其中包含一些HTML)。@Jeto Done:D我已经添加了代码。我是说你是c