Paul Eppner: Nodeeigenschaft überschreiben

Hallo,

gibt es eine Möglichkeit node.nextSibling durch z.b. node.next zu ersetzen oder um diese Eigenschaft zu erweitern? Meine Versuche sind leider alle gescheitert :-(

gruß, paul

  1. Hi,

    gibt es eine Möglichkeit node.nextSibling durch z.b. node.next zu ersetzen oder um diese Eigenschaft zu erweitern? Meine Versuche sind leider alle gescheitert :-(

    Du kannst allen Node-Objekten per prototype eine next-Eigenschaft[1] geben. Deine Versuche werden auch hierbei jedoch scheitern, sofern der IE die Geschichte unterstützen soll. Ich muss allerdings gestehen noch nie versucht zu haben, Object selbst per prototype zu verändern, um Node zu erweitern.

    Cheatah

    [1] Ich wollte mich erst noch darüber auslassen, dass diese eine Methode sein sollte, weil es schwer (unmöglich?) ist, dem IE eine Getter-Methode hinzuzufügen.

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hallo,

      Ich wollte mich erst noch darüber auslassen, dass diese eine Methode sein sollte, weil es schwer (unmöglich?) ist, dem IE eine Getter-Methode hinzuzufügen.

      Das Selbe gilt aber auch für andere nicht-Geckos wie z.B. Opera oder?

      mfg. Daniel

      1. Hi,

        Das Selbe gilt aber auch für andere nicht-Geckos wie z.B. Opera oder?

        laut meinen Tests kann Opera (mindestens in Version 9) Image, Option, Location, Window, Screen, History, Navigator, MimeType, Plugin, Event, ActiveXObject und Layer nicht per prototype verändern, alles andere schon. Mag sein, dass ich etwas übersehen habe; aber DOM-Objekte wie Node, Element, HTMLElement und HTMLSelectElement habe ich erfolgreich getestet.

        Was den IE betrifft: Ich habe oben 12 Objekte aufgezählt, die Opera nicht entsprechend beherrscht. Beim IE würde ich 11 Objekte[1] aufzählen - _die_ er beherrscht. Es ist traurig.

        Geckos beherrschen prototype übrigens nicht bei ActiveXObject (kein Wunder), Layer (ebenfalls nicht) und Location. Letzteres wundert mich. Die "gute" Nachricht ist aber, dass Location soweit ich mich entsinne in keinem Browser verändert werden kann.

        Cheatah

        [1] Eigentlich 10, da "Überladung" kein Objekt ist. Insgesamt zählt meine Liste übrigens 33 Einträge.

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hallo,

          also ich habe hier [1] eine Variante gesehen und hab versucht dies irgendwie auf node anzuwenden, bin aber gescheitert. Vielleicht geht es aber doch und ich stell mich einfach nur zu blöd an?

          gruß, paul
          [1] http://forum.de.selfhtml.org/archiv/2005/2/t100600/

          1. hmm, leider kann ich euch nicht recht folgen :-( geht es nun, oder nicht? ich würde mir halt gerne so lange zeilen wie
            e.nextSibling.firstChild.nextSibling.nextSibling.nextSibling.innerHTML ersparen
            e.n.f.n.n.n.innerHTML wäre da schon richtig klasse!

            gruß, paul

            1. Hallo,

              e.nextSibling.firstChild.nextSibling.nextSibling.nextSibling.innerHTML ersparen
              e.n.f.n.n.n.innerHTML wäre da schon richtig klasse!

              Geht es dir nur um die Kurzschreibweise?
              Wenn du so lange Zeilen hast, dann solltest du überdenken, wie du Elemente effizienter ansprichst. Dich händisch durch Kindknoten zu hangeln ist an sich unschön.

              Mathias

              1. hallo,

                ja, mir geht es nur um die Kurzschreibweise.

                Dich händisch durch Kindknoten zu hangeln ist an sich unschön.

                dem stimme ich zu - habe auch schon viel daran geschraubt und würde halt auch diesen Punkt noch etwas übersichtlicher gestalten wollen. Also gibt es keine Möglichkeit?

                gruß, paul

                1. Hi,

                  ja, mir geht es nur um die Kurzschreibweise.

                  hm, ich hatte irgendwie vermutet, Du wolltest Whitespace-Nodes überspringen.

                  Dich händisch durch Kindknoten zu hangeln ist an sich unschön.
                  dem stimme ich zu - habe auch schon viel daran geschraubt und würde halt auch diesen Punkt noch etwas übersichtlicher gestalten wollen. Also gibt es keine Möglichkeit?

                  Vielleicht gibt es eine Lösung für den Use Case. Für Deinen Ansatz, diesen zu lösen, gibt es effektiv keine. Wie also lautet Dein Problem, das Du durch diese Eigenschaften-Parade zu lösen versuchtest?

                  Cheatah

                  --
                  X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                  X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                  X-Will-Answer-Email: No
                  X-Please-Search-Archive-First: Absolutely Yes
                  1. hm, ich hatte irgendwie vermutet, Du wolltest Whitespace-Nodes überspringen.

                    nein, dafür hatte ich schon eine Funktion - würde diese dann aber weglassen, da ich bis jetzt am Anfang die gesamte Seite durchgehe.

                    Vielleicht gibt es eine Lösung für den Use Case. Für Deinen
                    Ansatz, diesen zu lösen, gibt es effektiv keine. Wie also lautet
                    Dein Problem, das Du durch diese Eigenschaften-Parade zu lösen
                    versuchtest?

                    falls ihr wirklich daran interessiert seid, euch durch meinen quellcode durchzuwursteln, werde ich es zeigen.

                    gruß, paul

            2. Hallo,

              hmm, leider kann ich euch nicht recht folgen :-( geht es nun, oder nicht? ich würde mir halt gerne so lange zeilen wie
              e.nextSibling.firstChild.nextSibling.nextSibling.nextSibling.innerHTML ersparen

              Wie viele brauchst du davon? Normalerweise höchstens eine. Dann kannst du das Objekt in eine Variable speichern.

              e.n.f.n.n.n.innerHTML wäre da schon richtig klasse!

              Und wer soll den Code dann später noch lesen können? Lesbarkeit ist IMHO wichtiger als Größe!

              mfg. Daniel

              1. Und wer soll den Code dann später noch lesen können? Lesbarkeit ist IMHO wichtiger als Größe!

                Der Quellcode ist nur für meine Augen bestimmt...

                gruß, paul

                1. Hallo,

                  Und wer soll den Code dann später noch lesen können?

                  Du zum Beispiel? Oder jemand hier im Forum, wenn du ein Problem hast?

                  Lesbarkeit ist IMHO wichtiger als Größe!
                  Der Quellcode ist nur für meine Augen bestimmt...

                  Mag sein, aber man kann Code auch so schreiben, dass man irgendwann selber nicht mehr damit klar kommt.

                  mfg. Daniel

                  1. Hallo,

                    Mag sein, aber man kann Code auch so schreiben, dass man irgendwann selber nicht mehr damit klar kommt.

                    bitte lass uns nicht am Thema vorbeidiskutieren! Die Frage ist nicht warum, sondern wie man vielleicht soetwas realisieren kann. Ob es dann Sinn macht, dies auch einzusetzen, ist doch jedem selbst überlassen.

                    gruß, paul

                    1. Hi,

                      bitte lass uns nicht am Thema vorbeidiskutieren!

                      tun wir nicht. Statt dessen bemühen wir uns, das Thema besser zu erkennen, als Du es eventuell tust - Stichwort Betriebsblindheit.

                      Die Frage ist nicht warum,

                      Doch, das ist _genau_ die Frage. Das Warum geht aber einen Schritt weiter. Du siehst die nextSibling.firstChild.irgendwas.foo.bar-Geschichte bereits als gottgegeben an, wir nicht.

                      sondern wie man vielleicht soetwas realisieren kann.

                      Du hast dieses "soetwas" für Dich bereits definiert, wir nicht.

                      Ob es dann Sinn macht, dies auch einzusetzen, ist doch jedem selbst überlassen.

                      Klar, Du kannst Dir auch einen Nagel ins Knie jagen, wenn Du lustig bist, und dabei Lösungsansätze dafür suchen, dies mit möglichst wenig Schlägen zu tun. Nichtsdestotrotz gibt es für das Problem "Bein schlenkert unruhig" eventuell andere Lösungen als den Nagel.

                      Cheatah

                      --
                      X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                      X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                      X-Will-Answer-Email: No
                      X-Please-Search-Archive-First: Absolutely Yes
                      1. hallo,

                        Du hast dieses "soetwas" für Dich bereits definiert, wir nicht.

                        ich definiere dies gerne vorher um am besten dazuzulernen, die anderen möglichkeiten kenne ich meistens schon.

                        wenn ich z.b. frage, wie ich verinden kann, dass text markiert wird, werdet ihr mir dann antworten - "mach dies blos nicht, da diese funktion so wichtig ist, umgangen werden kann blablabla". dies hilft mir aber bei meinem problem nicht weiter, dass meinetwegen beim anklicken einer tabellenzeile, diese eine andere farbe bekommen soll, aber nicht vom browser markiert werden darf.

                        ich weiß, dass ihr nur helfen wollt - und dafür vielen dank. jedoch ist mir am besten geholfen, wenn ihr einfach nur auf die frage eingeht. und wenn die antwort lautet - geht nicht, kann ich auch damit leben. ist auf jeden fall besser als drumrumzureden, dann weiß ich nach wie vor nicht, ob es funktioniert oder nicht.

                        gruß, paul

            3. gruss Paul,

              hmm, leider kann ich euch nicht recht folgen :-( geht es nun, oder nicht? ...

              nein, was den weg ueber prototypische erweiterungen angeht.

              ja, wenn Du Dich durch den DOM-baum hangeln willst, um die
                 von Dir gewuenschten methoden einfach als refernz an Deine
                 *shortcuts* zu uebergeben, was ich aber fuer hirnrissig hielte.

              ... ich würde mir halt gerne so lange zeilen wie
              e.nextSibling.firstChild.nextSibling.nextSibling.nextSibling.innerHTML ersparen

              wenn Du Dich gezwungen siehst, soetwas schreiben zu muessen,
                 scheinst Du eher ein konzeptionelles problem zu haben.

              e.n.f.n.n.n.innerHTML wäre da schon richtig klasse!

              au backe! - jetzt sieht es noch viel schlimmer aus !-)

              so long - peterS. - pseliger@gmx.net

              --
              »Because objects in JavaScript are so flexible, you will want to think differently about class hierarchies.
              Deep hierarchies are inappropriate. Shallow hierarchies are efficient and expressive.« - Douglas Crockford
              ie:( fl:) br:> va:( ls:& fo:) rl:| n3;} n4:} ss:} de:µ js:} mo:? zu:]
              1. 'tschuldigung, da war ich beim aendern des themas irgendwie auf "absenden"
                   gekommen.

                bedrueckt - peterS. - pseliger@gmx.net

              2. Hallo,

                ja, wenn Du Dich durch den DOM-baum hangeln willst, um die
                   von Dir gewuenschten methoden einfach als refernz an Deine
                   *shortcuts* zu uebergeben, was ich aber fuer hirnrissig hielte.

                ja, dies würde ich auch für hinrissig halten.

                e.n.f.n.n.n.innerHTML wäre da schon richtig klasse!
                   au backe! - jetzt sieht es noch viel schlimmer aus !-)

                Ich spare hier aber jede Menge Quellcode.

                Trotzdem Danke! Ich werde mich wohl damit abfinden müssen, dass dies im Moment noch nicht möglich ist. *schnief*

                gruß, paul

                1. Trotzdem Danke! Ich werde mich wohl damit abfinden müssen, dass dies im Moment noch nicht möglich ist. *schnief*

                  Naja, nach wie vor erscheinen deine Beispiele nicht sinnvoll und das was du beschreibst ist an für sich machbar, nur nicht so wie du es dir vorstellst. Aber nachwievor ist eher das Problem das Konzept, mit einem konkreteren Beispiel liesse sich dir vielleicht besser helfen.

                  Struppi.

                  --
                  Javascript ist toll (Perl auch!)
                  1. Aber nachwievor ist eher das Problem das Konzept, mit einem konkreteren Beispiel liesse sich dir vielleicht besser helfen.

                    Konkrete Beispiele sind bei mir zu groß und möchte ich keinem antun.

                    gruß, paul

          2. Hallo,

            also ich habe hier [1] eine Variante gesehen und hab versucht dies irgendwie auf node anzuwenden, bin aber gescheitert. Vielleicht geht es aber doch und ich stell mich einfach nur zu blöd an?

            [1] http://forum.de.selfhtml.org/archiv/2005/2/t100600/

            Da bist du auf dem falschen Dampfer, da gehts nirgends um die prototypische Erweiterung.

            Wie Daniel schreibt, kannst du im Opera und Firefox/Gecko folgendes machen, um allen Elementen über eine zentrale Zuweisung eine eigene Funktion zu verpassen:

            if (window.HTMLElement && HTMLElement.prototype) {  
               HTMLElement.prototype.getNextElement = function () {  
                  var el = this.nextSibling;  
                  while (el.nodeType != 1)  
                     el = el.nextSibling;  
                  return el;  
               };  
            }
            

            IE kann das aber nicht. Deshalb geht man üblicherweise anders vor. Man erweitert nicht wirklich alle bestehenden Elemente, sondern die, die man benutzt. Immer wenn man ein Element zur Benutzung anspricht, kopiert man alle eigenen Funktionen in das Elementobjekt. So arbeiten Frameworks wie Prototype und jQuery. Vom Konzept:

            var myFunctions = {  
               augmented : true,  
               getNextElement : function () {  
                  var el = this.nextSibling;  
                  while (el.nodeType != 1)  
                     el = el.nextSibling;  
                  return el;  
               }  
            };  
            function $ (id) {  
               var elem = document.getElementById(id);  
               if (!elem.augmented) {  
                  // Kopiere eigene Funktionen und hänge sie ans Elementobjekt  
                  for (var key in myFunctions) {  
                     elem[key] = myFunctions[key];  
                  }  
               }  
               // Gebe das Element zurück  
               return elem;  
            }  
            alert($('id').getNextElement());
            

            Die Funktion »$« kann in größeren Frameworks natürlich mehr annehmen als nur IDs als Strings.

            Eigenschaften (also sodass alert(element.nextElement) möglich wäre) sind so schwieriger abzubilden, weil nur wenige Browser Getter und Setter unterstützen (siehe Daniel), daher muss man das Verhalten von Eigenschaften durch die Funktionen getEigenschaft und setEigenschaft ersetzen.

            Mathias

            1. Immer wenn man ein Element zur Benutzung anspricht, kopiert man alle eigenen Funktionen in das Elementobjekt.

              ok, dein beispiel würde allerdings nur für 1x nextSibling funktionieren, oder?
              also: $('id').getNextElement(); würde funktionieren
              dies: $('id').getNextElement().getNextElement(); jedoch nicht.

              gruß, paul

              1. Hi,

                ok, dein beispiel würde allerdings nur für 1x nextSibling funktionieren, oder?
                also: $('id').getNextElement(); würde funktionieren
                dies: $('id').getNextElement().getNextElement(); jedoch nicht.

                wenn getNextElement() eine Rückgabe von $() zurück liefert schon.

                Cheatah

                --
                X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                X-Will-Answer-Email: No
                X-Please-Search-Archive-First: Absolutely Yes
                1. huhu,

                  wenn getNextElement() eine Rückgabe von $() zurück liefert schon.

                  ok, aber als Eigenschaft ist es nicht Möglich? Sollte ich am Ende der Funktion die Zuweisung gleich wieder entfernen, damit der Cache nicht zugemüllt wird?

                  gruß, paul

                  1. Hi,

                    wenn getNextElement() eine Rückgabe von $() zurück liefert schon.
                    ok, aber als Eigenschaft ist es nicht Möglich?

                    nein (effektiv).

                    Sollte ich am Ende der Funktion die Zuweisung gleich wieder entfernen, damit der Cache nicht zugemüllt wird?

                    Das kommt darauf an, ob Du die Methode pro Element öfter brauchen könntest. Möglicherweise ist es effizienzsteigernd, eher auf Existenz der Methode zu prüfen und die Zuweisung dann nicht erneut durchzuführen.

                    Cheatah

                    --
                    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
                    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
                    X-Will-Answer-Email: No
                    X-Please-Search-Archive-First: Absolutely Yes
                    1. hi,

                      nein (effektiv).

                      ok, dann werde ich versuchen das durchhangeln weitgehenst zu minimieren - vielen dank!

                      gruß, paul

        2. Hallo,

          Das Selbe gilt aber auch für andere nicht-Geckos wie z.B. Opera oder?

          laut meinen Tests kann Opera (mindestens in Version 9) Image, Option, Location, Window, Screen, History, Navigator, MimeType, Plugin, Event, ActiveXObject und Layer nicht per prototype verändern, alles andere schon. Mag sein, dass ich etwas übersehen habe; aber DOM-Objekte wie Node, Element, HTMLElement und HTMLSelectElement habe ich erfolgreich getestet.

          Ähm, ich meinte eigentlich den von dir erwähnten getter. Wenn man Eigenschaften setzen will, die sich die Daten mit einer Funktion holen, gibt es ja AFAIK keine andere Möglichkeit.

          Ich meine also Konstrukte wie:

            
          HTMLElement.prototype.nextElement getter = function(){  
           var el = this.nextSibling;  
           while (el.nodeType != 1)  
            el = el.nextSibling;  
           return el;  
          }  
          
          

          Dass man das DOM auch im Opera durch Methoden erweitern kann, weiß ich.

          mfg. Daniel

          1. Hallo,

            laut meinen Tests kann Opera (mindestens in Version 9) Image, Option, Location, Window, Screen, History, Navigator, MimeType, Plugin, Event, ActiveXObject und Layer nicht per prototype verändern, alles andere schon.

            *lol* window, history, screen, navigaror usw. prototypisch erweitern... ungemeint sinnvoll. ;)

            Mag sein, dass ich etwas übersehen habe; aber DOM-Objekte wie Node, Element, HTMLElement und HTMLSelectElement habe ich erfolgreich getestet.

            Ähm, ich meinte eigentlich den von dir erwähnten getter. Wenn man Eigenschaften setzen will, die sich die Daten mit einer Funktion holen, gibt es ja AFAIK keine andere Möglichkeit.

            Wieso diskutiert ihr eigentlich in Anschluss an eine praktische Frage nur für die Praxis irrelevante Details? ;)

            HTMLElement.prototype.nextElement getter = function(){

            Ja, kann Opera nicht. Ist aber auch egal, mit einer Funktion getNextElement bricht man sich keinen Zacken aus der Krone. Indem man Elemente dann noch durch eine Funktion jagt, die dem Element falls nötig die Methode verpasst (wie bei Prototype, jQuery und Co.), funktioniert es auch im IE.

            Mathias

            1. Hallo,

              Ähm, ich meinte eigentlich den von dir erwähnten getter. Wenn man Eigenschaften setzen will, die sich die Daten mit einer Funktion holen, gibt es ja AFAIK keine andere Möglichkeit.

              Wieso diskutiert ihr eigentlich in Anschluss an eine praktische Frage nur für die Praxis irrelevante Details? ;)

              Der OP wollte node.nextSibling durch node.next ersetzen, was ohne getter nicht möglich ist.

              Klar könnte man next auch eine Methode sein lassen…

              mfg. Daniel

              1. Klar könnte man next auch eine Methode sein lassen…

                ja, nur müsste ich dann das ganze von innen nach außen schreiben, was wirklich nicht gut zu lesen wäre.

                gruß, paul

                1. Hallo,

                  Klar könnte man next auch eine Methode sein lassen…
                  ja, nur müsste ich dann das ganze von innen nach außen schreiben, was wirklich nicht gut zu lesen wäre.

                  Wie meinst du das? Methoden sind Funktionen, die sich in einem Objekt befinden, und dieses verändern können.

                  Das sind z.B. Methoden:

                  setAttribute();  
                  appendChild();  
                  reverse();  
                  createElement()  
                  match();  
                  hasChildNodes();
                  

                  PS: Verwendest du eigentlich absichtlich falsche Zitat-Zeichen, oder liegt das am Forum? Was hast du eingestellt?

                  mfg. Daniel

            2. Hi,

              laut meinen Tests kann Opera (mindestens in Version 9) Image, Option, Location, Window, Screen, History, Navigator, MimeType, Plugin, Event, ActiveXObject und Layer nicht per prototype verändern, alles andere schon.
              *lol* window, history, screen, navigaror usw. prototypisch erweitern... ungemeint sinnvoll. ;)

              darüber kann man im Einzelfall gerne streiten ;-) aber mir[1] ging es bei meinen Tests vor allem um die Möglichkeiten.

              Wieso diskutiert ihr eigentlich in Anschluss an eine praktische Frage nur für die Praxis irrelevante Details? ;)

              Interessahalber, vermute ich.

              Ja, kann Opera nicht. Ist aber auch egal, mit einer Funktion getNextElement bricht man sich keinen Zacken aus der Krone.

              Ganz Deiner Meinung.

              Indem man Elemente dann noch durch eine Funktion jagt, die dem Element falls nötig die Methode verpasst (wie bei Prototype, jQuery und Co.), funktioniert es auch im IE.

              Das ginge ggf. auch über eine .htc-Datei unter Verwendung der proprietären behavior-Eigenschaft. Warnung vor dem bissigen Caching.

              Cheatah

              [1] Bzw. meinem Arbeitgeber.

              --
              X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
              X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
              X-Will-Answer-Email: No
              X-Please-Search-Archive-First: Absolutely Yes