我正在开发一个自定义用户脚本,它将阻止/标记我的列表中的用户。假设该列表将包含字符串“EvilJoe”、“ToxicWill”和“NegativeSara”。我想找到所有“span.username”元素,其中跨度内的文本包含上面的字符串之一,因此例如“User EvilJoe Premium”将匹配。
我可以通过 badUserNames 进行循环来完成此操作,对于每个 badUserName 我会执行类似的操作
$("span.username:contains(badUserName)").append(" - bad guy");
这是一个有效的解决方案吗?
:contains 会很慢,因为 jQuery 本身充当中间人,将 :contains 转换为原生 JS 函数。在这种情况下,最好使用这样的正则表达式:
var badUserRegex = new RegExp('(EvilJoe|ToxicWill|NegativeSara)', 'i');
// Find all the span.username elements that match the regex
$('span.username').filter(function() {
return badUserRegex.test($(this).text());
}).append(' - bad guy');
此代码在页面的整个主体中搜索包含
searchTerms
数组中任何搜索词的元素。 :not(script)
选择器用于从搜索中排除任何脚本元素。
var searchTerms = ["badUserName"];
var matchingElements = $("body :not(script)").filter(function () {
var elementText = $(this).clone().children().remove().end().text();
return searchTerms.some(function (term) {
return elementText.indexOf(term) > -1;
});
});
matchingElements.append(" - bad guy");
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<body>
<div>
<p>Text content badUserName.</p>
</div>
<div>
<p>Text content badUserName between</p>
</div>
<div>
<p>badUserName text at starts.</p>
</div>
<div>
<p>no text.</p>
</div>
</body>