Christian S.: watch Methode

Hi,

ich versuche gerade die disabled property einer Textbox zu überwachen.

Dazu habe ich folgendes Skript testweise geschrieben (Aussschnitt):

<script type="text/javascript">

window.onload = function()
{
 var bla = function(a, b, c)
 {
  alert(typeof arguments[1]);
 };

var o = document.getElementById("test");
 if(o.watch)
 {
  o.watch('disabled', bla);
 }

};

document.documentElement.onclick = function()
{
 var o = document.getElementById("test");
 o.disabled = true;
};

</script>

<input type="text" id="test" />

ich hol mir beim onload die Textbox und überwache die disabled eigenschaft.

Die Funktion bekommt dann 3 Werte übergeben:
1. "disabled" als string (also name der property)
2. undefined
3. true (value also)

Gibt es aber keine Möglichkeit auf das Objekt innerhalb der Funktion zuzugreifen?? Und was ist der zweite Parameter?

Und welche Browser unterstüzen die watch methode? IE nicht, das weiß ich... und sonst so?

außer durch closures, was ich nicht so schön finde...

Gruß
Christian

  1. Moin!

    ich versuche gerade die disabled property einer Textbox zu überwachen.

    Wozu dies?

    Der einzige Weg, dynamisch diese Feldeigenschaft zu ändern, läuft über Javascript.

    Das bedeutet: Du kannst alles, was du für den Fall, dass die Eigenschaft sich ändert, tun willst, auch direkt dort in den Code einfügen, wo du die Eigenschaft direkt änderst - mindestens mal als externer Funktionsaufruf. Das spart dir erheblichen Ärger und dem Benutzer erheblich Performance.

    window.onload = function()

    Das also komplett weglassen.

    document.documentElement.onclick = function()
    {
    var o = document.getElementById("test");
    o.disabled = true;

    Und hier die gewünschte Aktion bzw. den Funktionsaufruf mit "mehr" einfügen.

    };

    Spricht doch eigentlich nichts dagegen, Dinge direkt zu erledigen, anstatt sie indirekt zu machen - oder?

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Hi,

      ich versuche gerade die disabled property einer Textbox zu überwachen.

      Wozu dies?

      Eigentlich will ich das für einen image button (<input type="button">) machen.

      Wenn irgendwo mal der Button auf disabled gesetzt wird, soll das image ausgetauscht werden.

      ich will nicht jedes mal schreiben müssen:

      o.disabled = true;
      ChangeImage(this, newSrc);

      und später wenn ich es wieder aktiviere:

      o.disabled = false;
      ChangeImage(this, oldSrc);

      » Das bedeutet: Du kannst alles, was du für den Fall, dass die Eigenschaft sich ändert, tun willst, auch direkt dort in den Code einfügen, wo du die Eigenschaft direkt änderst - mindestens mal als externer Funktionsaufruf. Das spart dir erheblichen Ärger und dem Benutzer erheblich Performance.

      Schluckt das denn soviel Performance??

      Gruß
      Christian

      1. hi,

        Wenn irgendwo mal der Button auf disabled gesetzt wird, soll das image ausgetauscht werden.

        ich will nicht jedes mal schreiben müssen:

        Was macht man, wenn man etwas "nicht jedes mal schreiben müssen" möchte?
        Man erinnert sich an das Konzept namens "Funktion".

        o.disabled = true;
        ChangeImage(this, newSrc);

        und später wenn ich es wieder aktiviere:

        o.disabled = false;
        ChangeImage(this, oldSrc);

        Na dann pack' den Krempel doch einfach zusammen in eine Funktion, wenn du ihn nicht jedes mal wieder schreiben willst.

        Ob eine für disabled=true und eine für false, oder nur eine, die beides erledigt, bleibt dir überlassen.

        Und wenn du nicht jedes mal auch noch die Bildadresse als Parameter übergeben, oder sie fest in der Funktion hinterlegen willst - dann bietet sich die Erstellung eines Objektes dafür wohl an.
        Als Parameter im Konstruktor kannst du neben der Referenz auf den Button auch noch die zwei Bild-Adressen übergeben, und entsprechende Img-Objekte erzeugen. Und disabled auf true/false setzen übernimmt dann eine Methode dieses Objektes, die dann auch noch jeweils die Bildquelle austauscht.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
  2. Hi,

    habe noch ein Problem, was auch mit der watch methode zu tun hat:

    wenn ich einen ganz normalen <input type="image"> oder <input type="submit"> Button per JavaScript auf disabled setze, klappt alles wunderbar. Der Button wird grau und man kann nicht mehr submitten.

    Sobald ich aber die disabled Property mit watch überwache, wird der Button nicht mehr disabled, obwohl ich ihn auf disabled = true gesetzt habe.

    Jmd eine Idee??

    Hier noch mein Code-Schnipsel:

    <html>
    <head>
     <title>Test</title>
    <script type="text/javascript">

    function registerImageButton(o)
    {
     var test = function(a, b, c)
     {
     };

    if(o.watch)
     {
      o.watch('disabled', test);
     }

    }

    document.documentElement.onkeydown = function(e)
    {
     // disable den Button bei "a", aktiviere ihn wieder mit "s"
     var o = document.getElementById("test");
     if(e.keyCode == 65)
     {
      o.disabled = true;
     }
     if(e.keyCode == 83)
     {
      o.disabled = false;
     }
    };

    </script>
    </head>

    <body>

    <form onsubmit="alert('wird submittet')">
    <input type="submit" id="test" />
    </form>
    <script type="text/javascript">

    registerImageButton(document.getElementById("test"));

    </script>

    </body>
    </html>

    wenn ich dann die Zeile:

    o.watch('disabled', test); auskommentiere, dann klappts wieder. sonst nicht.

    Gruß
    Christian

    1. nach rumprobieren gelöst:

      man muss in der Funktion die durch watch() aufgerufen wird noch den Wert return, also so:

      function registerImageButton(o)
      {
      var test = function(a, b, c)
      {

      return c;

      };

      if(o.watch)
      {
        o.watch('disabled', test);
      }

      }

      Gruß
      Christian