如何在JavaScript中像jQuery一样使用prevAll?

3
如何在JavaScript中实现这个?
function prevAll (element) {
    // some code to take all siblings before element?
    return elements;
};

2
获取父级,循环所有子元素,直到找到所需的元素(element)。当你尝试了一些东西后回来..哦等等,我想SLaks想为你做所有的工作。等待他的编辑,然后你就可以毫不费力地离开了。 - musefan
3个回答

8
使用.previousElementSibling,你可以获取前一个节点,该节点是实际元素 (不是文本节点或注释)
function prevAll(element) {
    var result = [];

    while (element = element.previousElementSibling)
        result.push(element);
    return result;
}
.previousElementSibling属性如有需要,可以在IE8中进行polyfill。
值得注意的是,如果我没记错的话,jQuery会按文档顺序返回元素。如果是这种情况并且你需要这样做,只需在返回数组时使用.reverse()即可。

2
@musefan:不,这只会让你的老板对你期望更高。;-D - user1106925
我怀疑楼主不会理解最后一行:“如果需要,这可以在IE8中进行polyfill填充”。 - Cerbrus
@Cerbrus:研究中有价值的关键词。 - user1106925
2
@squint:哈!玩得不错。 - musefan

0
使用previousSibling属性,并循环直到其为null。

1
帮助提问者而不是直接给出完整的代码?+1。 - Cerbrus
5
那么,这不是与“不完整的答案”相同的定义吗? - musefan
不一定。解释“如何”完成通常比一段代码更具教育意义。 - Cerbrus
@squint:你会感到惊讶的。;-) - Cerbrus
@Cerbrus:OP似乎不是那种想要学习东西的人,而更倾向于只是完成任务。 - musefan
显示剩余3条评论

0
你可以使用一个生成器,如果情况需要的话。
const sibGen = function* (element) {
  let sibling = element.previousElementSibling; 
  while(sibling !== null) {
    sibling = sibling.previousElementSibling;
    yield sibling
  }
}

然后将其调用:

const siblingGenerator = sibGen(myElement);
// filter(Boolean) removes the null element
const allSiblings = [...siblingGenerator].filter(Boolean);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接