Browser stürzen ab...
dp
- javascript
Hi,
bei folgender Funktion stürzen mir Reihenweise die Browser ohne Fehlermeldung ab:
function hideAutoCompletion(move,hide) {
if(move != null) show = move;
if(show != null) {
show = move;
window.setInterval(function() { hideAutoCompletion(null,true); },100);
}
if(!show && hide) {
show = true;
getElement("id","autoCompletion",null).style.display = "none";
}
}
Das ist eine Einblende-Funktion eines Kontextmenüs einer AJAX-Auto-Vervollständigung. "move" ist TRUE oder FALSE, je nach dem ob die Maus über dem Kontextmenü ist oder nicht. "hide" ist NULL oder TRUE, wenn das Menü ausgeblendet wird. Die Variable "show" ist global und speicher den Mausstatus. Die Funktion sieht etwas "frickelig" aus, funktioniert aber eins, zwei mal bevor die Browser abstürzen. Ändere ich die Funktion ab...
function hideAutoCompletion(move,hide) {
if(move != null) {
show = move;
window.setInterval(function() { hideAutoCompletion(null,true); },100);
}
if(!show && hide) {
show = true;
getElement("id","autoCompletion",null).style.display = "none";
}
}
... funktioniert alles einwandfrei. Was genau passiert aber bei der ersten Funktion, wenn die Browser (Firefox, Safari) einfach abstürzen bzw. gar nicht mehr reagieren? Ein Bug in den Browsers?
Gruß
Daniel
Hi,
bei folgender Funktion stürzen mir Reihenweise die Browser ohne Fehlermeldung ab:
Und was sollen wir mit dieser Fehlermeldung? Du sagst nicht, welche Browser, welches Betriebssystem, wie der rest der Seite aussieht. Sollen wir darüber Ratespielchen machen oder willst du keine Hilfe, sondern uns nur sagen, das es nicht funktioniert?
Und was sollen wir mit dieser Fehlermeldung?
Welche Fehlermeldung?
Du sagst nicht, welche Browser, welches Betriebssystem, wie der rest der Seite aussieht.
Aktuell festgestellt in Safari und Firefox. OS spielt keine Rolle. Das habe ich allerdings am Ende meines Posts geschrieben...
»»Sollen wir darüber Ratespielchen machen oder willst du keine Hilfe, sondern uns nur sagen, das es nicht funktioniert?
... und du solltest, bevor du herumstänkerst mal die Beiträge komplett lesen. Danke.
@Cybaer:
Die Funktion wird nur einmal zeitverzögert aufgerufen und auch nur dann, wenn entsprechende Parameter mitgegeben werden ... *bling* Ich Idiot habe da einen Interval rein gemacht oO. Trotzdem ist der Absturz der Browser irgendwie komisch. Aber das erklärt einiges...
Gruß
Daniel
Hi,
Trotzdem ist der Absturz der Browser irgendwie komisch. Aber das erklärt einiges...
Also wenn Du mir in 100 ms einen Schnapps reinkippst, dann ist das noch OK. Wenn Du mir alle 100 ms einen Schnaps reinkipst, dann stürze ich auch ab ... >;->
Gruß, Cybaer
Hi,
Trotzdem ist der Absturz der Browser irgendwie komisch. Aber das erklärt einiges...
Also wenn Du mir in 100 ms einen Schnapps reinkippst, dann ist das noch OK. Wenn Du mir alle 100 ms einen Schnaps reinkipst, dann stürze ich auch ab ... >;->
Gruß, Cybaer
Schon klar ;-). Nur sollte ein Browser einen Interval problemlos handlen können. Ich denke, das Problem liegt nicht beim Interval selbst, sondern beim ständigen Aufrufen der Funktion und den damit verbundenen Neustart des Intervals. Da gehen die Browser wohl in die Knie - zu viel Schnaps. Objektiv betrachtet ist das ein Sicherheitsproblem. Denn durch einen Interval, der sich selbst x-mal aufrufen kann, können Browser zum Absturz gebracht werden...
Gruß
Daniel
Hi !
Schon klar ;-). Nur sollte ein Browser einen Interval problemlos handlen können. Ich denke, das Problem liegt nicht beim Interval selbst, sondern beim ständigen Aufrufen der Funktion und den damit verbundenen Neustart des Intervals. Da gehen die Browser wohl in die Knie - zu viel Schnaps. Objektiv betrachtet ist das ein Sicherheitsproblem. Denn durch einen Interval, der sich selbst x-mal aufrufen kann, können Browser zum Absturz gebracht werden...
ja, unglaublich. Wenn ich bei einer Rekursion das Ende-Kriterium vergesse, dann stürzt mein Rechner auch irgendwann ab. Also, ich finde, so besch... Dinger wie Programmiersprachen sollten verboten werden, die machen eh nie das, was man von denen will. ;-)
Gruß
Hans
Hallo Hans,
... Dinger wie Programmiersprachen sollten verboten werden, die machen eh nie das, was man von denen will. ;-)
aber dafür das, was du ihnen sagst. Also lerne zu sagen, was du willst, und schon kannst du programmieren. :-)
Gruß, Jürgen
Naja, ich wollte ein "window.setTimeout" allerdings stand da auf einmal "window.setInterval" - ich habe das, zumindest bewusst, nicht da hingeschrieben. Ich glaube sogar, dass der Firefox einen integrierten Schutz vor "Leier-JavaScript" hat, der hier allerdings nicht gegriffen hat. Als ich letzte Woche mit meiner kleinen AJAX-Engine angefangen habe, landete ich beim Testen auch in einer Endlosschleife und der Firefox meldete mir, dass ein Script offenbar endlos leiert und ob er ihn abbrechen soll. Das Halteproblem in Scripten scheint zumindest halbwegs bei einigen Browsern gelöst worden zu sein. Zumindest sollte man Scripten ein Timeout geben, bevor sie den ganzen Browser zu Absturz bringen. Zumal solche Fehler schwer zu finden sind. Das Script arbeitete ja korrekt, nur etwas übereifrig ;-)
Gruß
Daniel
Hallo dp,
meine Bemerkung bezog sich nicht auf dein Problem, sondern nur auf:
... die machen eh nie das, was man von denen will.
von Hans.
IE und FF frieren bei "Dauerläufern" ein. Daher kommt früher (FF) oder später (IE) eine Info mit der Möglichkeit, das Javascript zu beenden. Umgehen kann man diese Warnung und das Einfrieren des Browsers, indem man Schleifen mit Hilfe von setTimeout verzögert. Eine kurze Pause reicht, um den Browser rendern und auf Aktionen reagieren zu lassen. Zusätzlich wird die Warnuhr neu gestartet.
Ich mache das inzwischen so, dass ich die Rechenschleife 0.1 bis 0.5 Sek. laufen lasse und dann mit setTimeout verzögert neu starte. So erhalte ich einen ordentlichen Kompromiss zwischen Berechnungszeit und Reaktionszeit des Browsers.
Gruß, Jürgen
Hi,
window.setInterval(function() { hideAutoCompletion(null,true); },100);
Ist es denn gewollt, daß der Browser alle 100 ms diese Funktion aufruft?
Ich sehe nicht, daß das irgendwann abgestellt wird ...
... was ohne Kennung der Intervalls auch schwierig sein dürfte ...
Gruß, Cybaer
Hi,
function hideAutoCompletion(move,hide) {
if(move != null) show = move;
if(show != null) {
show = move;
window.setInterval(function() { hideAutoCompletion(null,true); },100);
Beim ersten Aufruf wird ein Intervall gestartet mit 100ms Takt (also 10 Aufrufe pro Sekunde).
Beim zweiten Aufruf wird ein weiteres Intervall gestartet mit 100ms Takt. Dadurch werden aber nicht die bisherigen Aufrufe ersetzt, sondern zusätzliche Aufrufe initiiert, also sind zukünftig bereits 20 Aufrufe pro Sekunde zu machen.
Beim dritten Aufruf wird ein weiteres Intervall gestartet mit 100ms Takt, also sind zukünftig bereits 30 Aufrufe pro Sekunde zu machen.
usw.
Jeder Aufruf fügt also 10 weitere Aufrufe pro Sekunde hinzu ...
Da sind also relativ schnell sehr viele Aufrufe pro Sekunde beisammen, der Browser ist dann nur noch damit beschäftigt.
cu,
Andreas