Udo: onBlur funktioniert nicht korrekt in Netscape 6.2

Hi

habe ein Problem mit dem Ereignis "onBlur", was aber nur in Netscape 6.2 auftaucht und nicht im Internet Explorer 6.

Ich habe in einem Input-Feld vom typ "Text" ein Check in das OnBlur-Ereignis integriert. Wenn der Check negativ verläuft, soll der Focus auf dem Feld bleiben. Im IE 6 bleibt der Focus erhalten, beim NN 6.2 geht er verloren.

Hat einer eine Erklärung und/oder insbesondere einen Workaround?

Folgend das Beispiel (damit der Check ein negatives Ergebnis liefert, kann z.B eine 0 eingegeben werden):

<html>
<head>
</head>
<body>
<form name="form" method="post">
<script language="javascript">
<!--
 function IsPositiveFloat(io_oInputField, i_bIsZeroAllowed)
 {
     var fDouble;
     var bIsPositiveFloat;

bIsPositiveFloat = false;

if (io_oInputField.value.length == 0)
     {
         io_oInputField.value = "0";
     }

if (isNaN(io_oInputField.value) == false)
     {
         fDouble = parseFloat(io_oInputField.value);
         if (i_bIsZeroAllowed == true)
         {
             if (fDouble >= 0)
             {
                 bIsPositiveFloat = true;
             }
         }
         else
         {
             if (fDouble > 0)
             {
                 bIsPositiveFloat = true;
             }
         }
     }
     if (bIsPositiveFloat == false)
     {
         if (i_bIsZeroAllowed == true)
         {
             io_oInputField.value = 0;
         }
         else
         {
             io_oInputField.value = 1;
         }
         io_oInputField.focus();
         io_oInputField.select();
     }
     else
     {
  io_oInputField.value = fDouble;
     }
     return(bIsPositiveFloat);
 }
-->
</script>

<table>
<tr>
<td >
 <input type="text" name="value" size="10" maxlength="12" value="1" onblur="javascript:IsPositiveFloat(this,false);" />

</td>
</tr>
<tr>
<td >
 <input type="text" name="value" size="10" maxlength="12" value="1" onblur="javascript:IsPositiveFloat(this,false);" />

</td>
</tr>
</table>
</form>
</body>
</html>

  1. Hallo Udo

    habe ein Problem mit dem Ereignis "onBlur", was aber nur in Netscape 6.2 auftaucht und nicht im Internet Explorer 6.

    es ist ein einfaches Zeitproblem:

    der Funktionsaufruf wird durch den Event onblur gestartet. Innerhalb der Funktion wird dabei das Element erneut mit einem Focus-versehen.

    Für Netscape 6 ist aber der Event onblur offensichtlich noch aktiv. Deshalb wird die Methode focus() von ihm ignoriert.

    Abhilfe: rufe die Zeilen

    io_oInputField.focus();
             io_oInputField.select();

    zeitverzögert auf. Du mußt natürlich dein Objekt io_oInputField entweder auf eine globale Variable speichern oder dir den Elementnamen merken.

    <input type="text" name="value" size="10" maxlength="12" value="1" onblur="javascript:IsPositiveFloat(this,false);" />

    hier gehört javascript: nicht hin, onblur ist bereits javascript

    <input type="text" name="value" size="10" maxlength="12" value="1" onblur="javascript:IsPositiveFloat(this,false);" />

    ist es beabsichtigt, dass beide Felder den gleichen Namen tragen?

    Viele Grüße

    Antje

    1. Hallo Antje,

      danke für Deine Antwort. Nach weiteren Test bin ich bei der Suche des Problems zum ähnlichen Ergebnis gekommen. Wenn man das Beispiel durch irgendeine Meldung nach Aufruf von io_oInputField.select() bremst, so ist zwischenzeitlich der Focus/Markierung korrekt gesetzt. Nachdem aber alle Anweisungen im OnBlur Event verarbeitet worden sind (innerhalb oder außerhalb der Funktion), dann wird in NN 6.2 gnadenlos zum nächsten Element gegangen.

      Deim Vorschlag

      Abhilfe: rufe die Zeilen

      io_oInputField.focus();
               io_oInputField.select();

      zeitverzögert auf. Du mußt natürlich dein Objekt io_oInputField

      entweder auf eine globale Variable speichern oder dir den Elementnamen merken.
      habe ich aber nicht ganz verstanden. Darüber hinaus kann ich es irgendwie vermeiden globale Variablen zu verwenden? Das Problem taucht in mehren Sourcen und für verschiedene Checks auf. Deshalb will ich das Problem in der Funktion selbst lösen und nicht außerhalb mit globalen Variablen.

      hier gehört javascript: nicht hin, onblur ist bereits javascript

      onBlur ist meiner Meinung nach ein Ereignis, auf das man reagieren kann. Die Programmiersprache (Javascript oder VBScript) ist dabei wählbar.

      <input type="text" name="value" size="10" maxlength="12" value="1" onblur="javascript:IsPositiveFloat(this,false);" />
      ist es beabsichtigt, dass beide Felder den gleichen Namen tragen?

      Es ist so beabsichtigt. Der Einfachheit halber habe ich weitere Teile im Beispiel weggelassen. Ursprünglich waren unter jedem Input-Feld Element vom Typ Text noch ein Input-Feld Element vom Typ Hidden, die jedoch unterschiedlich benannt werden. Daß dieser Weg gewählt wurde, hat projektspezifische Gründe und würde zu weit gehen es zu erklären.

      Viele Grüße
      Udo

      1. Hallo Udo,

        Abhilfe: rufe die Zeilen

        io_oInputField.focus();
                 io_oInputField.select();

        zeitverzögert auf. Du mußt natürlich dein Objekt io_oInputField
        entweder auf eine globale Variable speichern oder dir den Elementnamen merken.
        habe ich aber nicht ganz verstanden.

        setTimeout spielt sich im globalen Namensraum ab. Zu dem Zeitpunkt, wo die Objekte dann benötigt werden existieren diese nicht mehr.
        Deshalb mußt du diese entweder auf Variable speichern oder entsprechende Informationen übergeben.

        Darüber hinaus kann ich es irgendwie vermeiden globale Variablen zu verwenden? Das Problem taucht in mehren Sourcen und für verschiedene Checks auf. Deshalb will ich das Problem in der Funktion selbst lösen und nicht außerhalb mit globalen Variablen.

        dann bleibt nur der Name des Elementes oder seine Position im Formular. Mit diese Informationen kannst du dann weiterarbeiten.

        Beispiel:

        function focussetzen(element)
        {
         element.focus();

        }

        setTimeout("focussetzen(document.forms[0].elements[0])",1000)

        dieser Aufruf gibt nach einer Sekunde dem ersten Element im ersten Formular den Fokus.
        Hier wird das Objekt direkt übergeben.

        Bei dir sieht es jedoch anders aus. Dein Objekt ist in der lokalen Variable io_oInputField gespeichert.
        Ein Aufruf der Form:
        setTimeout("focussetzen(io_oInputField)",1000) erzeugt einen Fehler, da io_oInputField zum Ausführungszeitpunkt nicht mehr existiert bzw. nicht von der Methode ansprechbar ist.

        Eine Alternative wäre:

        setTimeout("focussetzen(document.forms[0]['"+io_oInputField.name+"'])",1000)

        hier gehört javascript: nicht hin, onblur ist bereits javascript

        onBlur ist meiner Meinung nach ein Ereignis, auf das man reagieren kann. Die Programmiersprache (Javascript oder VBScript) ist dabei wählbar.

        die Doku sagt:

        You are probably familiar with the standard types of URLs: http:, ftp:, file:, and so on. With Navigator, you can also use URLs of type javascript: to execute JavaScript statements instead of loading a document. You simply use a string beginning with javascript: as the value for the HREF attribute of anchor tags. For example, you can define the following hyperlink to reload the current page when the user clicks it:
        http://developer.netscape.com/docs/manuals/js/client/jsguide/advtopic.htm#1004952

        Auch die MS -Doku schweigt sich über den Syntax VBscript: aus.
        Am besten du vergleichst einmal, wie die verschiedenen Sprachen hier angegeben werden.
        http://msdn.microsoft.com/library/en-us/dnclinic/html/events.asp?frame=true

        ansonsten, hast du es ausprobiert? Was sagen die Browser dazu, wenn du z.b. vbscript: verwendest?

        <input type="text" name="value" size="10" maxlength="12" value="1" onblur="javascript:IsPositiveFloat(this,false);" />
        ist es beabsichtigt, dass beide Felder den gleichen Namen tragen?

        Es ist so beabsichtigt. Der Einfachheit halber habe ich weitere Teile im Beispiel weggelassen. Ursprünglich waren unter jedem Input-Feld Element vom Typ Text noch ein Input-Feld Element vom Typ Hidden, die jedoch unterschiedlich benannt werden. Daß dieser Weg gewählt wurde, hat projektspezifische Gründe und würde zu weit gehen es zu erklären.

        Nun, das bedeutet, dass du das Element über die Elementenummer ansprechen mußt. Diese mußt du dann über eine Schleife ermitteln.

        Viele Grüße

        Antje

        1. Hallo Antje,

          danke für die Ergänzungen zu Deinem Lösungsvorschlag. Ich habe mal die 2. Alternative ausprobiert:

          setTimeout("focussetzen(document.forms[0]['"+io_oInputField.name+"'])",1000)

          Dies funktioniert (in IE und NN) solange die Form-Elemente eindeutig benannt worden sind. In meinem Fall sind aber die Namen gleich und es gibt eine Fehlermeldung, da die Funktion "fokussetzen" auf ein Collection/Array Objekt trifft, das die Methode "focus()" nicht kennt.

          Thema onBlur: javascript:

          ansonsten, hast du es ausprobiert? Was sagen die Browser dazu, wenn du z.b. vbscript: verwendest?

          Natürlich hast Du recht. Die verschiedenen Browser können  nicht
          alle Scripte verarbeiten. In unserem Projekt sind wir zu dieser Erkenntnis leider sehr spät gekommen. Wir hatten schon viele Clientscripts in VB-Script geschrieben. Der IE hatte nie Probleme. Beim ersten Test in NN, wurden wir mit der Tatsache konfrontiert, das NN VB-Script nicht untstützt. Dumm gelaufen ..

          Thema: Nicht eindeutige Benennung von Form-Elementen:

          Nun, das bedeutet, dass du das Element über die Elementenummer ansprechen mußt. Diese mußt du dann über eine Schleife ermitteln.

          Ganz genau so läufts!

          Viele Grüße
          Udo