pother_dane: window.prompt und IE

hallo,

folgendes problem: eine seite braucht an einer bestimmten stelle des skriptablaufs eine eingabe des besuchers (sagen wir: einen namen). der soll überprüft, und anschließend an den server geajaxt werden.
die eingabe soll per window.prompt() geschehen, das durch eine do-while schleife gejagt wird bis es die prüfung besteht:

  
function wieIstDerName() {  
   var name="";  
   if (prompt) {  
      do {  
         if (name=prompt("Namen eingeben!"), name) continue  
         else return false;  
         }  
      while (!nameAkzeptabel(name));  
      tuWasMitDemName(name);  
      }  
   else return false;  
}  

in allen browsern tut eine funktion dieser art auch was sie tun soll. nur der IE(7) hängt sich an dieser stelle auf. er durchläuft zwar die schleife, schmeißt aber keinen prompt aus. dafür zeigt er einen hinweis an: "Das Anzeigen bestimmter Inhalte dieser Site wurde aus Sicherheitsgründen eingeschränkt....". das soll sein gutes recht sein und man kann vielleicht streiten ob prompt wirklich eine gute idee ist. für ziemlich dämlich halte ich dagegen die idee eine methode zu sperren, eine abfrage dieser methode aber mit "ja, klar gibts hier... go ahead" zu beantworten.

zu meiner frage: kennt jemand/fällt jemandem eine möglichkeit ein trotzdem irgendwie abzufragen ob prompt hier promptet oder nicht. eine userAgent abfrage macht keinen sinn weil sich die option "skriptfenster blocken" (o.ä.) auch abstellen lässt und sich das ganze problem in diesem fall auch im IE erledigt hätte.

mit dank und gruß,

pD

  1. Lieber pother_dane,

    if (name=prompt("Namen eingeben!"), name) continue

    verstehe ich nicht so ganz... Warum steht da ", name" im if-Statement? Ich hätte jetzt eher vermutet, dass Du für prompt einen zweiten Parameter übermitteln willst, sodass der Code an dieser Stelle wohl eher so aussieht:

    if (name = prompt("Namen eingeben!", name)) continue

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. hallo felix,

      verstehe ich nicht so ganz... Warum steht da ", name" im if-Statement? Ich hätte jetzt eher vermutet, dass Du für prompt einen zweiten Parameter übermitteln willst, sodass der Code an dieser Stelle wohl eher so aussieht:

      das war natürlich nur ein kleiner und unscheinbarer verschreiber. so unscheinbar und klein, dass man ihn auch nach dreimal drüberlesen gerne übersieht. da die obige funktion nur zur darstellung dient und so nicht zum einsatz kommt, löst deine anregung mein problem nicht wirklich, trägt aber sicherlich zur angemessenen korrektheit meiner fragestellung bei. in diesem sinne danke ich dir natürlich.

      beste grüße,

      pD

      1. Hello,

        da die obige funktion nur zur darstellung dient und so nicht zum einsatz kommt

        das ist eine GANZ SCHLECHTE Idee, so kann niemand dein Problem suchen...

        MfG
        Rouven

        --
        -------------------
        sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
        Eine Bilanz ist wie der Bikini einer Frau. Sie zeigt fast alles, aber verdeckt das Wesentliche  --  Günter Stotz, Regierungsdirektor des baden-württembergischen Wirtschaftsministeriums
        1. hallo,

          das ist eine GANZ SCHLECHTE Idee, so kann niemand dein Problem suchen...

          nein nein, da hab ich mich falsch ausgedrückt. die funktion steht beinahe identisch so im quellcode und das problem ist auf diese paar zeilen eingekreist. der von felix angesprochene fehler war also nur ein verschreiber beim übertragen der zeilen aus dem originalcode und ist dort nicht zu finden.

          beste grüße,

          pD

          1. nein nein, da hab ich mich falsch ausgedrückt. die funktion steht beinahe identisch so im quellcode und das problem ist auf diese paar zeilen eingekreist. der von felix angesprochene fehler war also nur ein verschreiber beim übertragen der zeilen aus dem originalcode und ist dort nicht zu finden.

            und wir sollen jetzt weiter raten ob du nicht den einen oder anderen "verschreiber" eingebaut hast?

            wie wär's wenn du uns stattdessen Code zeigst der exakt das tut was du beschreibst und nicht irgendeinen Phantasiecode?

            Struppi.

            1. hallo,

              wenn es dir/euch so ein anliegen ist und meint das hilft. der code ist einem kniffel-spiel (unpunk.planspielpopband.de/kniffel) entnommen, und die methode sieht folgendermaßen aus:

                
              endGame : function () {  
                var points = Kniffel.entries.allAll.currentEntry;  
                var comment = "";  
                
                comment = (points <= 100) ?"Talk to the whitespace, you're not worth the comment!" :comment;  
                comment = (points > 100 && points <= 200) ?"Man kann sagen: Du hast es probiert...":comment;  
                comment = (points > 200 && points <= 250) ?"Da geht noch mehr...":comment;  
                comment = (points > 250 && points <= 300) ?"Es nimmt Formen an!":comment;  
                comment = (points > 300 && points <= 320) ?"Das ist gar nicht mal so schlecht!":comment;  
                comment = (points > 320 && points <= 340) ?"Dieser Punktestand adelt dich, in gewisser Weise":comment;  
                comment = (points > 340 && points <= 375) ?"Weltmeisterlich... um nicht zu sagen: bravourös!":comment;  
                if (points > 375) {alert("Cheater!!! Du wirst in der Hölle braten/im Himmerl verrotten!!!"); return;};  
                
                if (window.confirm("Das Spiel ist vorbei, du hast "+points.toString()+" Punkte.\n"+comment+"\n\nWollen sie das Ergebnis in die Bestenliste eintragen?")) {  
                 var name = cookieHandling.getValue("player", "Name eingeben");  
                 do {  
                  if (name = window.prompt("Bitte geben sie ihren Namen ein! (0-8 Zeichen)", name)) continue  
                  else return false;  
                  }  
                 while (!Kniffel.checkName(name));  
                
                 if (name) {  
                  document.cookie = "player="+name+";expires=Sun Jul 05 2961 13:33:02 GMT+0200 (CEST)";  
                  XHRequest.send("post", "list/mklist.php", Kniffel.handleRequest, "points="+points+"&name="+name);  
                  }  
                 else return false;  
                 }  
                else return false;  
               },  
              
              

              disclaimer:
              falls sich das wirklich jemand anschauen sollte: ich mach das nicht professionell, das ist zu 100% zeitvertreib, meine programmierfähigkeiten/-kenntnisse bewegen sich außerhalb von js und php am unteren rand der skala und ich bin mir bewusst, dass ich noch vieles zu lernen habe. also bitte nicht allzu damit ins gericht gehen. ansonsten bin ich natürlich über anregungen/kritik sehr erfreut.

              gruß,

              pD

  2. Hi,

    if (prompt) {
          do {
             if (name=prompt("Namen eingeben!"), name) continue
             else return false;

    in allen browsern tut eine funktion dieser art auch was sie tun soll. nur der IE(7) hängt sich an dieser stelle auf. er durchläuft zwar die schleife, schmeißt aber keinen prompt aus. dafür zeigt er einen hinweis an: "Das Anzeigen bestimmter Inhalte dieser Site wurde aus Sicherheitsgründen eingeschränkt....".

    Und wie sieht der Rueckgabewert des prompt-Aufrufes in diesem Falle aus? (Sofern es einen gibt.)

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
    1. hallo,

      Und wie sieht der Rueckgabewert des prompt-Aufrufes in diesem Falle aus? (Sofern es einen gibt.)

      danke für die frage! der rückgabewert ist null. da ich ein blöder hund bin, zum testen im IE eine zweite maschine anwerfen muss und dabei wohl die versionen verschmissen habe, stimmt die aussage "der ie stürzt ab" für die oben gezeigte funktion nicht. der IE bricht die funktion nach dem ersten durchlaufen ab und tut nichts weiter, auch wenn er eigentlich etwas tun sollte.
      insofern ist meine frage nicht unwirksam: gibt es eine möglichkeit (man nennt es glaub ich auch workaround) abzufragen ob das prompt-fenster vom IE geblockt wird. dann könnte man dem ie-user mit geblocktem prompt ein eigenes prompt anbieten. dies für alle user zu tun würde ich gerne vermeiden.

      gruß und danke,

      pD

      1. insofern ist meine frage nicht unwirksam: gibt es eine möglichkeit (man nennt es glaub ich auch workaround) abzufragen ob das prompt-fenster vom IE geblockt wird.

        Man kann ein prompt Fenster nicht blocken, auch der IE nicht.

        Struppi.

        1. hallo,

          Man kann ein prompt Fenster nicht blocken, auch der IE nicht.

          dann frage ich mich aber was der IE dann tut wenn er das fenster nicht anzeigt und einen entsprechenden hinweis ausgibt.

          1. Man kann ein prompt Fenster nicht blocken, auch der IE nicht.

            dann frage ich mich aber was der IE dann tut wenn er das fenster nicht anzeigt und einen entsprechenden hinweis ausgibt.

            Du weißt wo der IE seine JS Fehlermeldungen versteckt?

            Struppi.

            1. hallo,

              Du weißt wo der IE seine JS Fehlermeldungen versteckt?

              das weiß ich wohl, die sagt mir aber nichts. wohl sagt mir aber die Informationsleiste etwas (siehe OP) und wenn du mal in die IE hilfe schaust (Grundlegendes zur Informationsleiste -> Welche Meldungen werden in der Informationsleiste angezeigt; Weblink finde ich gerade keinen aufschlussreichen) dann findest du dort den folgenden eintrag:

              Meldung: Diese Website verwendet ein Skriptfenster, um Informationen zu erfragen. Wenn Sie dieser Website vertrauen, klicken Sie hier, und lassen Sie Skriptfenster zu.

              Bedeutung: Internet Explorer hat eine Website gesperrt, um zu verhindern, dass diese in einem separaten Fenster ein kleines Programm (ein so genanntes Skript) verwendet. Hacker (sic!) verwenden manchmal Skriptfenster, um seriöse Fenster wie Anmeldefenster von Websites zu imitieren. Wenn Sie der Website vertrauen und das Skriptfenster zulassen möchten, klicken Sie auf die Informationsleiste und anschließend auf die Option zum vorübergehenden Zulassen von Skriptfenstern. Aktivieren Sie die Sicherheitseinstellung, die Websites das Erfragen von Informationen mittels Skriptfenstern erlaubt, um Skriptfenster immer zuzulassen.

              blöd ist aber, dass prompt eben nicht wirklich gesperrt/geblockt ist, sondern einfach ein null zurückliefert und sich deshalb so verhält als hätte der benutzer auf abbrechen geklickt.
              vielleicht muss ich doch auf ein selbstgestaltetes prompt umsteigen, was mir nicht sehr recht ist.

              gruß,

              pD

              1. Du weißt wo der IE seine JS Fehlermeldungen versteckt?

                das weiß ich wohl, die sagt mir aber nichts.

                Das heißt es gibt eine?

                Meldung: Diese Website verwendet ein Skriptfenster, um Informationen zu erfragen. Wenn Sie dieser Website vertrauen, klicken Sie hier, und lassen Sie Skriptfenster zu.

                Ich hab hier grad keinen IE 7, aber nach kurzen suchen bin ich auf diesen Thread gestossen, wo deine Beobachtung bestätigt wird.

                Dann wird es so sein wie du sagst, prompt liefert null zurück genauso wie wenn der Anwender auf abbrechen klickt. Dein test auf (window).prompt ist also überflüssig. ich frage mich sowieso wozu eine if Abfrage eine do Schleife?

                Das sollte dir weiterhelfen:

                function wieIstDerName() {  
                   var name;  
                   do {  
                      name = prompt("Namen eingeben!");  
                      if(name == null) return false;  
                   }  
                   while (!nameAkzeptabel(name));  
                   tuWasMitDemName(name);  
                }  
                
                

                Struppi.

                1. hallo,

                  Das sollte dir weiterhelfen:

                  function wieIstDerName() {

                  var name;
                     do {
                        name = prompt("Namen eingeben!");
                        if(name == null) return false;
                     }
                     while (!nameAkzeptabel(name));
                     tuWasMitDemName(name);
                  }

                    
                  ausser dass du die if (prompt) etc. abfrage rausgeschmissen (zugegeben: überflüssig) und die frage nach name == null etwas umgestellt hast, hat sich ja nicht viel geändert. IE-user sitzen immer noch da und gucken in die röhre. das wollte ich ja eigentlich vermeiden... naja, dann müssen sie das wohl.  
                    
                  danke und gruß,  
                    
                  pD