jQuery show "laden" während der langsamen Bedienung
Ich versuche zu zeigen, ein kleines Bild, während eine langsame operation ist mit jQuery und kann Sie nicht Recht.
Es ist eine GROßE Tabelle mit tausenden von Zeilen. Wenn ich die Option "mostrarArticulosDeReferencia" checkbox entfernt es die "hidden" - Klasse aus diesen Zeilen. Dieser Vorgang dauert ein paar Sekunden, und ich möchte feedback geben.
"laden" ist ein div mit einem kleinen animierten gif
Hier ist der vollständige code
jQuery(document).ready(function() {
jQuery("#mostrarArticulosDeReferencia").click(function(event){
if( jQuery("#mostrarArticulosDeReferencia").attr("checked") ) {
jQuery("#loading").show(); //not showing
jQuery("#listadoArticulos tr.r").removeClass("hidden"); //slow operation
jQuery("#loading").hide();
} else {
jQuery("#loading").show(); //not showing
jQuery("#listadoArticulos tr.r").addClass("hidden"); //slow operation
jQuery("#loading").hide();
}
});
jQuery("#loading").hide();
});
Sieht es aus wie jquery ist "Optimierung" diese 3 Zeilen
jQuery("#loading").show(); //not showing
jQuery("#listadoArticulos tr.r").removeClass("hidden");
jQuery("#loading").hide();
Und niemals zeigt das laden div.
Irgendwelche Ideen?
Bonus: Es ist ein schneller Weg, dies zu tun einblenden/ausblenden Sache? Finden Sie heraus, dass der Knebel ist WEG langsamer.
UPDATE:
Ich habe versucht, diese
jQuery("#mostrarArticulosDeReferencia").click(function(event){
if( jQuery("#mostrarArticulosDeReferencia").attr("checked") ) {
jQuery("#loading").show(); //not showing
jQuery("#listadoArticulos tr.r").removeClass("hidden"); //slow operation
setTimeout("jQuery('#loading').hide()", 1000);
} else {
jQuery("#loading").show(); //not showing
jQuery("#listadoArticulos tr.r").addClass("hidden"); //slow operation
setTimeout("jQuery('#loading').hide()", 1000);
}
});
Das ist, was ich
- klicken Sie auf das Kontrollkästchen
- nichts passiert, während 2/3 Sek. (in Bearbeitung)
- Seite aktualisiert wird
- laden div zeigt sich während einem Bruchteil einer Sekunde
UPDATE 2:
Ich habe eine funktionierende Lösung. Aber WARUM muss ich das mit setTimeout machen, damit es funktioniert ist mir schleierhaft...
jQuery("#mostrarArticulosDeReferencia").click(function(event){
if( jQuery("#mostrarArticulosDeReferencia").attr("checked") ) {
jQuery("#loading").show();
setTimeout("jQuery('#listadoArticulos tr.r').removeClass('hidden');", 1);
setTimeout("jQuery('#loading').hide()", 1);
} else {
jQuery("#loading").show();
setTimeout("jQuery('#listadoArticulos tr.r').addClass('hidden');", 1);
setTimeout("jQuery('#loading').hide()", 1);
}
});
UPDATE 3:
Gerade eine bessere Lösung gefunden für diesen Fall.
//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'});
});
Verwenden .css({'display':'none'}) entpuppt sich schneller als hide(), so dass keine Notwendigkeit für die animation zum laden...
Dieser Artikel zeigte mir, das Licht: ein - /ausblenden Leistung.
- Möchten Sie diese ausführen, während die Seite geladen wird? $(document).ready() wird ausgelöst, wenn alles down ist und geladen
- Nicht nötig, ich brauche nur während der show ein - /ausblenden Bedienung. Nur klebte der ganze Skript
- Nur ein Gedanke, haben Sie versucht, mit Kontexten? Wenn Sie ein zweites argument in Ihrem Selektor Anweisung, dies kann helfen, die Geschwindigkeit.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Offenbar sind Sie brennen ein asynchrone Anfrage (ja, asynchrone, in anderen Worten, es läuft nicht synchron mit dem code!) während die "Laufenden Prozess". Müssen Sie rufen Sie
$('#loading').hide()
am Ende der callback-Funktion der asynchronen Anfrage.Hier ein hervorragendes Beispiel:
Dies ist offensichtlich nicht zur Arbeit gehen. Es wird sich zeigen, Brand einer asynchronen Anfrage und dann sofort verstecken. Sie müssen den code neu schreiben als:
Ich habe alles versucht und ich habe Schluss zu, als diese das Produkt von einem browser brainfart.
'setTimeout' in meinem letzten update zwingt den browser tho führen Sie alle Schritte in der richtigen Reihenfolge.
Es nervt, ist nicht elegant, aber zumindest funktioniert es...
Update: die setTimeout ist notwendig, da jquery "vereinfacht" die Kette der Befehle. Wenn ich sage, es zu verbergen element und die zeigen es wieder, es wird einfach ignoriert den Befehl, weil das endgültige Resultat ist das gleiche, wie nichts zu tun...
Ich denke, Sie wollen zu tun
innerhalb einer callback-Funktion für die show.
Schauen Sie in der Dokumentation der Methode hier: http://docs.jquery.com/Effects/show
Können Sie erreichen die gleiche "instant-zeigt-Effekt", durch den Aufruf
show(0);
Aber Sie wollen, um die callback? Kein problem, dies zu tun:
Einfach! 🙂
Legen Sie ein div-Element auf Ihrer Seite irgendwo wie so:
Dann Haken Sie das ein-und ausblenden zu ajaxStart, ajaxStop, und ajaxError Ereignisse wie folgt:
Nur ein Hinweis - ich entwickelt eine plugin für die Erstellung einer overlay-div mit einem be-Grafik in es.
Haben Sie versucht, mit ajaxStart zum ausführen von update-Funktion?
Ich denke, es ist richtig funktioniert. Operation:
nicht wirklich lang, und es erfolgt in wenigen ms tops, so dass Sie nicht sehen, das be-Informationen, weil es nur dort für eine sehr kurze Zeit.
Habe ich gesehen, dass dieses Verhalten auch, und es hängt vom verwendeten browser. Der IE ist am meisten betroffen. Der Grund ist nicht, dass jQuery ist langsam, obwohl der JavaScript läuft langsamer als IE, aber mehr wegen dem rendering des neuen HTML. Der Grund dafür setTimeout() hilft ist, weil es die erste Aktion und nur, wenn der browser fertig ist die neue HTML-rendering-der zweite Teil ist getan. Der ganze Vorgang ist tatsächlich langsamer, aber das feedback macht es schöner.
Einen Weg zu zeigen, dies ist durch das verstecken des langen Tisches und läuft der gleiche code. Es wird das gleiche tun, aber wie die Tabelle unsichtbar ist und nicht wiedergegeben wird die ganze Aktion ist viel schneller.
Gibt es ein paar Möglichkeiten, dies zu umgehen.
Diese keine Antwort auf die ursprüngliche Frage, aber ist es nicht schneller, verwenden Sie eine CSS-Regel für eine Klasse auf die Tabelle selbst:
und setzen Sie die Anzeige wie diese:
?
Versuchen, verwenden Sie die callback "complete" von der show-Methode, js ist meist in asynchronen Ereignisse, und diese drei Zeilen:
ausgeführt werden, ohne zu warten,, so, Ihr zeigen, hinzufügen-Klasse und versteckt sich sofort das div, das ist, warum Sie nicht sehen können, die div, Sie sind es versteckt, ohne zu warten, gezeigt zu werden und es erscheint und verschwindet sehr schnell, oder sogar kann es nie zeigen, bis (weiß nicht, über die Optimierung der Art).
Wenn Sie hinzufügen, die beiden letzten innerhalb der vollständige Rückrufe wird es funktionieren, mehr http://api.jquery.com/show/:
In jedem Fall auch der richtige Weg, dies zu tun für die ajax-Anfrage (ich Stelle mir Los ist, um nützlich zu sein für jemanden) ist mit ajaxStart und ajaxStop wie diese:
Ergänzung für removeClass Abwesenheit Rückruf:
Vielleicht ist Ihr problem lag an der Tatsache, dass es keinen Rückruf für removeClass, aber Sie können das nächste:
versuchen Sie auch dies:
Können Sie das problem, dass wenn Sie Bilder oder irgendwelche extra-code, der aktiviert wird, sobald Sie entfernen die Klasse, es gibt keine native Möglichkeit zu warten, für Sie zum ausblenden der be-div, also vielleicht, auch wenn Sie die Klasse versteckt, es gibt keine einfache Möglichkeit zu warten, bis die Objekte sichtbar sind.
Ich nur feststellen, dass das war vor 2 Jahren, vielleicht braucht es diese nicht mehr.