tags:

views:

433

answers:

5

Hello,

I want to select every textarea that does not have a DIV with class red among its parents, do something to each, and then do something else with the rest of textareas on the page. In other words, select a set of elements, work on only some of them, and then do something else with the rest.

I know I can do something like below, but is there a less clumsy way of doing it?

$('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');

Thanks!

A: 

I don't know if its any better, but you could try.

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

What's wrong with this way? jQuery is powerful, but there is something to be said for keeping code clean and readable and not trying to be too clever.

$('textarea').each(function() {
  if ($(this).parent('div.red').length > 0) {
    $(this).css('border', 'solid 1px red');
  } else {
    $(this).css('border', 'solid 1px green');
  }
}
Matt
Nothing, really. I guess I was so entangled in the jQuery way of doing things and "trying to be clever", that I forgot that what's happening behind the scenes is essentially this..
dalbaeb
+5  A: 

maybe not the most efficient, but fairly intuitive is

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

although something like this may belong more in css if you are trying to apply it to every textarea at all times:

textarea {
    border: 1px solid green;
}

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

Edit:

As Paolo Bergantino mentions, if you want to do something more complex than one css command on the textareas you can use

var redAreas = $('div.red textarea');
var otherAreas = $('textarea').not(redAreas);
cobbal
I think your green/red logic might be backwards from the OPs
bendewey
so it was, good catch
cobbal
Very simple, should have been obvious from the start..
Matt
This works because of the way CSS cascades, but I am not sure if this answers the OP's question - I was under the impression the CSS was just an example and he wants to do something else to the two different set of elements.
Paolo Bergantino
Yes, my question is about having a subset of a set of elements, and then being able to get just the remaining elements of that very same set (subset2 = set - subset). Sorry if the wording is not sufficiently clear.
dalbaeb
+2  A: 
$("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 */
Brandon Montgomery
A: 

What is wrong with just using CSS?

textarea 
{
    border: 1px solid green;
}

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