245 votes

Quand faut-il utiliser la vanille JavaScript vs jQuery ?

J'ai remarqué lors de la surveillance/d'essayer de répondre commune jQuery questions, qu'il y a certaines pratiques à l'aide de javascript, au lieu de jQuery, qui effectivement vous permettre d' écrire moins et ... eh bien, le même montant. Et peut également produire des avantages de performance.

Un exemple spécifique

$(this) vs this

À l'intérieur d'un événement click du référencement de l'cliqué objets id

jQuery

$(this).attr("id");

Javascript

this.id;

Existe-il des autres communes de ce type de pratique? Lorsque certaines Javascript opérations pourrait être accompli plus facile, sans apporter de jQuery dans le mélange. Ou est-ce un cas rare? (de jQuery "raccourci" exigeant plus de code)

EDIT : même si j'apprécie les réponses concernant jQuery vs plaine de performances javascript, je suis actuellement à la recherche pour beaucoup plus quantitative des réponses. Tout en utilisant jQuery, les cas où l'on aurait fait mieux (lisibilité/compacité) d'utiliser du javascript au lieu d'utiliser $(). En plus de l'exemple que j'ai donné dans ma question initiale.

209voto

user113716 Points 143363
  • this.id (comme vous le savez)
  • this.value (sur la plupart des types d'entrée. seulement des questions je sais c'est à dire quand une <select> n'ont pas d' value jeu de propriétés sur sa <option> éléments, ou à la radio entrées dans Safari.)
  • this.className d'obtenir ou de définir un ensemble de la "classe" de la propriété
  • this.selectedIndex contre une <select> pour obtenir l'index sélectionné
  • this.options contre une <select> pour obtenir une liste d' <option> éléments
  • this.text contre une <option> pour obtenir son contenu texte
  • this.rows contre une <table> d'obtenir une collection de <tr> éléments
  • this.cells contre une <tr> pour obtenir ses cellules (td et th)
  • this.parentNode pour obtenir un parent direct
  • this.checked pour obtenir l'état coché d'un checkbox Merci @Tim Bas
  • this.selected pour obtenir l'état de sélection de l' option Merci @Tim Bas
  • this.disabled pour obtenir l'état désactivé de l' input Merci @Tim Bas
  • this.readOnly pour obtenir le readOnly état d'un input Merci @Tim Bas
  • this.href contre une <a> élément pour obtenir son href
  • this.hostname contre une <a> élément pour obtenir le domaine de ses href
  • this.pathname contre une <a> élément pour obtenir le chemin de son href
  • this.search contre une <a> élément pour obtenir la chaîne de requête de son href
  • this.src contre un élément où il est possible d'avoir un src

...Je pense que vous obtenez l'idée.

Il y aura des moments où la performance est cruciale. Si vous effectuez quelque chose dans une boucle de nombreuses fois, vous pouvez fossé jQuery.

En général, vous pouvez remplacer:

$(el).attr('someName');

avec:

Ci-dessus a été mal formulé. getAttribute n'est pas un remplacement, mais il ne récupérer la valeur d'un attribut envoyés à partir du serveur, et de ses correspondants setAttribute va le mettre. Nécessaire dans certains cas.

Les phrases ci-dessous sorte de couvert. Voir cette réponse pour un meilleur traitement.

el.getAttribute('someName');

...pour accéder à un attribut directement. Notez que les attributs ne sont pas les mêmes propriétés (si ils en miroir les uns des autres, parfois). Bien sûr, il y a setAttribute trop.

Disons que vous avez eu une situation où ont reçu une page où vous avez besoin de déballer toutes les balises d'un certain type. Il est court et facile avec jQuery:

$('span').unwrap();  // unwrap all span elements

Mais si il y a beaucoup, vous voudrez peut-être faire un peu de native API DOM:

var spans = document.getElementsByTagName('span');

while( spans[0] ) {
    var parent = spans[0].parentNode;
    while( spans[0].firstChild ) {
        parent.insertBefore( spans[0].firstChild, spans[0]);
    }
    parent.removeChild( spans[0] );
}

Ce code est assez court, il est plus performante que la version jQuery, et peut facilement être transformé en une réutilisables fonction dans votre bibliothèque personnelle.

Il peut sembler comme j'ai une boucle infinie avec l'extérieur while en raison de l' while(spans[0]), mais parce que nous avons affaire à un "live liste" il sera mis à jour lorsque nous faisons l' parent.removeChild(span[0]);. C'est plutôt une fonctionnalité utile qui nous échappe lorsque l'on travaille avec un Tableau (ou d'une Matrice (comme objet) à la place.

63voto

g.d.d.c Points 20164

La bonne réponse est que vous aurez toujours prendre une pénalité sur les performances lors de l'utilisation de jQuery à la place de 'bon vieux' JavaScript natif. C'est parce que jQuery est une Bibliothèque JavaScript. Ce n'est pas une fantaisie nouvelle version de JavaScript.

La raison que jQuery est puissant, c'est qu'il rend certaines choses qui sont trop fastidieux dans un cross-browser situation (AJAX est l'un des meilleurs exemples) et lisse sur les incohérences entre la multitude de navigateurs disponibles et fournit une API cohérente. Il a également facilement facilite les concepts comme le chaînage, implicite itération, etc, afin de faciliter le travail sur les groupes d'éléments de l'ensemble.

L'apprentissage de jQuery n'est pas un substitut pour l'apprentissage de JavaScript. Vous devriez avoir une base solide dans ce dernier, de sorte que vous apprécier pleinement ce savoir l'ancien est de rendre plus facile pour vous.

-- Modifié pour englober les commentaires --

Les commentaires sont prompts à souligner (et je suis d'accord avec 100%) les déclarations ci-dessus se réfèrent à l'analyse comparative de code. Un "native" JavaScript solution (en supposant que c'est bien écrit) sera supérieur à celui d'un jQuery solution qui accomplit la même chose dans presque tous les cas (j'aimerais voir un exemple). jQuery n'est d'accélérer les temps de développement, ce qui est un avantage important qui je ne veux pas minimiser l'importance. Il facilite facile à lire, facile à suivre, code, ce qui est plus que certains développeurs sont capables de créer sur leur propre.

À mon avis, alors, la réponse dépend de ce que vous tentez d'atteindre. Si, comme je le présume, basé sur la référence à des avantages de performance, vous êtes après de la meilleure vitesse possible en dehors de votre application, puis à l'aide de jQuery introduit surcharge chaque fois que vous appelez $(). Si vous allez pour des raisons de lisibilité, la cohérence, la compatibilité du navigateur, etc, alors il y a certainement des raisons à la faveur de jQuery sur "native" de JavaScript.

39voto

Leniel Macaferi Points 38324

Il y a un cadre appelé... oh devinez quoi? Vanilla JS. J'espère que vous obtenez la blague... :D Il sacrifices code de lisibilité de la performance... la Comparant à d' jQuery ci-dessous, vous pouvez voir que la récupération d'un DOM élément en ID est presque 35X plus rapide. :)

Donc, si vous voulez de la performance, vous feriez mieux d'essayer de Vanille JS et d'en tirer vos propres conclusions. Peut-être que vous ne connaitrez pas de JavaScript suspendu le navigateur de l'interface graphique GUI/verrouiller le thread d'INTERFACE utilisateur intensif de code comme l'intérieur d'un for boucle.

Vanilla JS est rapide, léger, multi-plateforme-cadre pour bâtiment incroyable, puissant applications JavaScript.

Sur leur page d'accueil, il y a quelques perf comparaisons:

enter image description here

18voto

slebetman Points 28276

Il y a déjà accepté de répondre mais je crois pas de réponse tapé directement ici peut être complet dans sa liste de javascript natif méthodes/attributs qui n'a pratiquement garanti en charge des navigateurs. Pour que je peut vous rediriger vers des quirksmode:

http://www.quirksmode.org/compatibility.html

C'est peut-être la liste la plus complète de ce qui fonctionne et ce qui ne fonctionne pas sur quel navigateur de n'importe où. Accorder une attention particulière aux DOM section. Il y a beaucoup à lire, mais le point n'est pas de tout lire mais de l'utiliser comme une référence.

Quand j'ai commencé sérieusement à l'écriture web apps que j'ai imprimé tous les DOM tables et accroché sur le mur de sorte que je sais en un coup d'œil ce qui est sûr à utiliser et ce qui nécessite des hacks. Ces jours-ci j'ai juste quelque chose comme google quirksmode parentNode compatibility quand j'ai des doutes.

Comme toute autre chose, le jugement est surtout une question d'expérience. Je ne serais pas vraiment vous recommandons de lire l'intégralité du site et de mémoriser toutes les questions pour savoir quand utiliser jQuery et quand utiliser du JS. Juste être conscient de la liste. Il est assez facile de recherche. Avec le temps, vous aurez à développer un instinct de lors de la plaine JS est préférable.


PS: PPK (l'auteur du site) a également un très beau livre que je recommande la lecture

14voto

Phrogz Points 112337

Quand:

  1. vous savez qu'il est inébranlable de la croix-prise en charge du navigateur pour ce que vous faites, et
  2. il n'est pas significativement plus de code à taper, et
  3. il n'est pas significativement moins lisible, et
  4. vous êtes assez confiant que jQuery ne pas choisir différentes implémentations basées sur le navigateur pour obtenir de meilleures performances, alors:

l'utilisation de JavaScript. Sinon utiliser jQuery (si vous pouvez).

Edit: Cette réponse s'applique à la fois au moment de choisir d'utiliser jQuery globale contre les laissant, ainsi que de choisir d'utiliser la vanille JS dans jQuery. Le choix entre attr('id') et .id se penche en faveur de la JS, tandis que le choix entre removeClass('foo') contre .className = .className.replace( new Regexp("(?:^|\\s+)"+foo+"(?:\\s+|$)",'g'), '' ) se penche en faveur de jQuery.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X