2010-04-26 4 views
0

menuOrder est un vide divjQuery Construire une table

$("#menuOrder").append('<table>'); 

$(menus).each(function(i, menu) { 
    $("#menuOrder").append('<tr><td>'); 
    $("#menuOrder").append(menu.text); 
    $("#menuOrder").append('</td><td>'); 

    if (i > 0) { 
    $("#menuOrder").append('<img src="/images/_images/up.png" />'); 
    } else { 
    $("#menuOrder").append('<img src="/images/_images/blank.png" />'); 
    } 

    if (i < menus.length - 1) { 
    $("#menuOrder").append('<img src="/images/_images/down.png" />'); 
    } 

    $("#menuOrder").append('</td>'); 
    $("#menuOrder").append('</tr>'); 
}); 

$("#menuOrder").append('</table>'); 

ce code fonctionne pas correctement, comment puis-je changer avec itérations minimum?

+2

Il est recommandé d'éviter beaucoup de .append comme celui-ci, au lieu lorsque cela est possible, de construire la chaîne avec HTML, puis ajoutez –

+0

comment puis-je le faire? – kusanagi

Répondre

4

Essayez de faire quelque chose comme ceci:

var rows = []; 
$(menus).each(function(i, menu) { 
var row = '<tr><td>'.menu.text.'</td><td>'; 

    if (i > 0) { 
     row +='<img src="/images/_images/up.png" />'; 
    } 
    else { 
     row +='<img src="/images/_images/blank.png" />'; 
    } 

    if (i < menus.length - 1) { 
     row +='<img src="/images/_images/down.png" />'; 
    } 

    row += '</td></tr>'; 
    rows.push(row); 
}); 
$('<table></table>').append(rows.join('')).appendTo('#menuOrder'); 

Ce remplit le tableau rows avec une chaîne qui contient le code HTML pour chaque ligne. Lorsque c'est fait en créant toutes les lignes, alors il crée un objet jQuery d'un élément de table et y ajoute toutes les lignes. Il ajoute ensuite la table à #menuOrder.

+0

Je voudrais aussi mentionner qu'il est préférable d'ajouter toutes les lignes à la fois, en stockant html pour eux dans une seule chaîne. certains navigateurs ont des problèmes lors de la manipulation des parties du code HTML interne de la table – vittore

1

Notez que avec append() vous ne pouvez pas le faire:

$("#menuOrder").append('</table>'); 

Au lieu de coller ensemble des morceaux de chaînes HTML, vous devez penser en termes de noeuds DOM complets. Des exemples d'arguments valables pour append():

.append($('.something')) 
.append(document.createElement('div')) 
.append('<div />') // automatically creates empty div element 
.append('<tr><td></td></tr>') // automatically creates tr with td inside