我正在编写一个 Greasemonkey 脚本来选择性地隐藏包含讨厌的东西的元素(如果你愿意的话,一个个人网络清洁剂)。
这是我到目前为止所得到的:
//custom contains function which is case-insensitive
$.extend($.expr[":"], {
"containsNC": function(elem, i, match, array) {
return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
}
});
//build array of words to filter
var nope = "long list of horrible words".toLowerCase().split(' ');
//start with an empty jQuery object
var nopeEles = $();
//add elements to filter to it
for (var i = 0; i < nope.length; i++) {
nopeEles = nopeEles.add( $("a:containsNC('" + nope[i] + "')") );
nopeEles = nopeEles.add( $("p:containsNC('" + nope[i] + "')") );
}
//hide all applicable elements
nopeEles.css("background-color", "white");
nopeEles.css("color", "white");
它工作得很好,但它会进行部分单词匹配,这使得短单词不起作用。我想过滤包含“die”和“gun”等词的元素,而不过滤那些带有“candied”或“gung-ho”等词的元素。
需要明确的是,我追求的是整个单词,而不是确切的文本。我希望列表中的“枪”不仅匹配“枪”,还匹配“他开枪”和“开枪”。而不是“枪手中士”。
我在这个主题上看到的所有其他答案都推荐 jQuery 的 filter()。我觉得我理解得不够好。我尝试在循环中使用这一行,但没有:
nopeEles = nopeEles.add( $("a").filter(function() { return $(this).text() === nope[i]; }) );
我想看的另一个角度是摆弄 containsNC 所以它会寻找这个词,但两边都有空格或字符串结尾。不过,我真的不明白 containsNC 是如何工作的。
任何指针将不胜感激!