是否有用于查询注释节点的DOM API?

Ric*_*omi 9 html javascript dom

我有一个带有调试注释的文档,如下所示:

<!--SERVER_TRACE {...}-->
Run Code Online (Sandbox Code Playgroud)

有没有办法查询DOM来访问这个节点?我正在寻找一个vanilla JavaScript解决方案,没有任何库的帮助.

我的第一个想法是深入首先搜索DOM并将找到的节点与节点类型值进行比较以进行评论Node.COMMENT_NODE.有没有更简单的方法?

Max*_*Art 9

TreeWalkerAPI:

var tw = document.createTreeWalker(document, NodeFilter.SHOW_COMMENT, null, null),
    comment;
while (comment = tw.nextNode()) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

IE8及更低版本不支持此功能.

TJ在评论中提供了规范链接.我总是只使用TreeWalkers,但在你的情况下,a NodeIterator也很好.

  • 这是我以前的JSFiddle更新使用`document.createTreeWalker()`:http://jsfiddle.net/JCDnh/3/更小更容易阅读,技术上相同的步骤,但如果JavaScript引擎利用可能更快本机代码 (4认同)
  • @TJCrowder:它在Mozilla中存在并且在WebKit和Opera中存在很长时间:我已经使用它多年了.除了IE <= 8,支持是通用的,AFAIK(我还没有测试过所有的移动浏览器). (2认同)

Séb*_*uld 7

nodeType核心属性,可以节点类型的区分.在这种特殊情况下,8代表评论.因为他们没有选择器,你需要循环他们的父母来获取它们(这很糟糕,我知道).以下代码将为您筛选出来:

$("*").contents().filter(function(){
    return this.nodeType == Node.COMMENT_NODE;
})
Run Code Online (Sandbox Code Playgroud)

还有我自己的jQuery-less版本,因为有些人没有它:

function getAllComments() {
    var t = [],
        recurse = function (elem) {
            if (elem.nodeType == Node.COMMENT_NODE) {
                t.push(elem);
            };
            if (elem.childNodes && elem.childNodes.length) {
                for (var i = 0; i < elem.childNodes.length; i++) {
                    recurse(elem.childNodes[i]);
                };
            };
        };
    recurse(document.getElementsByTagName("html")[0]);
    return t;
};
Run Code Online (Sandbox Code Playgroud)

如果您要搜索特定节点,请将document.getElementsByTagName调用重新绑定到您选择的变量.

编辑:小提琴演示使用,由杰森Sperske完成!

  • @SébastienRenauld:缺少`jquery`标签本身就足够了,说"DOM API"的特殊性使它非常清晰.不要使用特定于jQuery的答案来回答非jQuery问题.(当然,截至您的更新,现在您还没有 - 您已经给出了实际答案.) (4认同)
  • 一个(非常令人印象深刻的)非jQuery方法的JSFiddle演示:http://jsfiddle.net/JCDnh/ (3认同)
  • 以前的评论是正确的,我不想要一个jQuery解决方案.编辑:这意味着这个问题与"使用jQuery选择HTML注释"不同. (2认同)