在for循环中使用parent()

时间:2017-04-28 03:54:10

标签: javascript jquery google-chrome-extension

我正在创建一个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

2 个答案:

答案 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循环。

JQuery重写

$("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