我正在创建一个Chrome扩展程序,可以阻止所有种子搜索引擎网站上的所有色情内容。
所以我试图检索种子的名称并检查它们是否包含我创建的包含阻止(成人/色情)单词的字符串数组。如果它与数组字匹配,那么它应该将父元素的显示设置为无。但是来自jQuery的parent()似乎并没有在for循环中解决这个问题。这是我正在使用的代码。
// 'blockedWords' is the array.
// '$("dl dt")' contains the words that I am checking against strings from
// the array 'blockedWords'.
for (var i = 0; i < $("dl dt").length; i++) {
for (var j = 0; j < blockedWords.length; j++) {
if($("dl dt")[i].innerText.indexOf(blockedWords[j]) > -1){
$(this).parent().style.display= "none"; // 1st Method or
$("dl dt")[i].parent().style.display= "none"; // 2nd Method
}
}
}
// 1st Method shows the error 'Cannot set property 'display' of undefined'
// 2nd Method shows the error '$(...)[i].parent is not a function'
// '$("dl dt")[i].parent().style.display' doesn't work but
// '$("dl dt").parent().style.display' doesn't work either
// '$("dl dt")[i].style.display' works perfectly without parent().
我也试过'父母()'。 任何帮助将不胜感激 :)。 作为新手,我也对任何其他建议或建议持开放态度。 如果你能解释你的代码,我将非常感激:)
顺便说一句,你能相信那里有超过500家色情公司:o:P:D
答案 0 :(得分:1)
由于你有jQuery,你可以避免使用jQuery的filter()
和JavaScript reduce(s,v)
使用嵌套的for循环:
// Filter function removes elements that return a false/falsey value like 0
$("dl dt").filter(function() {
// Save current element's innerText so we can use it within the reduce function
var str = $(this).text();
// Return sum of reduce function
return blockedWords.reduce(function(s, v) {
// For each item in blockedWords array, check whether it exists in the string. Add to total number of matches.
return s + !!~str.indexOf(v);
}, 0); // 0 = intial value of reduce function (number of matches)
}).parent().hide(); // Hide elements which pass through the filter function
演示:
var blockedWords = [
'shit', 'fuck', 'sex'
];
$("dl dt").filter(function() {
var str = $(this).text();
return blockedWords.reduce(function(s, v) {
return s + !!~str.indexOf(v);
}, 0);
}).parent().hide();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<dl><dt>this is shit</dt></dl>
<dl><dt>this is okay</dt></dl>
<dl><dt>fuck this</dt></dl>
<dl><dt>no problem</dt></dl>
<dl><dt>sex videos</dt></dl>
编辑:如果您看到它,我为之前的答案道歉,因为它不完整。我还添加了一个用于演示目的的片段。有关reduce算法的进一步说明,请检查this answer out(基本上它将indexOf的值转换为0或1,因为如果找不到indexOf则返回-1,如果找到则返回另一个0索引的整数)
答案 1 :(得分:0)
JQuery&#39; parent
函数返回一个JQuery对象,其中包含父元素。如果要从此对象访问元素,则需要使用括号表示法从对象中检索元素。
如果您要提供一些HTML,我将能够对此进行测试并确保其正常工作,但是这里有一些代码可以让您指向正确的方向,主要使用JQuery而不是依赖for
用JavaScript循环。
$("dl dt").each(function(index, element){
if($.inArray(blockedWords,$(element).text()) > -1) {
$(this).parent().css("display", "block");
$(element).parent().css("display", "block");
}
})
改变这个:
$(this).parent().style.display= "none"; // 1st Method or
$("dl dt")[i].parent().style.display= "none"; // 2nd Method
到此:
$(this).parent()[0].style.display= "none"; // 1st Method or
$($("dl dt")[i]).parent()[0].style.display= "none"; // 2nd Method
您可以选择使用JQuery的css
函数,如下所示:
$(this).parent().css("display", "none"); // 1st Method or
$($("dl dt")[i]).parent().css("display","none"); // 2nd Method