2010-05-11 4 views
3

J'ai une table qui a une section thead et une section tbody. J'utilise jQuery chacun pour trouver et compter tous TH s dans un table. Cela fonctionne bien. Mais en même temps, je veux vérifier si le TD s du TH s dans le tbody contient des éléments d'entrée.Jquery .each(): recherche d'éléments contenant l'entrée

Voici ce que j'ai jusqu'à présent:

jQuery('#' + _target).each(function() { 

     var $table = jQuery(this); 
     var i = 0; 
     jQuery('th', $table).each(function (column) { 
      if (jQuery(this).find("input")) { 
       dataTypes[i] = { "sSortDataType": "input" } 
      } 
      else { 
       dataTypes[i] = { "sSortDataType": "html" } 
      } 

      i++; 
     }); 
    }); 

J'espère que cette information est suffisante pour que vous me aider?

+2

Pourquoi vous bouclez à travers un sélecteur d'ID? – SLaks

Répondre

3
dataTypes = $('#' + _target + ' th').map(function(i, th) { 
    var $table = $(th).closest('table'); 
    var pos = $table.index(th) + 1; 
    return { "sSortDataType": $table.find('td:nth-child('+pos+')').is(':has(input)') ? 'input' : 'html' }; 
}); 

Edit: si vous exécutez ce sur une seule table (auquel cas l'appel each dans l'exemple d'origine ne fait pas beaucoup de sens), il devient plus simple:

dataTypes = $('#' + _target + ' th').map(function(pos, th) { 
    return { "sSortDataType": $(th).closest('table').find('td:nth-child('+(pos+1)+')').is(':has(input)') ? 'input' : 'html' }; 
}); 
+0

cela retourne seulement un tableau contenant des chaînes "html"? – Poku

+0

J'ai eu les arguments du rappel de la carte dans le mauvais ordre. Fixé maintenant – Tgr

+0

Maintenant ça marche. Je vous remercie! – Poku

0

Comme ceci:

if (jQuery(this).is(":has(input)")) { 

Vous pouvez simplifier votre code à l'aide .map:

dataTypes = jQuery('th', $table).map(function() { 
     if (jQuery(this).is(":has(input)")) 
      return { "sSortDataType": "input" }; 
     else 
      return { "sSortDataType": "html" }; 
    }).get(); 
+0

'.is()' renvoie une valeur booléenne, donc la longueur est inutile. –

+0

@Tatu: J'ai déjà réglé cela. – SLaks

+0

Pourquoi '.is (": a (entrée) ")' au lieu de juste '.has ('entrée')'? – user113716

0

Si vous êtes à la recherche pour les chefs d'accusation pourriez-vous pas seulement utiliser quelque chose comme ce qui suit?

var thMatches = $('#' + _target + ' th'); 
var thCount = thMatches.length; 
var thCountWithInputs = thMatches.find('input').length; 

Je n'ai pas obtenu mon IDE devant moi de sorte que le ci-dessus peut ne pas être correct mais je pense qu'il est assez proche de ce que vous recherchez.

0

Chacun vous donnera l'index de l'élément dans la liste. En supposant que tous vos éléments TH appartiennent à une colonne et que vous n'avez aucun autre TH dans la table, vous pouvez l'utiliser pour trouver les éléments nth-child TD (column) de chaque ligne et voir si ceux-ci contiennent une entrée.

jQuery('#' + _target).each(function() { 
    var $table = jQuery(this); 
    var i = 0; 
    jQuery('th', $table).each(function (column) { 
     if ($('tbody > tr').find('td:nth-child(' + (column+1) + ')') 
          .has('input') 
          .length) { 
      dataTypes[i] = { "sSortDataType": "input" } 
     } 
     else { 
      dataTypes[i] = { "sSortDataType": "html" } 
     } 

     i++; 
    }); 
}); 

EDIT: nième enfant est une base, alors que chacun d'eux est basé sur zéro, donc je l'ai ajouté un à la variable de la colonne pour en tenir compte.

+0

'.has()' ne retourne pas de booléen. – SLaks

+0

@SLaks - Correct - J'ai négligé la propriété de longueur. J'ai réparé ça. – tvanfosson