代码之家  ›  专栏  ›  技术社区  ›  montrealist

实现jquery自定义过滤器的简单方法(根据父类选择)?

  •  4
  • montrealist  · 技术社区  · 16 年前

    我想选择每个文本区域 有一个班 红色 在它的父母中,对每个人都做些什么,然后再做 别的东西 页面上的其余文本区域。换句话说,选择一组元素,只处理其中的一些元素,然后对其余的元素执行其他操作。

    我知道我可以做下面这样的事情,但是有没有一种不那么笨拙的方法呢?

    $('textarea').filter(function() {
        return $(this).parents("div.red").length > 0;
    }).css('border','1px solid red').end().filter(function() {
        return $(this).parents("div.red").length == 0;
    }).css('border','1px solid green');
    

    谢谢!

    5 回复  |  直到 16 年前
        1
  •  5
  •   Matt    16 年前

    这条路怎么了?jquery是强大的,但是有一些话要说,以保持代码的干净和可读性,而不是试图太聪明。

    $('textarea').each(function() {
      if ($(this).parent('div.red').length > 0) {
        $(this).css('border', 'solid 1px red');
      } else {
        $(this).css('border', 'solid 1px green');
      }
    }
    
        2
  •  5
  •   cobbal    16 年前

    也许不是最有效的,但相当直观的是

    $('textarea').css('border', '1px solid green');
    $('div.red textarea').css('border', '1px solid red');
    

    尽管如此,如果您一直试图将其应用于每个文本区域,那么在CSS中可能会有更多类似的内容:

    textarea {
        border: 1px solid green;
    }
    
    div.red textarea {
        border: 1px solid red;
    }
    

    编辑:

    正如paolo bergantino提到的,如果您想在文本区域上执行比一个css命令更复杂的操作,可以使用

    var redAreas = $('div.red textarea');
    var otherAreas = $('textarea').not(redAreas);
    
        3
  •  2
  •   Brandon Montgomery    16 年前
    $("textarea").not("div.Red textarea"); /* textareas which do not have a div with class Red among its parents */
    $("div.Red textarea"); /* textareas which have a div with class Red amoung its parents */
    
        4
  •  0
  •   bendewey    16 年前

    我不知道是否更好,但你可以试试。

    $('textarea').each(function() {
      var borderColor = $(this).parents('div.red').length > 0 ? 'red' : 'green';
      $(this).css('border', '1px solid ' + borderColor);
    });
    
        5
  •  0
  •   fforw    16 年前

    仅仅使用CSS有什么问题?

    textarea 
    {
        border: 1px solid green;
    }
    
    div.red textarea 
    {
        border: 1px solid red;
    }