• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Javascript-Alert und Chrome

Yogilein

Member
Hallo zusammen,

ich habe gestern Chrome upgedatet und dadurch folgendes Problem:

Bei vielen meiner Spiele kommt vor einem Hinweis noch eine Bewegung (z.B. ein Stein wird gesetzt) und dann per Alert-Fenster ein Hinweis. Bis gestern war das noch OK, aber im neuen Chrome kommt jetzt zuerst der Hinweis und dann die Bewegung. Das sieht sehr unpassend aus.

Sehr gut kann man das z.B. bei meinem Spiel "Sudoschi" sehen (YogiSpiele - Sudoschi). Der markierte Spielstein muss immer in die Mitte wandern. Am Anfang geht dies mit einem Klick auf den mittleren Stein. Beim neuen Chrome sieht man nicht einmal mehr den letzten Zug, da sofort (nach dem Alert-Hinweis) neu gemischt wird. Alle andere Browsern verhalten sich dagegen normal.

Ist das nun ein Chrome-Problem und ich muss einfach die neue Version abwarten oder ist das große Umprogrammieren angesagt - jedes Alert-Fenster mit einer kleinen Verzögerung aufrufen. Das funktioniert, ist jedoch sehr aufwändig, da das Alert bei mir oft mitten in Code steht.
 
Bei vielen meiner Spiele kommt vor einem Hinweis noch eine Bewegung (z.B. ein Stein wird gesetzt) und dann per Alert-Fenster ein Hinweis. Bis gestern war das noch OK, aber im neuen Chrome kommt jetzt zuerst der Hinweis und dann die Bewegung. Das sieht sehr unpassend aus.
wann kommt denn das alert? nach dem start der bewegung? oder wenn diese beendet ist? da die bewegung sicherlich mit animationframe oder timeout arbeitet sollte eigentlich bei jedem browser erst das alert kommen und dann die bewegung erfolgen.

Ist das nun ein Chrome-Problem und ich muss einfach die neue Version abwarten oder ist das große Umprogrammieren angesagt - jedes Alert-Fenster mit einer kleinen Verzögerung aufrufen. Das funktioniert, ist jedoch sehr aufwändig, da das Alert bei mir oft mitten in Code steht.
alert ist generell kritisch und sollte ersetzt werden, da du mit alert in zustände kommen kannst die in js so nicht auftreten dürften.
 
wann kommt denn das alert? nach dem start der bewegung?
In diesem Fall gibt es keine Bewegung im Sinne einer Animation. Einige Schritte zuvor wird die neue Position ganz einfach über document.images geschrieben und dann kommt erst das Alert. Das hat bis jetzt auch immer funktioniert.

Zum Beispiel:


document.images[na].src=bild;
.
.
weitere Anweisungen
.
.
alert("Richtig");


Unter dem neuen Chrome wird das Alert jetzt zeitlich vor dem document.images abgearbeitet. Das Bild ist übrigens vorgeladen.
 
Unter dem neuen Chrome wird das Alert jetzt zeitlich vor dem document.images abgearbeitet. Das Bild ist übrigens vorgeladen.
und wann wird das bild jetzt angezeigt? bei einem vorgeladenem bild würde ich beides gleichzeitig erwarten.
wenn das bild beim chrome jetzt erst nach wegklicken der alertbox angezeigt wird, ist das aber auch nicht falsch, da ja eigentlich gerendert wird, wenn der js-zweig vollständig abgearbeitet wurde.
kannst du das browserfenster resizen wenn die alertbox angezeigt wurde? das sollte auch ein rendern auslösen. mal als test.
 
Angezeigt wird das Bildchen (50 x 50 px) erst nach dem Wegklicken des Fensters. Allerdings kann man es dann auch nicht sehen, da sofort neu gemischt wird, zumindest bei diesem Spiel.

Wie soll ich das Browserfenster resizen? Solange das Alert-Fenster da ist, ist ja alles geblockt.

Das kann man auch schön an dem weiter oben genannten Besipiel sehen, im Firefox oder in Opera sieht man, wie das X in der Mitte erscheint, bei Chrome nicht.
 
Angezeigt wird das Bildchen (50 x 50 px) erst nach dem Wegklicken des Fensters.
wie gesagt falsch finde ich das verhalten nicht, da gerendert wird, wenn der js-zweig abgearbeitet wurde. der kann aber erst weiter abgearbeitet werden, wenn die alertbox weggeklickt worden ist.

Wie soll ich das Browserfenster resizen? Solange das Alert-Fenster da ist, ist ja alles geblockt.
auch das resize? bei mir geht es im ff.

was dabei interesant wäre, verhindert der neue chrome nur das rendering oder auch reentrance. unter der vorraussetzung dass resize geht, lade mal folgende seite in den chrome und resize das fenster solange die alertbox sichtbar ist. kommt dann ein fehler?
wenn resize nicht geht im chrome, bau ich das nochmal mit timeout
Code:
<!doctype html>
<html>
  <head>
    <title></title>
  </head>
  <body>
    text
    <script>
      window.onresize = function()
      {
        document.body.innerHTML = "Au weia";
      };
      document.body.innerHTML += '<div id="test"></div>';
      alert(1+1);
      document.getElementById('test').innerHTML = 'test';
    </script>
  </body>
</html>

- - - Aktualisiert - - -

hier mit timeout, falls resize nicht geht
Code:
<!doctype html>
<html>
  <head>
    <title></title>
  </head>
  <body>
    text
    <script>
      setTimeout(function()
      {
        document.body.innerHTML = "Au weia";
      }, 0);
      document.body.innerHTML += '<div id="test"></div>';
      alert(1+1);
      document.getElementById('test').innerHTML = 'test';
    </script>
  </body>
</html>
 
Was erwartest Du?
Im ersten Test erscheint das Alertfenster mit "2". Nach dem Wegklicken kommen untereinander die Wörter text und test.
im 1. test kommt das Alertfenster mit "2". wenn du das nicht wegklickst und das browserfenster verkleinerst/vergrößerst und dann erst das alert wegklickst kommen bisher bei allen browsern fehler. diese fehler kommen aber nur zustande, da alerts reentrance zulassen, was in js nicht passieren darf. kommen diese fehler auch in chrome?

Im zweiten Test erscheint das Alert-Fenster genauso und nach dem Wegklicken steht Au weia da.
kommt ein js-fehler?
 
Lt. Console kommen keine Fehler.

Aber irgendwie scheinen wir aneinander vorbeizureden. Wie soll ich das Browserfenster resizen??? Sobald das Alert-Fenster da ist, ist doch alles gesperrt. Erst wenn das Fenster weg ist, kann ich die Größe ändern. Zumindest in Chrome ist das so.
 
Aber irgendwie scheinen wir aneinander vorbeizureden. Wie soll ich das Browserfenster resizen??? Sobald das Alert-Fenster da ist, ist doch alles gesperrt. Erst wenn das Fenster weg ist, kann ich die Größe ändern. Zumindest in Chrome ist das so.

ok, ich habe keinen chrome und im ff geht das. deswegen der 2. test dort kommen auch keine fehler? dann wird das der grund sein für die änderung im chrome.
 
Sodele, noch ein (ganz einfacher) Test:
Code:
<!DOCTYPE html>
<html>
<head>
<script>
function start(){
  document.getElementById("Textfeld").firstChild.nodeValue="Hier steht etwas!";
  alert("Siehst du den Text?");
}
</script>
</head>
<body onload="start();">
<div id="Textfeld"> </div>
</body>
</html>
http://www.yogispiele.de/Seiten/Test3.html

Ich erwarte hier, dass zuerst der Text angezeigt wird und dann das Alert-Fenster kommt. Im FF funktioniert das wunderbar, nicht aber im neuen Chrome. Hier kommt der Text erst nach dem Wegklicken des Alert-Fensters.

Wenn das so bleibt, sehe ich aber auch bei anderen Scripts Probleme. Ich muss doch steuern können, wann ein Alert-Fenster erscheint. So sind doch viele Scripts aufgebaut oder täusche ich mich da?

PS: Ich sehe gerade, dass es Edge bei diesem Beispiel genauso (falsch) macht. Also werde ich mich wohl ans Umprogrammieren machen müssen.
 
Ich erwarte hier, dass zuerst der Text angezeigt wird und dann das Alert-Fenster kommt.
erwarten kannst du hier überhaupt nichts, da das rendering erst kommen muss, wenn der gesammte js zweig abgearbeitet wurde. das ist bei alert aber erst möglich, wenn die box weggeklickt wurde.

Wenn das so bleibt, sehe ich aber auch bei anderen Scripts Probleme. Ich muss doch steuern können, wann ein Alert-Fenster erscheint. So sind doch viele Scripts aufgebaut oder täusche ich mich da?
alert sollte in keinem code vorkommen, da es nicht kontrollierbare seiteneffekte hat.

kommt bei chrome nun ein fehler im 2. test?
 
@tsseh,
Habe es unter Chrome/Ubuntu probiert auch kein Fehler.
ABER:
Dein erster Test zeigt mir wenn man das Fenster nicht vergrößert "text, test" nach dem Alert.
Verändert man die Größe während des Alerts, seht da Au weia.
Mann kann aber sobald man das alert weg klick, im Hintergrund noch erkennen das da "text, test" stand und dann durch Au weia. ersetz wird (Bruchteil einer Sekunde).

Test 2 Zeigt immer Au weia.
Aber auch hier erkennt man das da was Überschrieben wird.
Als noch mal, zuerst Seite weiß,dann Alert, kurz "text, test" dann Au weia.



@Yogilein
Du kannst dein Problem nur lösen wenn du ein Timeout rings um bastelst.
Code:
<!DOCTYPE html>
<html>
<head>
<script>
function start(){
  document.getElementById("Textfeld").firstChild.nodeValue="Hier steht etwas!";
  setTimeout(function(){
  	alert("Siehst du den Text?")},2000);
}
</script>
</head>
<body onload="start();">
<div id="Textfeld"> </div>
</body>
</html>
 
Ich bin dann mal am Umprogrammieren.

Das Alert funktioniert, wenn man es mit 1/4 Sekunde Zeitverzögerung aufruft. Ist halt ein bisschen tricky, da das Alert teilweise in Schleifen oder Abfragen steht.

Mein neuestes Spiel verzichtet übrigens komplett auf Alert- und Confirm-Fenster, da diese aktuell nicht wirklich schön aussehen ("Die Webseite meldet:", dann viel kleiner die Meldung und dann "Diese Seite am Erstellen zusätzlicher Dialoge hindern").
 
Verändert man die Größe während des Alerts, seht da Au weia.
dann sollte ein fehler kommen
Mann kann aber sobald man das alert weg klick, im Hintergrund noch erkennen das da "text, test" stand und dann durch Au weia. ersetz wird (Bruchteil einer Sekunde).
beim klick auf die alertbox ändert sich das "Au weia" wieder in "text, test"? das wäre ja noch schlimmer

- - - Aktualisiert - - -

Das Alert funktioniert, wenn man es mit 1/4 Sekunde Zeitverzögerung aufruft.
es reicht dort 0 sek. anzugeben, du musst nur dafür sorgen, daß dern zweig zuende kommt.

Mein neuestes Spiel verzichtet übrigens komplett auf Alert- und Confirm-Fenster
das ist der richtige weg
 
setTimeout(function(){alert("xxx");}, 0)
Gute Idee, aber leider auch nicht zielführend.

Mein Programmaufbau (sehr vereinfacht dargestellt):

Zeige Spielzug
Wenn gelöst, zeige per Alert "Richtig" an und mische neu

Dies bringt bei Chrome aktuell den Effekt, dass der Spielzug nicht angezeigt wird und nach dem Wegklicken des Alert-Fensters gleich die neue Anordnung gezeigt wird.

Nehme ich deine Variante, also

Zeige Spielzug
Wenn gelöst, zeige per Alert_Timeout "Richtig" an und mische neu,

wird wieder der Spielzug nicht angezeigt, sondern es wird bereits vor dem Alert-Fenster neu gemischt.

Meine momentan Lösung, die teilweise recht umständlich ist, wenn der Alert-Befehl tief verschachtelt ist:

Zeige Spielzug
Wenn gelöst, rufe per Timeout neue Funktion auf
NeueFunktion: Zeige per Alert "Richtig" an und mische neu

Nach "rufe per Timeout neue Funktion auf", darf nichts mehr kommen, denn das würde sofort abgearbeitet werden.

Zumindest sehe ich so den Spielzug, das Alert-Fenster erscheint, und erst nach dem Wegklicken wird neu gemischt. Das habe ich bereits bei Sudoschi so umgesetzt.
 
Zurück
Oben