我目前有一个工作变量,目标是父节点3级别
searchClearSelector: '.search-form__clear', //The clear button on my input
//Checks if there is a value in the input to clear then calls a function
self._ClearActions = document.querySelectorAll(self.searchClearSelector);
if (self._ClearActions && self._ClearActions.length > 0) {
for (const _Action of self._ClearActions) {
_Action.addEventListener('click', self.ClearActionHandler);
}
}
//Clear function
ClearActionHandler() {
const self = this;
const _Handle = this;
const _HandleParent = parentNode.parentNode.parentNode;
const _SearchInput = _HandleParent.querySelector('.search-form__input');
}

<input className="search-form__input" placeholder="Enter text" />
<div className="search-form__actions">
<button type="button" className="search-form__clear">Clear</button>
</div>
&#13;
它工作正常,但似乎有点hacky - 我有更好的方法来做这个吗?
谢谢!
编辑 - 更新的代码,我不得不把大部分其他东西拿出来,因为它是一个巨大的文件,问题是IE没有清除它(因为它不起作用最接近香草JS)
答案 0 :(得分:0)
您可以使用递归函数:
function upperParents(element, levels) {
if (levels == 1) return element.parentNode || element;
if (levels < 1) return element;
return upperParents(element.parentNode || element, levels - 1);
}
document.getElementById('btnwithparents').addEventListener('click', function() {
console.log(upperParents(this, 2));
});
<div class="theparent">
<span>
<button id="btnwithparents">Search my parent 2 levels above</button>
</span>
</div>
答案 1 :(得分:0)
你可以实现这样的功能:
const _HandleParent = parentsUntil(3, this); // 3rd parent
const parentsUntil = (num, elem) => {
if(num <= 0) return;
let node = elem;
while(num--) node = node.parentNode;
return node;
}
答案 2 :(得分:0)
您可以使用while
循环执行此操作。
var node = document.getElementById("id");
var levels = 3;
while (levels >= 0) {
node = node.parentNode;
levels--;
}
答案 3 :(得分:0)
每个人都给出了解决方案,而另一个是:
function getUpstream(el,lvl){
if(!(el instanceof Node)){
throw("Not a node!");
}
while((--lvl>=0)&&el){
el = el.parentNode;
}
return el;
}
getUpstream(document.body的,1)