174 votes

jQuery vs document.querySelectorAll

J'ai entendu plusieurs fois que jQuery est meilleur atout est le moyen de requêtes et de manipuler des éléments dans le DOM: vous pouvez utiliser les CSS des requêtes pour créer des requêtes complexes qui serait très difficile à faire régulièrement de l'javascript . Cependant , autant que je sache , vous pouvez obtenir le même résultat avec document.querySelector ou document.querySelectorAll (qui sont pris en charge dans Internet Explorer 8 et ci-dessus) .

Donc la question est pourquoi le "risque" de jQuery surcharge si c'est plus fort actif peut être réalisé avec JavaScript ?

Je sais que jQuery a plus que des sélecteurs CSS , par exemple de la croix-navigateur AJAX, bel événement fixation etc. Mais c'est l'interrogation de la partie est d'une très grande partie de la force de jQuery .

Toutes les pensées?

138voto

Christoph Points 23467

document.querySelectorAll() a plusieurs incohérences entre les navigateurs et n'est pas pris en charge dans les navigateurs plus anciens,Ce ne sera probablement pas causer d'ennuis ont plus cours aujourd'hui. Il a très peu intuitive mécanisme de délimitation de l'étendue et de certains autres n'est pas très joli fonctionnalités. Aussi avec javascript, il aura plus de difficultés à travailler avec les ensembles de résultats de ces requêtes, qui, dans de nombreux cas, vous voudrez faire. jQuery fournit des fonctions pour travailler sur eux comme: filter(), find(), children(), parent(), map(), not() , et plusieurs autres. Pour ne pas mentionner le jQuery capacité à travailler avec des pseudo-sélecteurs de classe.

Cependant, je ne voudrais pas considérer ces choses comme jQuery les plus forts de fonctionnalités, mais d'autres choses comme "travail" sur le dom (événements, de style, de l'animation et de manipulation) dans un crossbrowser compatible façon ou de l'interface web ajax.

Si vous voulez seulement le sélecteur moteur de jQuery, vous pouvez utiliser l'une de jQuery: Grésillement de Cette façon, vous avez le pouvoir de jQuerys Sélecteur moteur sans le méchant de frais généraux.

EDIT: Juste pour mémoire, je suis un énorme vanille JavaScript ventilateur. Néanmoins, il est un fait que vous avez parfois besoin de 10 lignes de JavaScript où vous l'écrire 1 ligne de jQuery.

Bien sûr, vous devez être discipliné pour ne pas écrire jQuery comme ceci:

$('ul.first').find('.foo').css('background-color', 'red').end().find('.bar').css('background-color', 'green').end();

C'est extrêmement difficile à lire, tandis que le dernier est assez clair:

$('ul.first')
   .find('.foo')
      .css('background-color', 'red')
.end()
   .find('.bar')
      .css('background-color', 'green')
.end();

L'équivalent JavaScript serait beaucoup plus complexe illustré par le pseudo-code ci-dessus:

1) Trouver l'élément, envisager de prendre tous les éléments ou seulement sur la première.

// $('ul.first')
// taking querySelectorAll has to be considered
var e = document.querySelector("ul.first");

2) effectuer une Itération sur le tableau de nœuds enfants par le biais de certains (éventuellement imbriquées ou récursif) les boucles et vérifier la classe (classlist pas disponible dans tous les navigateurs!)

//.find('.foo')
for (var i = 0;i<e.length;i++){
     // older browser don't have element.classList -> even more complex
     e[i].children.classList.contains('.foo');
     // do some more magic stuff here
}

3) appliquer le style css

// .css('background-color', 'green')
// note different notation
element.style.backgroundColor = "green" // or
element.style["background-color"] = "green"

Ce code serait au moins deux fois plus de lignes de code que vous écrivez avec jQuery. Aussi vous n'avez qu'à examiner les problèmes de navigateur qui risque de compromettre la grave avantage de vitesse (en plus de la fiabilité) du code natif.

68voto

Pascalius Points 1202

Si vous êtes à l'optimisation de votre page pour IE8 ou plus récent, vous devriez vraiment envisager si vous avez besoin de jquery ou pas. Les navigateurs modernes ont de nombreux atouts en natif qui jquery fournit.

Si vous vous souciez de la performance, vous pouvez avoir d'incroyables avantages de performance (2-10 plus rapide) à l'aide de code javascript: http://jsperf.com/jquery-vs-native-selector-and-element-style/2

J'ai transformé un div-tagcloud de jquery pour javascript natif (IE8+ compatible), les résultats sont impressionnants. 4 fois plus rapide avec juste un peu de surcharge.

                    Number of lines       Execution Time                       
Jquery version :        340                    155ms
Native version :        370                    27ms

Vous ne Pourriez Pas Besoin de Jquery offre une très belle vue d'ensemble des méthodes indigènes de remplacer pour qui la version de votre navigateur.

http://youmightnotneedjquery.com/


Annexe: Poursuite de la vitesse des comparaisons natifs méthodes en concurrence pour jquery

9voto

MaxArt Points 8278

C'est parce que jQuery peut faire beaucoup plus que querySelectorAll.

Tout d'abord, jQuery (et Grésillement, en particulier), des œuvres pour les anciens navigateurs tels que IE7-8 qui ne prend pas en charge le CSS2.1-3 sélecteurs.

De Plus, le Grésillement (qui est le sélecteur moteur de jQuery) vous offre beaucoup plus avancés, sélecteur d'instruments, comme l' :selected pseudo-classe, un avant - :not() sélecteur de plus en plus complexes, de la syntaxe, comme en $("> .children") et ainsi de suite.

Et il le fait inter-navigateurs, parfaitement, offrant tout ce que jQuery peut offrir (plugins et Api).

Oui, si vous pensez que vous pouvez compter sur simple classe et les sélecteurs d'id, jQuery, c'est trop pour vous, et vous auriez du payer une exagération de la pay-off. Mais si vous ne le faites pas, et que vous voulez prendre avantage de tous jQuery bonté, puis l'utiliser.

8voto

KGZM Points 376

jQuery Grésillement sélecteur moteur peut utiliser querySelectorAll si elle est disponible. Il a également gommera les incohérences entre les navigateurs afin d'obtenir des résultats uniformes. Si vous ne souhaitez pas l'utiliser tout de jQuery, vous pouvez simplement utiliser le Grésillement séparément. C'est une question assez fondamentale de la roue à inventer.

Voici quelques cerises-choix de la source qui montrent le genre de choses jQuery(w/ Grésillement) trie pour vous:

Safari en mode quirks:

if ( document.querySelectorAll ) {
  (function(){
    var oldSizzle = Sizzle,
      div = document.createElement("div"),
      id = "__sizzle__";

    div.innerHTML = "<p class='TEST'></p>";

    // Safari can't handle uppercase or unicode characters when
    // in quirks mode.
    if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
      return;
    }

Si la garde d'échec, il utilise une version de Grésillement qui n'est pas amélioré avec querySelectorAll. Plus bas, il y a des poignées pour les incohérences dans IE, Opera, et le navigateur Blackberry.

  // Check parentNode to catch when Blackberry 4.6 returns
  // nodes that are no longer in the document #6963
  if ( elem && elem.parentNode ) {
    // Handle the case where IE and Opera return items
    // by name instead of ID
    if ( elem.id === match[3] ) {
      return makeArray( [ elem ], extra );
    }

  } else {
    return makeArray( [], extra );
  }

Et si tout le reste échoue, il sera de retour le résultat de l' oldSizzle(query, context, extra, seed).

2voto

Vanuan Points 4751

Je pense que la vraie réponse est que jQuery a été développé bien avant querySelector/querySelectorAll est devenu disponible dans tous les principaux navigateurs.

Première version de jQuery a été en 2006. En fait, même jQuery n'était pas le premier qui a mis en place les sélecteurs CSS.

IE a été le dernier navigateur à mettre en oeuvre querySelector/querySelectorAll. Sa 8e version a été publiée en 2009.

Alors maintenant, DOM éléments sélecteurs n'est pas le point fort de jQuery plus. Cependant, il a encore beaucoup de bonnes choses dans sa manche, comme des raccourcis pour changer l'élément du css et html du contenu, des animations, des événements de liaison, ajax.

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