Pièges jQuery à éviter [fermé]

210

Je démarre un projet avec jQuery.

Quels pièges / erreurs / idées fausses / abus / abus avez-vous eu dans votre projet jQuery?

flybywire
la source
4
Cela n'aurait pas dû être clos car il n'était "pas constructif". Des réponses très utiles se sont matérialisées et la question a été suivie 220 fois. Veuillez voter pour rouvrir, si vous avez suffisamment de karma.
Roy Prins
Il me semble que jQuery est un piège en soi
gromit190

Réponses:

189

Ignorer les performances atteintes et sur-utiliser les sélecteurs au lieu de les affecter à des variables locales. Par exemple:-

$('#button').click(function() {
    $('#label').method();
    $('#label').method2();
    $('#label').css('background-color', 'red');
});

Plutôt que:-

$('#button').click(function() {
    var $label = $('#label');
    $label.method();
    $label.method2();
    $label.css('background-color', 'red');
});

Ou encore mieux avec enchaînement : -

$('#button').click(function() {
    $("#label").method().method2().css("background-color", "red"); 
});

J'ai trouvé cela le moment instructif quand j'ai réalisé comment les piles d'appels fonctionnent.

Edit: incorporé des suggestions dans les commentaires.

Gavin Gilmour
la source
16
+1 pour le lien youtube. merde sacrée j'ai beaucoup appris.
Jason
23
Je pense que l'attribution de choses aux variables locales est géniale mais n'oubliez pas la puissance du chaînage (à partir de votre exemple): $ ("# label"). Method (). Method2 (). Css ("background-color", " rouge");
Lance McNearney
La vidéo YouTube était super. J'ai vu d'autres présentations de Google sur le sujet et j'ai encore appris quelques choses! Merci!
Gabriel Hurley
+1 pour le lien également, excellent!
Josh Stodola
7
C'est une sorte de convention d'utiliser un signe dollar pour les variables avec le contexte jQuery. Donc, vous voudrez peut-être écrirevar $label = $('#label');
Tim Büthe
90

Comprenez comment utiliser le contexte. Normalement, un sélecteur jQuery recherchera tout le document:

// This will search whole doc for elements with class myClass
$('.myClass');

Mais vous pouvez accélérer les choses en recherchant dans un contexte:

var ct = $('#myContainer');
// This will search for elements with class myClass within the myContainer child elements
$('.myClass', ct);
slolife
la source
9
Aaaaaaah! Eh bien, c'est environ 1 000 000 de mes bugs corrigés. +1
jammus
4
Il semble que votre dernier point soit incorrect - groups.google.co.uk/group/jquery-dev/browse_thread/thread/…
James
1
Merci d'avoir signalé cela JP. Maintenant, que faire ... Dois-je supprimer ma réponse pour que personne ne se déchaîne et ne change son code pour rien?
slolife
Non, c'est toujours un bon point, en termes d'optimisation. :)
James
2
jQuery vérifie si le contexte est une instance de jQuery, il n'y a donc aucune raison de le faire [0]. $('.myClass', ct);ou si vous savez que ct est une instance de jQuery, vous pouvez utiliser findct.find(".myClass")
gradbot
62

N'utilisez pas de sélecteurs de classe nus, comme ceci:

$('.button').click(function() { /* do something */ });

Cela finira par regarder chaque élément pour voir s'il a une classe de "bouton".

Au lieu de cela, vous pouvez l'aider, comme:

$('span.button').click(function() { /* do something */ });
$('#userform .button').click(function() { /* do something */ });

J'ai appris cela l'année dernière sur le blog de Rebecca Murphy

Mise à jour - Cette réponse a été donnée il y a plus de 2 ans et n'est pas correcte pour la version actuelle de jQuery. L'un des commentaires comprend un test pour le prouver. Il existe également une version mise à jour du test qui inclut la version de jQuery au moment de cette réponse.

BrianH
la source
6
J'avais également l'impression que l'inverse était vrai. C'est peut-être le cas dans les navigateurs qui n'implémentent pas getElementsByClassName, mais sinon vous donnez simplement plus de travail à jQuery. J'aimerais beaucoup voir Rebecca publier des repères :)
Alex Barrett
7
Vous RÉDUISEZ la quantité de travail qu'il doit faire. C'est comme dire à quelqu'un de sortir vos chaussettes du tiroir de votre commode au lieu de lui dire de sortir les chaussettes de votre chambre. Réduit considérablement le nombre de «regards» à effectuer.
Sneakyness
4
L'inverse est vrai lorsque vous écrivez CSS (au moins en incluant la balise element). Voir code.google.com/speed/page-speed/docs/…
kmiyashiro
7
@Sneakyness Tout n'a pas d'analogue précis de la vie réelle. Par exemple, $('.b')pourrait utiliser document.getElementsByClassName('b')si le navigateur le prend en charge, mais cela $('a.b')entraînera l'obtention de tous les éléments correspondants avec la classe b, puis confirmera qu'ils sont des ancres dans une opération en deux étapes. Ce dernier me semble plus de travail. Pour une analogie réelle, essayez ceci: trouvez toutes les chaussettes dans ma chambre. Maintenant, jetez ceux qui ne sont pas dans ma commode.
alex
2
Je crois que l'idée fausse sur les sélecteurs est due au fait que dans les anciennes versions de jquery, il était plus rapide de faire $ ('# foo') plutôt que $ ('div # foo'), car par définition, un identifiant est unique. Je suis à peu près sûr que cela a été corrigé dans les versions ultérieures, mais cette recommandation ne s'appliquait qu'aux identifiants, pas aux autres types de sélecteurs
Alex Heyd
35

Essayez de diviser les fonctions anonymes afin de pouvoir les réutiliser.

//Avoid
$('#div').click( function(){
   //do something
});

//Do do
function divClickFn (){
   //do something    
}

$('#div').click( divClickFn );
carré rouge
la source
19
Je pense que cela s'applique à peu près au même degré que le code synchrone (en ligne) doit être divisé en fonctions nommées. Si vous avez un morceau de code qui demande un nom, alors allez-y. Mais ne déplacez pas le code hors de la ligne simplement parce que vous l'enveloppez dans une fonction; les fonctions anonymes existent pour une bonne raison.
Dan Breslau
4
En fait, j'aime donner un «nom» à ma fonction. Il est très utile lorsque vous déboguez le code et au lieu de voir une liste infinie de fonctions anonymes, vous voyez des fonctions correctement nommées.
SolutionYogi
1
Votre point est bien compris, et j'ai probablement été déclenché par moi-même à plusieurs reprises. Même ainsi, "à peu près le même degré" fonctionne toujours pour moi.
Dan Breslau
1
esp. si la liaison se fait en boucle!
daniellmb
Les fonctions nommées vous sont également très utiles lors du débogage; rien n'est plus nul que de regarder une pile de 8 niveaux de profondeur qui n'a rien d'autre (anonymous). En savoir plus sur cette astuce ici: stackoverflow.com/questions/182630/jquery-tips-and-tricks/…
ken
34
  • Évitez d'abuser du document prêt.
  • Gardez le document prêt pour initialiser le code uniquement.
  • Extrayez toujours les fonctions en dehors du document prêt afin qu'elles puissent être réutilisées.

J'ai vu des centaines de lignes de code à l'intérieur de l'instruction doc ready. Moche, illisible et impossible à entretenir.

Peter Mortensen
la source
6
+1. En général, la plupart du code jQuery que j'ai vu utilise des fonctions avec des centaines de lignes. Je ne sais pas pourquoi les «développeurs jQuery» n'aiment pas utiliser des fonctions plus petites.
SolutionYogi
6
@SolutionYogi parce que la plupart ne sont que des noobs JS?
adamJLev
Je suis tout à fait d'accord pour ne pas mettre de très longues fonctions dans un document prêt, c'est un bon conseil. Cependant, la création de nombreuses fonctions de petits composants exécutées à partir d'une fonction globale qui n'est pas dans le document n'est pas nécessairement la meilleure pratique. Si la fonction globale est la seule qui utilise ces morceaux de code, vous feriez mieux de tout mettre dans la même fonction même si elle est plus difficile à lire. L'appel de fonctions a beaucoup de frais généraux et si vous n'utilisez le code que dans un seul contexte, cela devrait être évité.
sage88
34

Lors de l'utilisation de la $.ajaxfonction pour les demandes Ajax au serveur, vous devez éviter d'utiliser l' completeévénement pour traiter les données de réponse. Il se déclenchera si la demande a réussi ou non.

Plutôt que d' completeutiliser success.

Voir les événements Ajax dans la documentation.

Patrick McElhaney
la source
1
J'ai fait des allers-retours sur le succès par rapport à complet, pouvez-vous expliquer pourquoi vous pensez que terminer est mieux?
Neil N
1
Je ne dis pas que complet est mieux. Ce que j'essayais de dire, c'est que vous devez éviter l'utilisation trompeuse de complete et que vous devez utiliser le succès afin de pouvoir traiter les données de réponse.
Artem Barger
2
Eh bien, on l'appelle toujours. Cependant, je ne serais pas d'accord. Complet est le meilleur pour cacher un gif de chargement, etc. Vous devez bien sûr utiliser le succès pour gérer la réponse et l'erreur pour toute erreur.
redsquare
1
Il suggère d'utiliser le succès au lieu de terminer. 'complete' se déclenche toujours lorsque la requête ajax est 'complete', peu importe qu'elle se soit terminée avec succès ou sans succès.
SolutionYogi
@redsquare, pouvez-vous développer exactement ce avec quoi vous n'êtes pas d'accord? Je faisais référence au processus de données et cela ne me dérangeait pas de voir les photos cacher / montrer les opportunités que vous avez avec un gestionnaire complet.
Artem Barger
24

"Chaînage" d'événements d'animation avec rappels.

Supposons que vous vouliez animer un paragraphe disparaissant en cliquant dessus. Vous vouliez également supprimer l'élément du DOM par la suite. Vous pouvez penser que vous pouvez simplement enchaîner les méthodes:

$("p").click(function(e) {
  $(this).fadeOut("slow").remove();
});

Dans cet exemple, .remove () sera appelé avant la fin de .fadeOut (), détruisant votre effet de fondu progressif et faisant simplement disparaître l'élément instantanément. Au lieu de cela, lorsque vous souhaitez lancer une commande uniquement après avoir terminé la précédente, utilisez le rappel:

$("p").click(function(e){
  $(this).fadeOut("slow", function(){
    $(this).remove();
  });
});

Le deuxième paramètre de .fadeOut () est une fonction anonyme qui s'exécutera une fois l'animation .fadeOut () terminée. Cela se traduit par une décoloration progressive et une suppression ultérieure de l'élément.

Sampson
la source
24

Si vous liez () le même événement plusieurs fois, il se déclenchera plusieurs fois. Je vais d'habitude toujours unbind('click').bind('click')juste pour être en sécurité

Scott Evernden
la source
2
Ce n'est pas spécifique à jQuery, bien que ce soit important à garder à l'esprit.
SolutionYogi
11
Vous pouvez utiliser des événements en direct pour ne pas avoir à lier deux fois le même événement.
Powerlord
live a ses propres problèmes (de performance) s'il est utilisé à outrance. Mieux en 1.3.3 où vous pouvez donner du contexte.
redsquare
23

N'abusez pas des plug-ins.

La plupart du temps, vous n'aurez besoin que de la bibliothèque et peut-être de l'interface utilisateur. Si vous restez simple, votre code sera maintenable à long terme. Tous les plug-ins ne sont pas pris en charge et maintenus, en fait la plupart ne le sont pas. Si vous pouvez imiter la fonctionnalité en utilisant des éléments de base, je le recommande fortement.

Les plug-ins sont faciles à insérer dans votre code, vous font gagner du temps, mais lorsque vous aurez besoin de quelque chose en plus, ce n'est pas une bonne idée de les modifier, car vous perdez les mises à jour possibles. Le temps que vous économisez au début vous perdra plus tard lors de la modification des plug-ins obsolètes.

Choisissez judicieusement les plug-ins que vous utilisez. Outre la bibliothèque et l'interface utilisateur, j'utilise constamment $ .cookie , $ .form , $ .validate et thickbox . Pour le reste, je développe principalement mes propres plug-ins.

Elzo Valugi
la source
2
Et la grille? Vous faites le vôtre?
jmav
Oui. d'un projet à l'autre, les données du projet se présentent de différentes manières. Je préfère avoir un contrôle total sur le fait que la réalisation de cette grille ne m'aide qu'au milieu, puis je dois improviser.
Elzo Valugi
SI {avec suffisamment de temps, je préfère généralement écrire tout le code de manipulation dom-pilotée par les données (css / html) directement. en d'autres termes - ne transmettez pas de données à un «plugin» et faites-le cracher du HTML. il est assez difficile d'évaluer (le milieu de terrain) des plugins pour la compatibilité de la portée actuelle, oubliez les demandes futures. pensez ... designers, planificateurs, managers, managers, managers. oh et les clients et les utilisateurs. mais si vous avez toutes ces choses, vous n'aurez pas assez de «temps». alors allez déjà utiliser jqgrid - vous perdez du temps à délibérer. est-ce déjà fait?}
user406905
22

Piège: utiliser des boucles au lieu de sélecteurs.

Si vous vous retrouvez à utiliser la méthode jQuery '.each' pour parcourir les éléments DOM, demandez-vous si vous pouvez utiliser un sélecteur pour obtenir les éléments à la place.

Plus d'informations sur les sélecteurs jQuery:
http://docs.jquery.com/Selectors

Piège: NE PAS utiliser un outil comme Firebug

Firebug a été pratiquement conçu pour ce type de débogage. Si vous allez fouiner dans le DOM avec Javascript, vous avez besoin d'un bon outil comme Firebug pour vous donner de la visibilité.

Plus d'informations sur Firebug: http://getfirebug.com/

D'autres bonnes idées sont dans cet épisode du podcast polymorphe: (jQuery Secrets avec Dave Ward) http://polymorphicpodcast.com/shows/jquery/

Dan Esparza
la source
1
J'ai fait le premier plusieurs fois. Vous devez juste vous rappeler que la plupart des fonctions jQuery fonctionneront sur tous les éléments renvoyés par un sélecteur.
DisgruntledGoat
Je n'aime pas la méthode .each pour être honnête
Simon Hayter
14

Mauvaise compréhension de l'utilisation de cet identifiant dans le bon contexte. Par exemple:

$( "#first_element").click( function( event)
{
   $(this).method( ); //referring to first_element
   $(".listOfElements").each( function()
   {
      $(this).someMethod( ); // here 'this' is not referring first_element anymore.
   })
});

Et voici l'un des exemples de la façon dont vous pouvez le résoudre:

$( "#first_element").click( function( event)
{
   $(this).method( ); //referring to first_element
   var $that = this;
   $(".listOfElements").each( function()
   {
      $that.someMethod( ); // here 'that' is referring to first_element still.
   })
});
Artem Barger
la source
1
+1 Plus un problème javascript qu'un problème jquery, mais j'ai souvent été gêné par cela.
mmacaulay
13

Évitez de rechercher plusieurs fois dans l'ensemble du DOM. C'est quelque chose qui peut vraiment retarder votre script.

Mauvais:

$(".aclass").this();
$(".aclass").that();
...

Bien:

$(".aclass").this().that();

Mauvais:

$("#form .text").this();
$("#form .int").that();
$("#form .choice").method();

Bien:

$("#form")
    .find(".text").this().end()
    .find(".int").that().end()
    .find(".choice").method();
googletorp
la source
2
$ (". aclass"). this (). that (); n'est pas bon! les sélecteurs de classe uniquement sont lents
redsquare
Il s'agit d'un exemple illustratif montrant la capacité de Jquery à utiliser plusieurs méthodes sur une sélection. J'ai rendu la sélection simple (et donc lente) pour me concentrer davantage sur cette technique.
googletorp
10
Éviter de rechercher le DOM à plusieurs reprises est une bonne chose - le dernier exemple est un gâchis illisible où je n'ai aucune idée de ce qui se passe. Si vous prévoyez d'utiliser le résultat d'une extraction plusieurs fois, stockez-le dans une variable. Cela rend le code beaucoup plus facile à gérer.
Quentin
12

Mettez toujours $ (this) en cache dans une variable significative, en particulier dans un .each ()

Comme ça

$(selector).each(function () {
    var eachOf_X_loop = $(this); 
})
conception
la source
12
Utilisez $selfou $thissi vous êtes trop paresseux pour penser à un bon nom de variable.
gradbot
10

Similaire à ce que Repo Man a dit, mais pas tout à fait.

Lors du développement de winforms ASP.NET, je le fais souvent

$('<%= Label1.ClientID %>');

en oubliant le signe #. La forme correcte est

$('#<%= Label1.ClientID %>');
Ron
la source
10

Événements

$("selector").html($("another-selector").html());

ne clone aucun des événements - vous devez tous les relier.

Selon le commentaire de JP - clone () lie les événements si vous passez vrai.

Chris S
la source
4
Clone () le fait si vous passez vrai.
James
Qu'en est-il de live () dans jQuery 1.3.2?
jmav
9

Évitez la création multiple des mêmes objets jQuery

//Avoid
function someFunc(){
   $(this).fadeIn();
   $(this).fadeIn();
}

//Cache the obj
function someFunc(){
   var $this = $(this).fadeIn();
   $this.fadeIn();
}
redsquare
la source
var $ this = $ (this) .fadeIn () ;? vous mettez en cache un effet?
Jason
12
il renvoie l'élément, son appelé chaînage!
redsquare
vous pouvez définir une variable et effectuer une action dessus en même temps?
Jason
1
En effet, mais ne me croyez pas sur parole. Essayez-le. Comment pensez-vous que ce qui suit est possible si l'objet jquery représentant l'élément n'est pas renvoyé? $ ('# divId'). hide (). show (). fadeIn () .... etc
redsquare
14
Cela fonctionne, mais je pense que c'est plus lisible d'avoir $this = $(this);sur une ligne distincte. Si vous le pouvez (sans faire de gâchis), oubliez $thistout et enchaînez tout:$(this).fadeIn().fadeIn();
Patrick McElhaney
8

Je dis cela pour JavaScript également, mais jQuery, JavaScript ne doit JAMAIS remplacer CSS.

Assurez-vous également que le site est utilisable pour quelqu'un avec JavaScript désactivé (pas aussi pertinent aujourd'hui que dans le passé, mais toujours agréable d'avoir un site entièrement utilisable).

Martin
la source
6

Faire trop de manipulations DOM. Bien que les méthodes .html (), .append (), .prepend (), etc. soient excellentes, en raison de la façon dont les navigateurs effectuent le rendu et le rendu des pages, leur utilisation trop fréquente entraînera des ralentissements. Il est souvent préférable de créer le html sous forme de chaîne et de l'inclure une fois dans le DOM, plutôt que de le changer plusieurs fois.

Au lieu de:

var $parent = $('#parent');
var iterations = 10;

for (var i = 0; i < iterations; i++){
    var $div = $('<div class="foo-' + i + '" />');
    $parent.append($div);
}

Essaye ça:

var $parent = $('#parent');
var iterations = 10;
var html = '';

for (var i = 0; i < iterations; i++){
    html += '<div class="foo-' + i + '"></div>';
}

$parent.append(html);

Ou même ceci ($ wrapper est un élément nouvellement créé qui n'a pas encore été injecté dans le DOM. L'ajout de nœuds à cette div wrapper ne provoque pas de ralentissements, et à la fin nous ajoutons $ wrapper à $ parent, en utilisant une seule manipulation DOM ):

var $parent = $('#parent');
var $wrapper = $('<div class="wrapper" />');
var iterations = 10;

for (var i = 0; i < iterations; i++){
    var $div = $('<div class="foo-' + i + '" />');
    $wrapper.append($div);
}

$parent.append($wrapper);
Alex Heyd
la source
+1 ... J'utilise .html () sur plusieurs éléments chaque seconde. Remarqué que cela commence à tout ralentir!
User2
5

Utilisation de ClientID pour obtenir l'ID "réel" du contrôle dans les projets ASP.NET.

jQuery('#<%=myLabel.ClientID%>');

De plus, si vous utilisez jQuery dans SharePoint, vous devez appeler jQuery.noConflict ().

Jacobs Data Solutions
la source
11
? Comment est-ce un piège? Il s'agit d'une solution de contournement pour le comportement ASP.NET.
SolutionYogi
1
Ouais. Ce n'est pas un problème jQuery. C'est une faute des formulaires web asp.net.
redsquare
3
D'accord. Mais c'est quelque chose que vous devez savoir quand vous utilisez jQuery dans ASP.NET.
Jacobs Data Solutions
2
l'OP n'a pas mentionné asp.net
redsquare
4

Passer des ID au lieu d'objets jQuery aux fonctions:

myFunc = function(id) { // wrong!
    var selector = $("#" + id);
    selector.doStuff();
}

myFunc("someId");

Passer un ensemble enveloppé est beaucoup plus flexible:

myFunc = function(elements) {
    elements.doStuff();
}

myFunc($("#someId")); // or myFunc($(".someClass")); etc.
Craig Stuntz
la source
3

Utilisation excessive du chaînage.

Regarde ça:

this.buttonNext[n ? 'bind' : 'unbind'](this.options.buttonNextEvent, this.funcNext)[n ? 'removeClass' : 'addClass'](this.className('jcarousel-next-disabled')).attr('disabled', n ? false : true);

Explication

SolutionYogi
la source
1
Ça a l'air drôle, c'est une sorte d'obscurcissement.
Dykam
6
Le chaînage (seul) est difficile à utiliser «en excès». Il semble que ce code utilise de manière excessive l'opérateur ternaire javascript. Voir en.wikipedia.org/wiki/Ternary_operation#JavaScript pour plus d'informations.
Dan Esparza
3
Je suis content de ne pas avoir à maintenir votre code.
cdmckay
3

Utilisez des chaînes de style accumulateur

En utilisant l'opérateur +, une nouvelle chaîne est créée en mémoire et la valeur concaténée lui est affectée. Ce n'est qu'après cela que le résultat est attribué à une variable. Pour éviter la variable intermédiaire pour le résultat de la concaténation, vous pouvez affecter directement le résultat à l'aide de l'opérateur + =. Lent:

a += 'x' + 'y';

Plus rapide:

a += 'x';
a += 'y';

Les opérations primitives peuvent être plus rapides que les appels de fonction

Envisagez d'utiliser un fonctionnement primitif alternatif par rapport aux appels de fonction dans les boucles et fonctions critiques pour les performances. Lent:

var min = Math.min(a, b);
arr.push(val);

Plus rapide:

var min = a < b ? a : b;
arr[arr.length] = val;

Lire la suite sur les meilleures pratiques de performance JavaScript

Pir Abdul
la source
1

Si vous souhaitez que les utilisateurs voient les entités html dans leur navigateur, utilisez «html» au lieu de «texte» pour injecter une chaîne Unicode, comme:

$('p').html("Your Unicode string")
Patrick J. Anderson
la source
1

mes deux centimes)

Habituellement, travailler avec jquery signifie que vous n'avez pas à vous soucier des éléments DOM réels tout le temps. Vous pouvez écrire quelque chose comme ça -$('div.mine').addClass('someClass').bind('click', function(){alert('lalala')}) - et ce code s'exécutera sans lancer d'erreurs.

Dans certains cas, cela est utile, dans certains cas - pas du tout, mais c'est un fait que jquery a tendance à être, bien, compatible avec les correspondances vides. Encore,replaceWith jettera une erreur si l'on essaie de l'utiliser avec un élément qui n'appartient pas au document. Je le trouve plutôt contre-intuitif.

Un autre écueil est, à mon avis, l'ordre des nœuds retournés par la méthode prevAll () - $('<div><span class="A"/><span class="B"/><span class="C"/><span class="D"/></div>').find('span:last-child').prevAll(). Ce n'est pas grave, en fait, mais nous devons garder à l'esprit ce fait.

shabunc
la source
0

Si vous prévoyez Ajax dans de nombreuses données, comme disons 1500 lignes d'une table avec 20 colonnes, alors ne pensez même pas à utiliser jQuery pour insérer ces données dans votre code HTML. Utilisez du JavaScript simple. jQuery sera trop lent sur les machines plus lentes.

De plus, la moitié du temps, jQuery fera des choses qui le ralentiront, comme essayer d'analyser les balises de script dans le code HTML entrant et de gérer les bizarreries du navigateur. Si vous voulez une vitesse d'insertion rapide, restez avec du JavaScript simple.

mkoryak
la source
1
-1 La fonction .html () est tout aussi rapide que l'approche native
cllpse
tout le monde qui me downvoting n'a évidemment pas essayé d'insérer une tonne de DOM sur IE et regarder les choses devenir lentes. La raison pour laquelle jquery est lent est qu'il n'insérera pas simplement le dom, il fera quelques autres choses, comme vérifier si le dom a des scripts, et les exécute si c'est dans IE, et d'autres choses que vous n'avez pas besoin de faire si vous savez exactement quel type de données vous insérez
mkoryak
1
Tant que vous n'avez pas à vous soucier des fuites de navigateur et autres, ce .innerHTMLsera le cas. Mais si vous créez quelque chose comme Gmail où l'utilisateur garde l'onglet ouvert pendant des heures, vous allez juste devoir mordre la balle et faire face à la lenteur supplémentaire. Pour les curieux, voici exactement ce que fait jQuery .html(): james.padolsey.com/jquery/#v=1.4&fn=jQuery.fn.html
adamJLev
-1

Utiliser jQuery dans un petit projet qui peut être complété avec seulement quelques lignes de JavaScript ordinaire.

étau
la source
Cela ne me dérange pas d'être modifié, mais veuillez argumenter votre choix.
étau
8
-1 jQuery résume une API cassée. De cette façon, vous êtes toujours sûr que votre code fonctionne. Supposons que vous ayez écrit du code à l'aide de jQuery et qu'un bogue de navigateur aléatoire soit introduit avec une nouvelle version - tout ce que vous avez à faire est d'importer une version mise à jour du framework jQuery. Contre avoir à trouver vous-même comment résoudre le bogue.
cllpse le
+1 me semble raisonnable - si vous n'utilisez que quelques lignes, il est judicieux d'utiliser simplement vanilla JS.
alex
1
@roosteronacid, votre argument manque le point. Il est très peu probable qu'un navigateur introduise une régression dans un script de moindre complexité ou traite des problèmes de croisement d'ailleurs. Il y a deux ans, je travaille avec mootools et dans certaines circonstances, il n'a pas pu lire le contenu d'un élément sur IE. Après quelques heures de tring pour comprendre le problème, je viens de réécrire cette partie avec des js simples. Ainsi, il est en fait plus probable que jQuery se casse plutôt que le simple Javascript échoue en raison d'une mise à niveau du navigateur. Je résoudrais un bogue moi-même n'importe quel jour plutôt que de pirater un code de bibliothèque.
étau
3
couple of lines of ordinary JavaScriptBien sûr pas de problème. Mais quand est-ce que c'est juste ça? Les gens qui disent "pourquoi ne pas utiliser la vanille javascript ??" n'ont pas encore été mordus assez durement par IE ... et sans parler de la quantité de code cru et standard que vous devez écrire pour faire des choses simples dans le vieux JS.
adamJLev
-3

Ne pas comprendre la liaison d'événement. JavaScript et jQuery fonctionnent différemment.

À la demande générale, un exemple:

Dans jQuery:

$("#someLink").click(function(){//do something});

Sans jQuery:

<a id="someLink" href="page.html" onClick="SomeClickFunction(this)">Link</a>
<script type="text/javascript">
SomeClickFunction(item){
    //do something
}
</script>

Fondamentalement, les crochets requis pour JavaScript ne sont plus nécessaires. C'est-à-dire utiliser le balisage en ligne (onClick, etc.) parce que vous pouvez simplement utiliser les ID et les classes qu'un développeur exploiterait normalement à des fins CSS.

Jason
la source
5
Envie d'élaborer? De préférence un exemple?
SolutionYogi
7
JavaScript ne fournit-il pas addEventListener () et attachEvent () pour ce faire?
alex
2
séparation des préoccupations, l'homme. Gardez votre HTML et JS séparés
Don