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