有没有办法在不一次查询所有标签的情况下找到下一个类似的标签?

Is there any way to find next similar tag without querying all tags at once?

提问人:Aleksandr Fedchenko 提问时间:5/2/2019 最后编辑:Aleksandr Fedchenko 更新时间:5/2/2019 访问量:41

问:

我正在尝试为冲浪浏览器实现我自己的链接提示脚本,并且 我一直在页面上遇到明显的性能问题 大量的链接。例如,提示所有提示大约需要 2 秒 https://gunther.suckless.org/patches/ 上有可见链接,https://en.wikipedia.org/wiki/Japan 上有 3 秒。我想,问题是我是 尝试使用(或 - 它在我的 case),然后通过检查的函数过滤所有这些标签 链接是否在视口中(换句话说,链接查找) 过程将大部分时间浪费在不会显示的链接上 无论如何):querySelectorAll("a")getElementsByTagName("a")

var all_elems = document.body.querySelectorAll("a");
for (var i = 0; i < all_elems.length; i++) {
  if (isHintDisplay(all_elems[i])) {
    hint_elems.push(all_elems[i]);
  }
}

我曾认为,可能是一个更优化的解决方案,“手动”链接标签迭代,一次处理一个链接标签,并在找到不可见链接时停止。 我尝试使用 / / 实现这些迭代,但最终得到了丑陋且绝对不健壮的代码......querySelector("a")parentElementnextElementSibling

有没有其他方法可以在不使用 / 的情况下查找上一个/下一个相似标签?或者这些性能问题是 Javascript 本身固有的,无能为力 改善情况?querySelectorAllgetElementsByTagName

P.S. 假设处理后的标签不包含任何 ID 和类。

添加

isHintDisplay的实现:

function isHintDisplay(elem) {
  var pos = elem.getBoundingClientRect();
  var viewHeight = Math.max(document.documentElement.clientHeight,
                            window.innerHeight);
  return !(pos.bottom < 0 || pos.top - viewHeight >= 0);
}
JavaScript jQuery 性能 HTML 解析

评论

0赞 Taplar 5/2/2019
我很好奇。我的第一个想法是注释掉对 isHintDisplay 的调用,看看性能问题是否得到缓解。从本质上讲,进一步确定性能问题的根源。
0赞 Taplar 5/2/2019
我之所以这么说,是因为我不确定是否存在一个只能在视口中找到元素的选择器。因为如果有的话,那将是神奇的(这意味着我会喜欢它)
0赞 Aleksandr Fedchenko 5/2/2019
我添加了函数的主要后期实现,它使用相当标准的解决方案。我可以尝试注释掉这个函数,但我认为它没有意义,因为这个函数对于这个脚本是必不可少的,而且我不知道如何重新实现它......isHintDisplaygetBoundingClientRect()

答: 暂无答案