8
votes

JQuery Show "Chargement" pendant une opération lente

J'essaie de montrer une petite image de chargement pendant une opération lente avec jQuery et ne peut pas le faire correctement. C'est une grande table avec des milliers de rangées. Lorsque je coque la case "MostrararTriculosDereFerencia", il supprime la classe "cachée" de ces lignes. Cette opération prend quelques secondes et je veux donner des commentaires. "Chargement" est une div avec un petit gif d'animation

Voici le code complet p> xxx pré>

On dirait que JQuery est "optimisant" ces 3 lignes p>

//mostrar u ocultar articulos de referencia
$("#mostrarArticulosDeReferencia").click(function(event){
    if( $("#mostrarArticulosDeReferencia").attr("checked") )
        $("tr.r").css({'display':'table-row'});
    else
        $("tr.r").css({'display':'none'});
});


3 commentaires

Voulez-vous que cela fonctionne pendant que la page est chargée? $ (document) .Readady () incendies lorsque tout est en panne et chargé


Pas nécessaire, j'en ai seulement besoin de ceci lors de l'opération Show / Masquer. Juste collé tout le script


Juste une pensée, avez-vous essayé d'utiliser des contextes? Si vous fournissez un deuxième argument dans votre relevé de sélection, cela peut aider à la vitesse.


10 Réponses :


0
votes

Avez-vous essayé d'utiliser AJAXSTART pour exécuter votre fonction de mise à jour?


1 commentaires

0
votes

Je pense que cela fonctionne correctement. Cette opération:

jQuery("#listadoArticulos tr.r").removeClass("hidden");


3 commentaires

J'ai des milliers de lignes, il faut 2 ou 3 secondes. Et c'est très ennuyeux


Et si vous commencez les instructions de masquage et de removeclass, voyez-vous Chargement de div alors?


Quelque chose comme ça que tu dis? jQuery ("# ​​MostrarartiCulosDereferencia"). Cliquez sur (Fonction (même t) {Si (JQuery ("# ​​MostrarartiCulosDereFerencia"). ATTR ("Vérifié")) {jQuery ("# ​​Chargement"). Afficher (); // non Affichage // jQuery ("# ​​listadoarticos tr.r"). Removeclass ("caché"); // opération lente // jQuery ("# ​​chargement"). Masquer ();} else {jQuery ("# ​​chargement"). spectacle (); // ne pas montrer // jQuery ("# ​​listadoarticos tr.r"). addclass ("caché"); // opération lente // jQuery ("# ​​chargement"). Masquer ();}}); Oui, je vois le chargement de div, mais je nerd pour le cacher ensuite ...



1
votes

Je pense que vous voulez faire xxx

à l'intérieur d'une fonction de rappel pour afficher.

Regardez la documentation de la méthode ici: http://docs.jquerery.com/effects/show

Vous pouvez obtenir la même" montrage instantanée "Effet en appelant show (0);

Mais vous voulez faire le rappel? Pas de problème, faites ceci: xxx

simple! :)


2 commentaires

Faire cela, j'ai eu le même comportement qu'avant 1. Cliquez sur la case à cocher 2. Rien ne se passe pendant 2/3 secondes (traitement) 3. Page est mise à jour 4. Chargement de Div apparaît pendant une fraction de seconde et je dois utiliser SettimeOut pour masquer la div. Si je ne l'utilise pas, le div ne montre jamais ...


Avez-vous un exemple en direct que je pourrais jouer avec? Je pense au lieu de changer chaque rangée individuelle, si vous avez un ensemble complet, vous pouvez changer la balise TODO.



0
votes

J'ai aussi vu ce comportement et cela dépend du navigateur utilisé. C'est-à-dire que celui est le plus touché. La raison n'est pas que JQuery est lent, bien que le JavaScript fonctionne plus lentement dans IE, mais plus en raison du rendu du nouveau HTML. La raison pour laquelle Settimeout () aide, c'est parce qu'elle fait la première action et uniquement lorsque le navigateur est effectué rendant le nouveau HTML, la deuxième partie est effectuée. L'opération entière est effectivement plus lente, mais la rétroaction le rend plus agréable.

Un moyen de démontrer cela consiste à cacher la table longue et à exécuter le même code. Il fera de même mais que la table est invisible et ne rendra pas la totalité de l'action globale.

Il y a quelques façons de se déplacer.

  1. Essayez d'éviter les tables et d'aller pour une disposition DIV à la place. Les tables rendent lentement et en fonction du navigateur, la table peut ne devenir visible que complètement.
  2. Si vous devez utiliser la table, envisagez d'utiliser plusieurs tables de SOIT 100 rangées bloquées ensemble. De cette façon, la page commence à rendu dès que la première table a été reformatée.
  3. Si une grande table est la seule façon d'aller et que vous savez que l'utilisateur ne peut voir que les lignes supérieures que vous pouvez effectuer l'action deux fois, la première fois sur les lignes supérieures et la deuxième fois sur toutes les lignes. C'est la solution la plus lente et la moins optimale, mais peut être très facile à mettre en œuvre en ajoutant un filtre JQuery à l'action.

4 commentaires

Pourquoi recommandez-vous des divs pour les données tabulaires? Pourquoi recommandez-vous de rompre les données? Vous souciez-vous de la sémantique?


Ou une accessibilité à ce sujet?


Principalement en raison de la vitesse de rendu d'une table dans le navigateur. L'utilisation des divs et CSS est une bonne alternative. Bien sûr, il existe la possibilité d'utiliser une disposition de table fixe qui aidera également. Voir: Stackoverflow. com / questions / 1046035 / ... .


Ce n'est pas pour la mise en page. Ceci est une table pour les données tabulaires. Impossible d'utiliser une largeur fixe car j'essaie d'utiliser tout l'espace disponible, et si je divise la table, les colonnes obtiennent différentes largeurs. Utiliser Firefox



3
votes

J'ai tout essayé et je dois conclure que c'est le produit d'un Browser Brainfart.

  1. jQuery indique au navigateur d'afficher / masquer le chargement DIV
  2. jQuery indique au navigateur d'ajouter / supprimer la classe cachée des lignes
  3. jQuery indique au navigateur d'afficher / masquer le chargement DIV
  4. Le navigateur fait toutes les étapes ci-dessus dans le mauvais ordre (2 en premier lieu)

    'Settimeout' dans ma dernière mise à jour est forçant le navigateur Tho exécuter toutes les étapes du bon ordre. Ça suce, n'est pas élégant, mais au moins ça marche ...

    Mise à jour: le Settimeout est nécessaire car JQuery "simplifie" la chaîne de commandes. Si je le dis de cacher un élément et que le spectre à nouveau, cela ignorera simplement la commande car le résultat final sera le même que rien ...


1 commentaires

Je pense que j'ai ajouté un commentaire disant que cette réponse était trompant la bonne réponse et qu'il n'y a pas de cerveau de la partie du navigateur, provient de la bibliothèque de JQuery et de son absence de Calback pour le rappel de remorquage (qu'il semble naturel). Je ne sais pas pourquoi il a été supprimé.



0
votes

Cela ne répond pas à la question initiale, mais est-il plus rapide d'utiliser une règle CSS pour une classe sur la table elle-même: xxx

et bascule l'affichage comme suit: xxx

?


0 commentaires

3
votes

Apparemment, vous tirez une demande asynchrone forte> asynchrone (oui, asynchrone em>, en d'autres termes, il ne fonctionne pas en Sync avec le code!) Pendant le "long processus d'exécution ". Vous devez appeler $ ('# chargement'). Masquer () code> à la fin de la fonction de rappel de la demande asynchrone.

Voici un excellent exemple: P>

$('#loading').show();
$.getJSON('someURL', function(data) {
    // Do slow processing.
    $('#loading').hide();
});


1 commentaires

Parfois, des choses très simples se révèlent être la réponse. Merci pour l'exemple Balusc.



1
votes

Juste une note - j'ai développé un Plugin pour créer une superposition div avec un graphique de chargement dedans.


0 commentaires

1
votes

Mettez une DIV sur votre page quelque part comme si: XXX PRE>

puis raccrochez le spectacle et masquer les événements AJAXSTOP, AJAXSTOP et AJAXError, comme: P>

$("#spinner").bind("ajaxSend", function() { $(this).show(); })
$("#spinner").bind("ajaxStop", function() { $(this).hide(); })
$("#spinner").bind("ajaxError", function() { $(this).hide(); });


0 commentaires

0
votes

Essayez d'utiliser le rappel "Terminé" de la méthode Afficher, JS est principalement basé sur des événements ASYNC, et ces trois lignes:

var els = jQuery("#listadoArticulos tr.r");
els.each(function(i, el) {
  if (i == 0) jQuery("#loading").show();
  el.removeClass("hidden");
  if (els.length == i +1) jQuery("#loading").hide();
});


0 commentaires