Je refactorise un ancien code JavaScript et il y a beaucoup de manipulation DOM en cours.
var d = document;
var odv = d.createElement("div");
odv.style.display = "none";
this.OuterDiv = odv;
var t = d.createElement("table");
t.cellSpacing = 0;
t.className = "text";
odv.appendChild(t);
Je voudrais savoir s'il existe une meilleure façon de le faire en utilisant jQuery. J'ai expérimenté avec:
var odv = $.create("div");
$.append(odv);
// And many more
Mais je ne sais pas si c'est mieux.
Réponses:
Voici votre exemple dans la ligne "un".
Mise à jour : je pensais que je mettrais à jour ce message car il reçoit encore beaucoup de trafic. Dans les commentaires ci-dessous, il y a une discussion sur
$("<div>")
vs$("<div></div>")
vs$(document.createElement('div'))
comme moyen de créer de nouveaux éléments, et qui est "le meilleur".J'ai mis en place une petite référence , et voici à peu près les résultats de la répétition des options ci-dessus 100 000 fois:
jQuery 1.4, 1.5, 1.6
jQuery 1.3
jQuery 1.2
Je pense que ce n'est pas une grosse surprise, mais
document.createElement
c'est la méthode la plus rapide. Bien sûr, avant de partir et de commencer à refactoriser l'intégralité de votre base de code, n'oubliez pas que les différences dont nous parlons ici (dans toutes les versions archaïques sauf jQuery) équivalent à environ 3 millisecondes supplémentaires pour mille éléments .Update 2
Mis à jour pour jQuery 1.7.2 et mis le benchmark sur
JSBen.ch
lequel est probablement un peu plus scientifique que mes benchmarks primitifs, en plus il peut être externalisé maintenant!http://jsben.ch/#/ARUtz
la source
$('div')
dont il est visuellement très similaire, mais fonctionnellement différent.$(document.createElement('div'))
et devrait-elle être la plus rapide?Le simple fait de fournir le code HTML des éléments que vous souhaitez ajouter à un constructeur jQuery
$()
renvoie un objet jQuery à partir du code HTML nouvellement construit, adapté pour être ajouté au DOM à l'aide de laappend()
méthode jQuery .Par exemple:
Vous pouvez ensuite remplir ce tableau par programme, si vous le souhaitez.
Cela vous donne la possibilité de spécifier n'importe quel code HTML arbitraire que vous aimez, y compris les noms de classe ou d'autres attributs, que vous pourriez trouver plus concis que d'utiliser
createElement
puis de définir des attributs commecellSpacing
etclassName
via JS.la source
$(htmlStr)
est implémenté en tant quedocument.createElement("div").innerHTML = htmlStr
. En d'autres termes, il appelle l'analyseur HTML du navigateur. HTML mal formé se casse différemment dans IE par rapport aux autres navigateurs.get
fonction qui renvoie l'élément DOM natif. (Je sais que ce sujet est ancien, mais je l'ajoute pour référence. ;-))[dom element].appendChild($('<html>')[0]);
La création de nouveaux éléments DOM est une caractéristique essentielle de la
jQuery()
méthode, voir:la source
$('<a>')
est inébranlable!Je fais comme ça:
la source
car
jQuery1.8
, utiliser$.parseHTML()
pour créer des éléments est un meilleur choix.il y a deux avantages:
1.si vous utilisez l'ancienne méthode, qui peut ressembler à quelque chose
$(string)
, jQuery examinera la chaîne pour vous assurer que vous souhaitez sélectionner une balise html ou créer un nouvel élément. En utilisant$.parseHTML()
, vous dites à jQuery que vous souhaitez créer un nouvel élément de manière explicite, donc les performances peuvent être un peu meilleures.2.La chose la plus importante est que vous pouvez souffrir d'attaques intersites ( plus d'informations ) si vous utilisez l'ancienne méthode. si vous avez quelque chose comme:
un méchant peut entrer
<script src="xss-attach.js"></script>
pour vous taquiner. heureusement,$.parseHTML()
évitez cet embarras pour vous:Cependant, veuillez noter que
a
c'est un objet jQuery tandis queb
c'est un élément html:la source
parseHTML
c'est bon pour le html provenant de sources externes, mais que " tout le boost est parti après avoir encapsulé les résultats dans un nouvel objet jQuery ". Autrement dit, si vous voulez coder en dur la création d'un nouvel élément html enveloppé dans jQuery, le$("<div>stuff</div>")
style semble toujours gagner.MISE À JOUR
Depuis les dernières versions de jQuery, la méthode suivante n'affecte pas les propriétés passées dans le deuxième objet
Réponse précédente
Je pense que l'utilisation
document.createElement('div')
avecjQuery
est plus rapide:la source
Bien que ce soit une très vieille question, j'ai pensé qu'il serait bien de la mettre à jour avec des informations récentes;
Depuis jQuery 1.8, il existe une fonction jQuery.parseHTML () qui est maintenant un moyen préféré de créer des éléments. En outre, il y a quelques problèmes avec l'analyse HTML via
$('(html code goes here)')
, par exemple le site Web officiel de jQuery mentionne ce qui suit dans l' une de leurs notes de version :Pour se rapporter à la question réelle, l'exemple fourni pourrait être traduit en:
ce qui est malheureusement moins pratique que d'utiliser simplement
$()
, mais cela vous donne plus de contrôle, par exemple, vous pouvez choisir d'exclure les balises de script (cela laissera les scripts en ligne commeonclick
si):En outre, voici un point de repère de la réponse du haut ajusté à la nouvelle réalité:
Lien JSbin
jQuery 1.9.1
Il semble être
parseHTML
beaucoup plus prochecreateElement
que$()
, mais tout le boost est parti après avoir enveloppé les résultats dans un nouvel objet jQueryla source
la source
Est le moyen le plus court / le plus simple de créer un élément DIV dans jQuery.
la source
Je viens de créer un petit plugin jQuery pour cela: https://github.com/ern0/jquery.create
Il suit votre syntaxe:
L'ID de noeud DOM peut être spécifié comme deuxième paramètre:
Est ce sérieux? Non. Mais cette syntaxe est meilleure que $ ("<div> </div>") , et c'est un très bon rapport qualité / prix.
Je suis un nouvel utilisateur de jQuery, passant de DOMAssistant, qui a une fonction similaire: http://www.domassistant.com/documentation/DOMAssistantContent-module.php
Mon plugin est plus simple, je pense que les attrs et le contenu sont mieux à ajouter en chaînant les méthodes:
C'est aussi un bon exemple pour un simple plugin jQuery (le 100e).
la source
C'est assez simple! Voici quelques exemples rapides ...
la source
Non mentionné dans les réponses précédentes, j'ajoute donc un exemple de travail pour créer des éléments avec la dernière jQuery, également avec des attributs supplémentaires comme le contenu, la classe ou le rappel onclick:
la source
jQuery out of the box n'a pas l'équivalent d'un createElement. En fait, la majorité du travail de jQuery se fait en interne en utilisant innerHTML sur une manipulation DOM pure. Comme Adam l'a mentionné ci-dessus, voici comment vous pouvez obtenir des résultats similaires.
Il existe également des plugins disponibles qui utilisent le DOM sur innerHTML comme appendDOM , DOMEC et FlyDOM pour n'en nommer que quelques-uns. En termes de performances, le jquery natif est toujours le plus performant (principalement parce qu'il utilise innerHTML)
la source