non, le second n'a pas d'identifiant, donc le même texte ne sera pas affiché.
Matt Ellen
.html est beaucoup plus rapide après sa première exécution. cela peut prendre environ une seconde lorsque vous l'exécutez pour la première fois.
sukhjit dhot
Réponses:
316
Chaque fois que vous passez une chaîne de code HTML à l'une des méthodes de jQuery, voici ce qui se passe:
Un élément temporaire est créé, appelons-le x. x innerHTMLest défini sur la chaîne HTML que vous avez transmise. Ensuite, jQuery transférera chacun des nœuds produits (c'est-à-dire les x childNodes) vers un fragment de document nouvellement créé, qu'il mettra ensuite en cache pour la prochaine fois. Il retournera alors le fragment childNodescomme une nouvelle collection DOM.
Notez que c'est en fait beaucoup plus compliqué que cela, car jQuery fait un tas de vérifications inter-navigateurs et diverses autres optimisations. Par exemple, si vous passez simplement <div></div>à jQuery(), jQuery prendra un raccourci et le fera simplement document.createElement('div').
EDIT : Pour voir la quantité de contrôles que jQuery effectue, jetez un œil ici , ici et ici .
innerHTMLest généralement l'approche la plus rapide, mais ne laissez pas cela régir tout le temps ce que vous faites. L'approche de jQuery n'est pas aussi simple que element.innerHTML = ...- comme je l'ai mentionné, il y a un tas de contrôles et d'optimisations.
La bonne technique dépend fortement de la situation. Si vous souhaitez créer un grand nombre d'éléments identiques, la dernière chose que vous voulez faire est de créer une boucle massive, créant un nouvel objet jQuery à chaque itération. Par exemple, le moyen le plus rapide de créer 100 divs avec jQuery:
jQuery(Array(101).join('<div></div>'));
Il y a aussi des problèmes de lisibilité et de maintenance à prendre en compte.
jQuery (Array (101) .join ('<div> </div>')); <- pourquoi 101 au lieu de 100?
tacone
2
Je voulais juste ajouter un point de données. Faire des tests de performances sur une application qui charge un grand lot (10K +) de <li> dans un <ul> et a vu une augmentation du temps de rendu (pas de chargement) de ~ 12s -> .25s en commutant le .append ( giantListHTMLAsASingleString) à .html (giantListHTMLAsASingleString). Si vous êtes déjà en train de faire l'astuce de «jointure» ou de créer une grosse chaîne html sur votre liste, il y a certainement une différence de performance dans ces deux méthodes.
omnisis
9
@tacone Parce que la "colle" de jonction est appliquée entre les éléments du tableau. 101aura 100 colles appliquées, tout comme se joindre à 3 éléments aurait 2 colles: EL-glue-EL-glue-EL. Dans l'exemple de James, les éléments du tableau sont "vides", donc la jonction de N éléments vides entraîne N-1 colles consécutives.
Il y a une grande différence en ce qu'il perd toutes les données attachées aux doms.
Adrian Bartholomew
68
Ils ne sont pas les mêmes. Le premier remplace le HTML sans créer d'abord un autre objet jQuery. Le second crée un wrapper jQuery supplémentaire pour le deuxième div, puis l' ajoute au premier.
var mySecondDiv=$('<div id="mySecondDiv"></div>');
$('#myDiv').html(mySecondDiv);var mySecondDiv=$('<div id="mySecondDiv"></div>');
$('#myDiv').append(mySecondDiv);
Vous avez plusieurs cas d'utilisation différents en cours. Si vous souhaitez remplacer le contenu, .htmlc'est un excellent appel car c'est l'équivalent de innerHTML = "...". Cependant, si vous souhaitez simplement ajouter du contenu, l' $()ensemble d'enveloppes supplémentaire n'est pas nécessaire.
N'utilisez deux wrappers que si vous devez manipuler l'ajout divultérieurement. Même dans ce cas, vous n'aurez peut-être besoin que d'en utiliser un:
var mySecondDiv = $("<div id='mySecondDiv'></div>").appendTo("#myDiv");// other code here
mySecondDiv.hide();
En outre, le premier aurait évidemment un identifiant de mySecondDiv tandis que l'autre n'aurait aucun identifiant dessus. Et la syntaxe devrait être .html ("<div id = 'mySecondDiv'> </div>") en utilisant des guillemets doubles afin de pouvoir utiliser les guillemets simples.
ryanulit
9
Eh bien, .html()utilise .innerHTMLce qui est plus rapide que la création DOM .
C'est un code jQuery extrêmement inefficace (et cassé). Si vous voulez éviter la concaténation, faites ceci: (également la note pxn'est pas nécessaire):$('<div />', { width: myWidth }).appendTo("#myDiv");
Doug Neiner
3
Comment est-ce "inutile"? L'affiche a demandé la «différence» (le mot-clé est «vs») alors je lui dis la différence. Le code est verbeux mais je ne dirais pas "inefficace" simplement parce que ce n'est pas un liner. Ne devrions-nous pas être verbeux lorsque nous expliquons des choses aux gens?
ce qui signifie que vous voulez ajouter automatiquement un téléchargement de fichier supplémentaire si des fichiers ont été téléchargés, le code mentionné ne fonctionnera pas, car après le téléchargement du fichier, le premier élément de téléchargement de fichier sera recréé et donc le fichier téléchargé sera effacé de celui-ci . Vous devriez utiliser .append () à la place:
function changed(){if(isAllowed){var tmpHTML ="<input type=\"file\" name=\"file1\" onchange=\"changed()\">";
$('#test').append(tmpHTML);
isAllowed =false;}}
Ça m'est arrivé . Version Jquery: 3.3. Si vous parcourez une liste d'objets et souhaitez ajouter chaque objet en tant qu'enfant d'un élément dom parent, alors .html et .append se comporteront très différemment. .htmlfinira par ajouter uniquement le dernier objet à l'élément parent, tandis que .appendtous les objets de liste seront ajoutés en tant qu'enfants de l'élément parent.
Réponses:
Chaque fois que vous passez une chaîne de code HTML à l'une des méthodes de jQuery, voici ce qui se passe:
Un élément temporaire est créé, appelons-le x. x
innerHTML
est défini sur la chaîne HTML que vous avez transmise. Ensuite, jQuery transférera chacun des nœuds produits (c'est-à-dire les xchildNodes
) vers un fragment de document nouvellement créé, qu'il mettra ensuite en cache pour la prochaine fois. Il retournera alors le fragmentchildNodes
comme une nouvelle collection DOM.Notez que c'est en fait beaucoup plus compliqué que cela, car jQuery fait un tas de vérifications inter-navigateurs et diverses autres optimisations. Par exemple, si vous passez simplement
<div></div>
àjQuery()
, jQuery prendra un raccourci et le fera simplementdocument.createElement('div')
.EDIT : Pour voir la quantité de contrôles que jQuery effectue, jetez un œil ici , ici et ici .
innerHTML
est généralement l'approche la plus rapide, mais ne laissez pas cela régir tout le temps ce que vous faites. L'approche de jQuery n'est pas aussi simple queelement.innerHTML = ...
- comme je l'ai mentionné, il y a un tas de contrôles et d'optimisations.La bonne technique dépend fortement de la situation. Si vous souhaitez créer un grand nombre d'éléments identiques, la dernière chose que vous voulez faire est de créer une boucle massive, créant un nouvel objet jQuery à chaque itération. Par exemple, le moyen le plus rapide de créer 100 divs avec jQuery:
Il y a aussi des problèmes de lisibilité et de maintenance à prendre en compte.
Ce:
... est beaucoup plus difficile à entretenir que cela:
la source
101
aura 100 colles appliquées, tout comme se joindre à 3 éléments aurait 2 colles:EL-glue-EL-glue-EL
. Dans l'exemple de James, les éléments du tableau sont "vides", donc la jonction de N éléments vides entraîne N-1 colles consécutives.Ils ne sont pas les mêmes. Le premier remplace le HTML sans créer d'abord un autre objet jQuery. Le second crée un wrapper jQuery supplémentaire pour le deuxième div, puis l' ajoute au premier.
Un jQuery Wrapper (par exemple):
Deux jQuery Wrappers (par exemple):
Vous avez plusieurs cas d'utilisation différents en cours. Si vous souhaitez remplacer le contenu,
.html
c'est un excellent appel car c'est l'équivalent deinnerHTML = "..."
. Cependant, si vous souhaitez simplement ajouter du contenu, l'$()
ensemble d'enveloppes supplémentaire n'est pas nécessaire.N'utilisez deux wrappers que si vous devez manipuler l'ajout
div
ultérieurement. Même dans ce cas, vous n'aurez peut-être besoin que d'en utiliser un:la source
si
.add
vous voulez dire par là.append
, le résultat est le même si#myDiv
est vide.la performance est-elle la même? ne sais pas.
.html(x)
finit par faire la même chose que.empty().append(x)
la source
Eh bien,
.html()
utilise.innerHTML
ce qui est plus rapide que la création DOM .la source
Vous pouvez obtenir la deuxième méthode pour obtenir le même effet en:
Luca a mentionné que
html()
juste insère le code HTML qui se traduit par des performances plus rapides.Dans certaines occasions cependant, vous opteriez pour la deuxième option, envisagez:
la source
px
n'est pas nécessaire):$('<div />', { width: myWidth }).appendTo("#myDiv");
.html()
remplacera tout..append()
va juste s'ajouter à la fin.la source
Autre que les réponses données, dans le cas où vous avez quelque chose comme ça:
ce qui signifie que vous voulez ajouter automatiquement un téléchargement de fichier supplémentaire si des fichiers ont été téléchargés, le code mentionné ne fonctionnera pas, car après le téléchargement du fichier, le premier élément de téléchargement de fichier sera recréé et donc le fichier téléchargé sera effacé de celui-ci . Vous devriez utiliser .append () à la place:
la source
Ça m'est arrivé . Version Jquery: 3.3. Si vous parcourez une liste d'objets et souhaitez ajouter chaque objet en tant qu'enfant d'un élément dom parent, alors .html et .append se comporteront très différemment.
.html
finira par ajouter uniquement le dernier objet à l'élément parent, tandis que.append
tous les objets de liste seront ajoutés en tant qu'enfants de l'élément parent.la source