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> 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'});
});
10 Réponses :
Avez-vous essayé d'utiliser AJAXSTART pour exécuter votre fonction de mise à jour? P>
Consultez cette question: Stackoverflow.com/questions/1191485/...
Je pense que cela fonctionne correctement. Cette opération:
jQuery("#listadoArticulos tr.r").removeClass("hidden");
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 ...
Je pense que vous voulez faire à l'intérieur d'une fonction de rappel pour afficher. p> Regardez la documentation de la méthode ici: http://docs.jquerery.com/effects/show p> Vous pouvez obtenir la même" montrage instantanée "Effet en appelant Mais vous voulez faire le rappel? Pas de problème, faites ceci: p> simple! :) p> p> show (0); code> p>
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.
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. P>
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. P>
Il y a quelques façons de se déplacer. P>
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
J'ai tout essayé et je dois conclure que c'est le produit d'un Browser Brainfart. P>
'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 ... P>
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 ... P>
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é.
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: et bascule l'affichage comme suit: p> ? p> p> p>
Apparemment, vous tirez une demande Voici un excellent exemple: P> $ ('# chargement'). Masquer () code> à la fin de la fonction de rappel de la demande asynchrone.
$('#loading').show();
$.getJSON('someURL', function(data) {
// Do slow processing.
$('#loading').hide();
});
Parfois, des choses très simples se révèlent être la réponse. Merci pour l'exemple Balusc.
Juste une note - j'ai développé un Plugin pour créer une superposition div avec un graphique de chargement dedans. P>
Mettez une DIV sur votre page quelque part comme si: 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(); });
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(); });
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.