首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >香草JavaScript等价于jQuery(…).parent().nextAll(选择器)

香草JavaScript等价于jQuery(…).parent().nextAll(选择器)
EN

Stack Overflow用户
提问于 2020-09-03 00:02:28
回答 4查看 2.5K关注 0票数 1

我正在尝试使用一个普通的JavaScript选择器(不使用jQuery)来获得如下所示的相同选择:

代码语言:javascript
复制
$('[data-automationid=pictureupload_1]').parent().nextAll('input[type=text]')

有人能帮帮我吗?我一直在挣扎。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-09-03 00:58:45

据我所知,DOM中没有nextAll方法,因此在不使用jQuery的情况下这样做有点棘手。

我们可以像这样使用生成器来迭代和过滤nextElementSibling

代码语言:javascript
复制
function* myNextAll(e, selector) {
   while (e = e.nextElementSibling) {
       if ( e.matches(selector) ) {
          yield e;
       }
   }
}

let e1 = document.querySelector("[data-automationid=pictureupload_1]").parentElement;

let siblings = [...myNextAll(e1, "input[type=text]")];
票数 3
EN

Stack Overflow用户

发布于 2020-09-03 00:55:00

  • 使用document.querySelector('[data-automationid=pictureupload_1]')选择起始节点.
  • 使用parentElement.children获取来自父节点(包括父节点本身)的所有兄弟姐妹。
  • 遍历兄弟姐妹,直到父节点建立为止。
  • 如果所有其他兄弟节点都是输入节点,并输入text (=1),则查找它们。
  • 把它们收集在一个数组中。

为了进行演示,迭代结果并通过test类更改背景。

如果你想试试:https://jsfiddle.net/7p8wt4km/2/

代码语言:javascript
复制
let result = [];
let par = document.querySelector('[data-automationid=pictureupload_1]').parentElement;
let sibling = par.parentElement.children;
let found = false;
for (let i=0; i< sibling.length; i++) {
    if (!found && sibling[i] ===par) {
        found = true;
        continue;
    } else if (found) {
        let sib = sibling[i];
        if (sib.nodeName !== 'INPUT' || sib.nodeType!= 1) continue;
        result.push(sib);
    }
}

result.forEach(el => { el.classList.add('test');});
代码语言:javascript
复制
.test { background: green; }
代码语言:javascript
复制
<div>
  <div>
    Sibling 0
  </div>
  <div>
    Parent
    <div data-automationid='pictureupload_1'>
      pictureupload_1
    </div>
  </div>
  <input type='text'>
  <div type='text'>
    Sibling 2
  </div>
  <input type='test'>
  <input type='checkbox'>
</div>

票数 1
EN

Stack Overflow用户

发布于 2021-02-18 04:41:11

您可以尝试使用index元素获取我的代码。

代码语言:javascript
复制
const getIndex = (node, groupNode) => {
    return [...groupNode].indexOf(node);
}

Element.prototype.nextAll = function(){
    var allChildren = this.parentNode.children;
    var index = getIndex(this, allChildren);
    allChildren = [...allChildren].filter((item) => {
        return getIndex(item, allChildren) > index;
    });
    return allChildren;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63715008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档