2010-10-26 12 views
0

La questionAjouter TR après appariées, ou à la fin si ensemble apparié est vide dans jQuery

Je voudrais ajouter un nouveau TR dans une table après un ensemble assorti donné, ou au lieu, au fin de la table si l'ensemble correspondant est vide. Étant donné le code html suivant:

<table id="blax"> 
    <thead> 
    </thead> 
    <tbody> 
     <tr class="alpha"> 
     <td>some stuff</td> 
     <td>more stuff</td> 
     </tr> 
     <tr class="alpha"> 
     <td>some stuff</td> 
     <td>more stuff</td> 
     </tr> 
     <!-- new "alpha" tr to go here--> 
     <tr class="beta"> 
     <td>some stuff</td> 
     <td>more stuff</td> 
     </tr> 
     <tr class="beta"> 
     <td>some stuff</td> 
     <td>more stuff</td> 
     </tr> 
     <!-- but new "gamma" tr to go at end--> 
    </tbody>' 
</table> 

Je sais comment ajouter une nouvelle tr après un ensemble assorti, par exemple:

var b = $('#blax tbody'); 
var newAlphaTr = $('<tr class="alpha"></tr>') 
    .insertAfter(b.find('tr.alpha:last')); 

Mais si le code est exécuté pour la classe gamma (qui n » t existe encore dans la table)? Quel est un moyen facile de faire ensuite le point d'insertion du nouvel élément <tr class="gamma"></tr> juste aller à la fin de la table en utilisant le même code que celui utilisé pour l'insertion alpha?

function insertAtPosition(parentElement, afterElement, newElement) { 
    // some code here that does the job for either "alpha" or "gamma" 
} 

function creatElement(className) { 
    insertAtPosition(
     b, 
     b.find('tr.' + className + ':last'), 
     $('<tr class="' + className + '"></tr>' 
    ); 
} 

createElement('alpha'); 
createElement('gamma'); 

J'ai besoin d'aide pour remplir le bloc "code ici".

Maintenant, pour certains bavardages

et fait d'ailleurs insertAfter ramener l'élément inséré ou l'élément auquel il a été ajouté après? Je devine que after renvoie l'élément inséré et insertAfter renvoie l'article auquel il était attaché, comme comme la façon append et appendTo de travail, oui? Les docs de jQuery sont sympas mais ont quelques gros trous comme ne pas énumérer ce qui est retourné de chaque fonction (et je suis assez perplexe quant à la façon dont n'importe qui pourrait manquer cela). En fait, au moment où j'écrivais cette question, il m'a fallu beaucoup de concentration pour m'assurer que j'avais bien compris. Juste en pensant, il serait bien que append et appendTo supportent un paramètre facultatif qui est soit une position d'index, soit un élément enfant immédiat (ou un ensemble d'éléments enfants immédiats) après tout dont l'élément sera ajouté. Dans le cas de l'index, il pourrait s'agir de la position désirée ou de la position après laquelle insérer l'élément, de sorte que 0 ou -1 signifierait le premier enfant.

var b = $('#blax tbody'); 
var newAlphaTr = $('<tr class="alpha"></tr>') 
    .appendTo(b, $('tr.alpha', b)); 
// or perhaps a selector 
var newAlphaTr2 = $('<tr class="alpha"></tr>') 
    .appendTo(b, 'tr.alpha:last'); 

Ce introduirait une nouvelle classe B par alpha après jeu enfant spécifié. Je pourrais ajouter :last au sélecteur mais de cette façon serait bien. Si l'ensemble correspondant de 'td.alpha' est vide, alors il agirait comme l'append normalement et le mettrait après les enfants existants.

Répondre

0

Avec près de 2 ans de plus d'expérience jQuery sous ma ceinture depuis poser la question, je peux voir maintenant que la réponse est facile:

var b = $('#blax tbody'), 
    newAlphaTr = $('<tr class="alpha"></tr>') 
     .insertAfter(
     b.find('tr.alpha:last, tr:last') 
      .first() 
    ); 

au lieu de chercher juste sur le tr avec la classe souhaitée, aussi matc h la dernière tr indépendamment de la classe.Ensuite, prenez le premier avec first(), qui sera celui que nous voulons insérer après. Problème résolu.

0
<tbody id='zeta'/> 

$('#zeta').append('<tr class="alpha"></tr>'); 

êtes-vous prêt à le faire comme si/sinon?

if ($ ('alpha') longueur.> 0) {//
ajouter la classe
} else {//
ajouter sur tbody
}

+0

Veuillez relire la question. Je veux que le nouveau tr soit dans la table à un endroit précis, pas seulement à la fin à chaque fois. – ErikE