Gerhard: Event für Änderung einer Select-Liste

Hallo!

Ich bin verzweifelt auf der Suche nach einem Event, dass die Änderung der Anzahl der Options einer Select-Box erkennt.
Per AJAX und einem Textfeld können diese eingeschränkt werden. Allerdings kann ich onKeyUp des Textfeldes nicht verwenden, weil es vor dem AJAX-Request triggert (daher immer um einen Request hinterherläuft), und auch onChange auf die Select-Box reagiert nicht!
Hat jemand eine Idee? Bin leider weder im Forum noch sonst wo fündig geworden...

Dankeschön,
mfG Gerhard

  1. Hi,

    Allerdings kann ich onKeyUp des Textfeldes nicht verwenden, weil es vor dem AJAX-Request triggert (daher immer um einen Request hinterherläuft),

    Glasgoogle: Du verwendest irgendein Javascript-Framwork? Dann würde ich dort, wo Du den Ajax-Request initiierst, eine entsprechende Response-Callbackfunktion notieren.

    Ansonsten solltest Du konkreter werden, siehe auch Tipps für Fragende

    Gruesse, Joachim

    --
    Am Ende wird alles gut.
  2. Lieber Gerhard,

    auf der Suche nach einem Event, dass die Änderung der Anzahl der Options einer Select-Box erkennt.

    das gibt es so nicht. Du müsstest Dir soetwas basteln. Du könntest z.B. Deinem <select>-Element eine Methode "onappend" geben.

    function onappend() {  
        alert("'onappend()' des Elements wurde aufgerufen!");  
        return;  
    }  
      
    function imbueElementsWithOnAppend(tagName) {  
      
        var allMyElements = document.getElementsByTagName(tagName), i;  
      
        for (i = 0; i < allMyElements.length; i++) {  
            // setzt "this" innerhalb der Funktion auf das aktuelle HTML-Element:  
            onappend.apply = function (allMyElements[i]);  
        }  
    }
    

    Die Funktion, die Deine <select>-Felder um Optionen erweitert, müsste dann eben jedesmal, wenn sie eine Erweiterung vorgenommen hat, diese onappend-Funktion aufrufen:

    function meineAJAXgetriebeneUpdateFunktion () {  
        var mySelect = ...; // irgendwo ist eine Referenz auf das <select>-Element vorhanden  
      
        ... // neue <option>-Elemente in ein <select>-Element einpflanzen  
        if (typeof mySelect.onappend == "function") {  
            mySelect.onappend();  
        }  
    }
    

    Ich habe sowas noch nie gemacht, aber das sollte in etwa so klappen. Man hat ja das Problem, dass bei Eventhandler-Funktion das Schlüsselwort "this" immer auf das aktuelle HTML-Element verweist, bei dem das Event festgestellt wurde - und das habe ich mit apply versucht, zu simulieren.

    Das muss man aber so nicht machen. Man kann einfach myElement.onappend=function(){...} notieren, sodass dann innerhalb der Funktion this eben auf window verweist... ganz wie Du das brauchst.

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. // setzt "this" innerhalb der Funktion auf das aktuelle HTML-Element:
              onappend.apply = function (allMyElements[i]);

      Das ist Phantasiecode. ;) Was du meinst, ginge eher so (mit zwei Closures pro Schleifendurchlauf):

      for (i = 0; i < allMyElements.length; i++) {
        (function () {
          var element = allMyElements[i];
          element.onappend = function () {
            onappend.apply(element, arguments);
          };
        })();
      }

      apply ist eine Methode des Funktionsobjekt onappend und erwartet das gewünschte this-Objekt als Parameter sowie einen optionalen Parameter-Array.

      Man kann einfach myElement.onappend=function(){...} notieren, sodass dann innerhalb der Funktion this eben auf window verweist... ganz wie Du das brauchst.

      Ich sehe hier kene Notwendigkeit, den this-Kontext mit apply zu korrigieren.

      Man kann einfach
        allMyElements[i].onappend = onappend;
      notieren und wenn man dann
        mySelect.onappend()
      aufruft, zeigt this wie gewünscht auf mySelect.

      Mathias

      1. Lieber molily,

        Das ist Phantasiecode. ;)

        ja, ich habe mich mit diesen Binding-Dingsen noch nicht genügend beschäftigt. Daher schrieb ich ja auch, dass das eventuell Mist sein könnte.

        Was du meinst, ginge eher so (mit zwei Closures pro Schleifendurchlauf):

        for (i = 0; i < allMyElements.length; i++) {
          (function () {
            var element = allMyElements[i];
            element.onappend = function () {
              onappend.apply(element, arguments);
            };
          })();
        }

        Extrem wertvolle Info für mich!! Danke!

        Man kann einfach
          allMyElements[i].onappend = onappend;
        notieren und wenn man dann
          mySelect.onappend()
        aufruft, zeigt this wie gewünscht auf mySelect.

        Aha, also wieder ein Fall von "warum einfach, wenn's auch umständlich geht?" - Wieder etwas gelernt.

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
      2. for (i = 0; i < allMyElements.length; i++) {
          (function () {
            var element = allMyElements[i];
            element.onappend = function () {
              onappend.apply(element, arguments);
            };
          })();
        }

        Das ist zwar ein schönes Theorie-Beispiel zum Thema Closures & Schleifen, aber so würde man das in der Praxis natürlich nicht machen - selbst wenn das Binding nötig ist, weil die Gefahr besteht, dass die Funktion irgendwann nicht über element.onappend() aufgerufen wird.

        Dann lagert man diese absurd komplizierte doppelte Closure-Erzeugung aus in eine allgemeine bind-Methode. Die gehört mit dem kommenden ECMAScript 5 übrigens zum Standardumfang von JavaScript.

        for (... allMyElements ...) {
           element.onappend = onappend.bind(allMyElements[i]);
        }

        Mathias

    2. Hallo Felix,

      function imbueElementsWithOnAppend(tagName)

      ja, du musst Englischlehrer sein. ;-)
      Ich wüsste sonst niemanden, der "imbue" zu seinem aktiven Wortschatz zählt, und ich habe selbst überlegt, wie ich das in diesem Fall wohl übersetzen würde: "Durchsetzen"? "Verschmelzen"?
      Das ist so eines dieser englischen Wörter, deren Bedeutung ich gefühlsmäßig verstehe, aber im Deutschen schwer wiedergeben kann.

      Schönen Abend noch,
       Martin

      --
      PCMCIA: People Can't Memorize Computer Industry Acronyms
      1. Lieber Martin,

        ja, du musst Englischlehrer sein. ;-)
        Ich wüsste sonst niemanden, der "imbue" zu seinem aktiven Wortschatz zählt

        Du hast anscheinend niemals Diablo2 auf Englisch gespielt, oder darüber im Internet gelesen...

        Das ist so eines dieser englischen Wörter, deren Bedeutung ich gefühlsmäßig verstehe, aber im Deutschen schwer wiedergeben kann.

        LEO kennt imbue

        Liebe Grüße,

        Felix Riesterer.

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

          »» ja, du musst Englischlehrer sein. ;-)
          »» Ich wüsste sonst niemanden, der "imbue" zu seinem aktiven Wortschatz zählt
          Du hast anscheinend niemals Diablo2 auf Englisch gespielt, oder darüber im Internet gelesen...

          stimmt. :-)

          »» Das ist so eines dieser englischen Wörter, deren Bedeutung ich gefühlsmäßig verstehe, aber im Deutschen schwer wiedergeben kann.
          LEO kennt imbue

          Natürlich, dict.cc kennt das Wort auch. Der Martin kennt es auch - aber nicht aus der Schule, sondern eher aus Romanen und Liedertexten. Und, wie gesagt, meist erschließt sich die Bedeutung aus dem Zusammenhang. Die von LEO oder dict.cc angebotenen Übersetzungen erscheinen mir aber alle zu gegenständlich, weil ich "imbue" bisher immer im Zusammenhang mit Emotionen gelesen habe. "Erfüllen" passt da noch am ehesten.

          Schönen Tag noch,
           Martin

          --
          Die letzten Worte des Polizisten:
          Ich hab mitgezählt: Sechs Schuss, jetzt hat er keine Munition mehr!