如何在javascript中获得注释元素的句柄?

如何在javascript中获得注释元素的句柄?,javascript,Javascript,我正在做一个兼职项目,需要我写一些javascript代码。不幸的是,我对javascript世界非常陌生,并且在学习的过程中不断学习 因此,我必须做的部分工作要求我在页面上查找某些注释,我使用以下行首先获取所有注释: var arr = document.getElementsByTagName("!"); 这在IE8中非常有效,并返回页面上所有注释的数组。然而,这在Google Chrome中返回一个空数组,当我打开开发者控制台时,我可以看到一个未捕获的类型错误(可能是由于在空数组上执行的

我正在做一个兼职项目,需要我写一些javascript代码。不幸的是,我对javascript世界非常陌生,并且在学习的过程中不断学习

因此,我必须做的部分工作要求我在页面上查找某些注释,我使用以下行首先获取所有注释:

var arr = document.getElementsByTagName("!");
这在IE8中非常有效,并返回页面上所有注释的数组。然而,这在Google Chrome中返回一个空数组,当我打开开发者控制台时,我可以看到一个未捕获的
类型错误
(可能是由于在空数组上执行的操作)

你知道为什么这两种浏览器都不起作用吗?这是我不应该使用的某种不受支持的操作,还是我只是误用了它

非常感谢您的任何帮助或在某个方向上的指点!谢谢大家!

澄清: 我这样做是为了操纵sharepoint页面。该脚本的实际目的是隐藏输入元素所在的表行。为此,我需要首先找到元素,但我不能这样做,因为它的属性基本上都是乱七八糟的垃圾:

<input name="ctl00$m$g_edc51673_bad2_46d5_9a65_e71137e56558$ctl00$ctl04$ctl00$ctl00$ctl‌​00$ctl04$ctl00$ctl00$TextField"
type="text" value="Title" maxlength="255"
id="ctl00_m_g_edc51673_bad2_46d5_9a65_e71137e56558_ctl00_ctl04_ctl00_ctl00_ctl00_‌​ctl04_ctl00_ctl00_TextField"
title="Title" class="ms-long">

(为了便于阅读,我在一些地方添加了换行符,但这些换行符都在源代码的一行中(这并没有什么区别))

所以不管怎样,我真的不能用它来找到我要找的控件。您可能会说它有一些结构,比如垃圾末尾的输入类型,以及title属性等等。但事实并非如此。你的,微软,确实为一些控件做了这些,但不是为其他控件


但是!它们与在这个带有元素名称的乱七八糟的垃圾之前提供注释是完全一致的,如果我能抓住这个注释,我就可以将foo.parenNode转换为我想要的内容。

您可以通过在字符串变量中加载页面(例如使用AJAX)并对其进行解析来避免这种情况

我想说,忽略注释应该是理想的行为,因为注释应该被认为是解析器/解释器的“禁区”


IE总是做一些花哨的(非标准的)事情,而这些事情往往会弄坏东西;)

可以通过在字符串变量中加载页面(例如使用AJAX)并对其进行解析来避免这种情况

我想说,忽略注释应该是理想的行为,因为注释应该被认为是解析器/解释器的“禁区”


IE总是做一些花哨的(非标准的)事情,而这些事情往往会弄坏东西;)

您可以从节点开始遍历DOM,
document
并迭代每个节点的
childNodes
数组。找到节点后,可以测试
nodeType==8

这里是链接到

还有一个小例子

<html>
<head>
</head>
<body>
<ul>
<li>junk
<li>text
<!-- comment 1 -->
<li>hi
<li>hello
<li>world
</ul>
<br/>
<!-- comment 2 -->
<script>
window.onload=findcommentsstart
var msgs = [];
function findcommentsstart()
{
    findcomments(document);
    var txt = document.createTextNode(msgs.join("\n"));
    document.getElementsByTagName("body")[0].appendChild(txt);
}

function findcomments(d)
{
    if(!d)
        return;
    if(d.nodeType==8)
        msgs.push("found a comment node " + d.data);
    if(!d.childNodes)
        return;
    for(var i=0;i<d.childNodes.length;i++)
        findcomments(d.childNodes[i]);
}
</script>
</body>
</html>

  • 垃圾
  • 正文
  • 你好
  • 世界

window.onload=findcommentssstart var-msgs=[]; 函数findcommentsstart() { 查找建议(文件); var txt=document.createTextNode(msgs.join(“\n”); document.getElementsByTagName(“正文”)[0].appendChild(txt); } 函数查找注释(d) { 如果(!d) 返回; if(d.nodeType==8) push(“找到注释节点”+d.data); 如果(!d.childNodes) 返回;
对于(var i=0;i您可以从节点开始遍历DOM,
document
并迭代每个节点的
childNodes
数组。当您找到一个节点时,您可以测试
nodeType==8

这里是链接到

还有一个小例子

<html>
<head>
</head>
<body>
<ul>
<li>junk
<li>text
<!-- comment 1 -->
<li>hi
<li>hello
<li>world
</ul>
<br/>
<!-- comment 2 -->
<script>
window.onload=findcommentsstart
var msgs = [];
function findcommentsstart()
{
    findcomments(document);
    var txt = document.createTextNode(msgs.join("\n"));
    document.getElementsByTagName("body")[0].appendChild(txt);
}

function findcomments(d)
{
    if(!d)
        return;
    if(d.nodeType==8)
        msgs.push("found a comment node " + d.data);
    if(!d.childNodes)
        return;
    for(var i=0;i<d.childNodes.length;i++)
        findcomments(d.childNodes[i]);
}
</script>
</body>
</html>

  • 垃圾
  • 正文
  • 你好
  • 世界

window.onload=findcommentssstart var-msgs=[]; 函数findcommentsstart() { 查找建议(文件); var txt=document.createTextNode(msgs.join(“\n”); document.getElementsByTagName(“正文”)[0].appendChild(txt); } 函数查找注释(d) { 如果(!d) 返回; if(d.nodeType==8) push(“找到注释节点”+d.data); 如果(!d.childNodes) 返回;
对于(var i=0;iComments不是标记,更不用说元素了,即使微软认为它们是。所以这只是IE像往常一样搞砸了?那么我还有其他方法来抓取评论吗?为什么要“抓取”评论?如果你有对页面非常重要的内容,为什么不使用真正的标签呢?@Pointy:添加了一个解释来解释为什么我不能使用“真正的标签”评论不是标签,更不用说元素了,即使微软认为它们是。所以这只是IE像往常一样搞砸了?那我还有别的方法来抓取评论吗?你为什么要“抓取”评论?如果你有对页面非常重要的内容,为什么不在真正的标签中?@Pointy:添加了一个解释来解释为什么我不能使用“真正的标签”。只是一个澄清问题。
If(!d)
语句检查什么?
If(!d)
在尝试检查nodeType属性或childNodes属性之前,请确保定义了d……我可能对在那里检查d有点偏执,但它不会破坏任何东西:)如果你从父节点的childNodes数组中获取节点,你不保证有一个有效的节点吗?。这样你就可以正确地说,这可能只是你的妄想症。:]另外,你知道有没有比遍历整个文档树更快的方法呢?从技术上讲,还有其他一些JS代码
setTimeout
setInterval
可以在调用findcomments之后但就在
d.childNodes[i]之前对某些元素调用
removeChild()
ahh,好吧。这很有趣。正如我在问题中所说的,我正在这里学习JavaScript,所以即使是这样的小澄清也会有帮助!谢谢!只是一个澄清问题。
if(!d)
语句检查什么?
if(!d)
只是在尝试检查节点之前确保定义了d