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

Javascript 是否有用于查询注释节点的DOM API?,javascript,html,dom,Javascript,Html,Dom,我有一个文档,其中包含调试注释,如下所示: <!--SERVER_TRACE {...}--> 是否有方法查询DOM以访问此节点?我正在寻找一个普通的JavaScript解决方案,没有任何库的帮助 我的第一个想法是深度优先搜索DOM,并将找到的节点与节点类型值进行比较,以获得注释,node.COMMENT\u node。有更简单的方法吗?通过nodeTypecore属性,可以区分不同类型的节点。在这种情况下,8表示注释。由于它们没有选择器,您需要通过它们的父级循环来获取它们(我

我有一个文档,其中包含调试注释,如下所示:

<!--SERVER_TRACE {...}-->

是否有方法查询DOM以访问此节点?我正在寻找一个普通的JavaScript解决方案,没有任何库的帮助


我的第一个想法是深度优先搜索DOM,并将找到的节点与节点类型值进行比较,以获得注释,
node.COMMENT\u node
。有更简单的方法吗?

通过
nodeType
core属性,可以区分不同类型的节点。在这种情况下,8表示注释。由于它们没有选择器,您需要通过它们的父级循环来获取它们(我知道这很糟糕)。以下代码将为您过滤掉它们:

$("*").contents().filter(function(){
    return this.nodeType == Node.COMMENT_NODE;
})
还有我自己的无jQuery版本,因为有些人没有:

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;
};
函数getAllComments(){ var t=[], 递归=函数(元素){ if(elem.nodeType==Node.COMMENT\u Node){ t、 推(elem); }; if(elem.childNodes&&elem.childNodes.length){ for(var i=0;i 如果要在特定节点上搜索,请将
document.getElementsByTagName
调用重新绑定到所选变量


编辑:要演示该用法,请通过

TreeWalker
API:

var tw = document.createTreeWalker(document, NodeFilter.SHOW_COMMENT, null, null),
    comment;
while (comment = tw.nextNode()) {
    // ...
}
IE8及更低版本不支持这一点


T.J.在提供的评论中。我总是只使用TreeWalker,但是在你的例子中,
节点操作符也可以。

OP说他在哪里使用jQuery?前面的评论是正确的,我不想要jQuery解决方案。编辑:这意味着这个问题不是“使用jQuery选择HTML注释”的重复。@SébastienRenauld:jQuery
标记的缺失本身就足够了,说“一个DOM API”的特殊性使它非常清楚。不要用jQuery特定的答案回答非jQuery问题。(当然,截至您的更新,现在您还没有——您已经给出了一个实际的答案。)(非常令人印象深刻的)非jQuery方法的JSFIDLE演示:我不明白为什么这会被否决。在添加非jQuery选项之前,它没有被否决(这可能是合理的),现在添加了非jQuery版本,它肯定是“有用的”。代码有几个问题(额外的分号和使用
childNodes[i]
而不是使用
firstChild
/
nextSibling
),但没有任何值得投票的地方。+1哇,它们甚至都不是新的:支持是什么样的(除了@T.J.Crowder,呃,从未做过广泛的测试,但Chrome、Firefox和Opera都支持它。我想你也可以在移动浏览器中找到它。无论如何,我甚至为那些不支持它的浏览器编写了一个polyfill。这是我以前更新的JSFIDLE,以使用
文档。createTreeWalker()
:从技术上讲,这些步骤都是相同的,但如果JavaScript引擎使用本机,则可能会更快code@T.J.Crowder:它在Mozilla中一直存在,在WebKit和Opera中也存在了很长一段时间:我已经使用它很多年了。除了IE@TimDown:酷,谢谢!IE8太糟糕了,我想我们会坚持了一段时间…但在后口袋里有一个非常非常有用的东西。也许这有帮助:但我还没有测试它。可能是魔兽世界的复制品,我确信我知道注释节点被剥离了。但据我所知不是这样的:在Firefox、Chrome甚至IE7上试用过。他们都在目标中有一个
nodeType==8
的节点,因此,没有删除注释。@SébastienRenauld:不是重复的,因为该问题指定了
jquery
标记,而这个问题没有。它明确要求一个DOM API,而不是一个库。(OP在回答问题的注释中进一步澄清,他不想使用jquery。)@T.J.Crowder:说到这里,我使用了一个纯JS实现。此外,他明确要求提供一种查询DOM的方法,而不是API。
childNode
递归从来都不是访问DOM的方法。无论如何,OP是唯一的方法。案例结束了吗?