Javascript 当jQuery没有唯一的标识属性但有HTML注释时,如何使用jQuery选择HTML?

Javascript 当jQuery没有唯一的标识属性但有HTML注释时,如何使用jQuery选择HTML?,javascript,jquery,html,dom,jquery-selectors,Javascript,Jquery,Html,Dom,Jquery Selectors,我正在为我经常访问的论坛编写自定义脚本。它的设计目的是在我查看时删除板上的签名,因为这些签名会分散注意力和烦人,并且无法在选项中禁用它们 无论如何,我可以使用一个有用的Chrome扩展来运行自定义脚本。我能够修改页面的任何部分,其中HTML节点具有类、ID,甚至带有一点唯一信息的属性,但我似乎不知道如何使用jQuery选择和删除以下HTML <tr> <td colspan="2"> <!--Signature-->

我正在为我经常访问的论坛编写自定义脚本。它的设计目的是在我查看时删除板上的签名,因为这些签名会分散注意力和烦人,并且无法在选项中禁用它们

无论如何,我可以使用一个有用的Chrome扩展来运行自定义脚本。我能够修改页面的任何部分,其中HTML节点具有类、ID,甚至带有一点唯一信息的属性,但我似乎不知道如何使用jQuery选择和删除以下HTML

    <tr>
      <td colspan="2">
        <!--Signature-->
            <div class="resultText">
                <!-- sig -->
                    <div>Signature text</div>
                <!-- / sig -->

            </div>
      </td>
    </tr>

签名文本
如果有一种方法我可以抓住
的父对象,那将是完美的,但我不确定这是否可能


有一个类
resultText
,但该类用于用户输入文本的任何地方,而不仅仅是在签名中。所以我不能抓住它。

您可以使用
.contents()
获取元素的所有子节点:

从文档中:

获取匹配元素集中每个元素的子元素, 包括文本和注释节点


这里是一个演示:

即使在其他地方使用了
resultText
类,我仍然建议使用类选择器作为起点,否则您将在整个文档中查找注释节点

从匹配的元素中,您可以获取它们的父元素,用于隔离注释节点(它们的属性等于
8
),并将这些节点的值与
签名
字符串进行比较:

$(".resultText").parent().each(function() {
    var $this = $(this);
    var signature = $this.contents().filter(function() {
        return this.nodeType == 8 && this.nodeValue == "Signature";
    });
    if (signature.length) {
        // Signature found, $this is the <td> element.
        $this.closest("tr").remove();  // For example.
    }
});
$(“.resultText”).parent().each(函数()){
var$this=$(this);
var signature=$this.contents().filter(函数()){
返回this.nodeType==8&&this.nodeValue==Signature;
});
如果(签名长度){
//已找到签名,$这是元素。
$this.closest(“tr”).remove();//例如。
}
});

由于脚本基本上就是为您编写的,所以请使用xpath查找注释

试着这样做:

var comment, comments = document.evaluate('//comment()', document);
while ((comment=comments.iterateNext())) {
  if (comment.data=='Signature') { // found one
    comment.parentNode.parentNode.removeChild(comment.parentNode);
  }
}

为什么不添加一些信息(id、类等)来实现这一点呢?即使有可能,使用评论也是一个糟糕的想法。即使有可能,它也会非常缓慢。我建议为元素本身添加一些标识。i、 e.id,class data-@all-这不是他的网站,所以他无法控制内容。这就是为什么他不能添加标识符的原因。@EdS。这不是我的网站,正如谢尔曼先生所说。当我访问该网站时,它是一个运行的Chrome模块。我所能做的就是调整现有内容。当您使用
.contents()选择元素的子元素时,我如何使用它来定位包含
注释的节点?@AlexFord
您可以遍历jQuery集合,查看
nodeType
nodeValue
属性,以确定正在使用的节点。这里有一个演示:谢谢!这就是我想要的。这是我最后一次使用你的代码@AlexFord看起来不错!如果有多个
元素带有
签名
注释,则可以删除
for
循环中的
中断
,并放入
$(tmp[i])。parent().remove()
位于循环的if/then语句的
右侧。
var comment, comments = document.evaluate('//comment()', document);
while ((comment=comments.iterateNext())) {
  if (comment.data=='Signature') { // found one
    comment.parentNode.parentNode.removeChild(comment.parentNode);
  }
}