tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
342
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von einfach nur crack
    einfach nur crack einfach nur crack ist offline mag Cookies & Kekse
    tutorials.de Premium-User
    Registriert seit
    May 2007
    Ort
    Dresden (Sachsen)
    Beiträge
    1.960
    Hallo Tutorianer,

    seit langer Zeit habe ich mal wieder ein Problem, was ich anscheinend nicht selber lösen kann. Allerdings beschäftige ich mich erstmals mit der Prototypen-Architektur von Javascript und bin dabei auf ein Problem gestoßen: wenn ich nun beispielsweise einen Prototypen für das HTMLElement erstelle um somit dann auf dieses bestimmte eigene Methoden anwenden zu können. Dabei würde ich gerne auf die Methoden des eigentlichen HTML-Elements zugreifen können. Leider weiß ich nicht ganz wie.
    Code Javascript:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    HTMLElement.prototype.model = {
      set data(value) {
        this._data = value;
      },
      
      add: function (element) {
        this._elements = element;
      },
     
      getContent: function () {
        return this.innerHTML; // Verweis auf HTMLElement?
      }
    };
    Als Beispiel habe ich jetzt mal die Methode getContent() eingefügt. Wie kann ich jetzt auf das entsprechende Objekt zugreifen?
     
    Ich mag:
    • positive Bewertungen meiner Beiträge
    • ein Danke für meine hilfreichen Beiträge

    Dabei kann ich dir helfen: PHP --- Javascript --- Ruby --- Coffeescript --- CSS --- HTML --- Webtechnologien --- Shell --- UNIX

    ... noch was: falls du mit dem Thema hier fertig bist, dann kannst du es auch als erledigt markieren.

  2. #2
    wollmaus wollmaus ist offline Mitglied Gold
    Registriert seit
    Sep 2010
    Beiträge
    115
    Garnicht

    Die Funktionen innerhalb von model haben keine Ahnung von dem HTMLElement, this wird darin immer auf model verweisen.

    Was ginge wäre dies:
    Code :
    1
    
    HTMLElement.prototype.getContent=function(){return this.innerHTML;}

    aber bevor du dich darin zu sehr vertiefst, lies besser erstmal dies: http://perfectionkills.com/whats-wro...nding-the-dom/
    Geändert von wollmaus (12.11.11 um 05:07 Uhr)
     

  3. #3
    Avatar von einfach nur crack
    einfach nur crack einfach nur crack ist offline mag Cookies & Kekse
    tutorials.de Premium-User
    Registriert seit
    May 2007
    Ort
    Dresden (Sachsen)
    Beiträge
    1.960
    Das mit dem Garnicht glaube ich nicht. Aber zu deinem Einwand, dass ich mich nicht zu sehr darin vertiefen sollte, da es generell eine schlechte Idee ist das DOM zu erweitern: Beim dem, was ich vor habe, wäre es viel zu aufwendig ein eigenes Framework zu schreiben. Außerdem werden darin Funktionen verwendet, die so oder so erst mit HTML5 erscheinen, womit IE < 8 und Safari 2.x und ähnliches so oder so weg sind.

    Was ich allerdings interessant fand, war das hier, wo es anscheinend doch möglich ist auf die Werte des Kindes zurück zu greifen:
    Code Javascript:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    Element.prototype.hide = function() {
        this.style.display = 'none';
    };
    ...
    var element = document.createElement('p');
     
    element.style.display; // ''
    element.hide();
    element.style.display; // 'none'
     
    Ich mag:
    • positive Bewertungen meiner Beiträge
    • ein Danke für meine hilfreichen Beiträge

    Dabei kann ich dir helfen: PHP --- Javascript --- Ruby --- Coffeescript --- CSS --- HTML --- Webtechnologien --- Shell --- UNIX

    ... noch was: falls du mit dem Thema hier fertig bist, dann kannst du es auch als erledigt markieren.

  4. #4
    CPoly CPoly ist gerade online Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Zitat Zitat von einfach nur crack Beitrag anzeigen
    Was ich allerdings interessant fand, war das hier, wo es anscheinend doch möglich ist auf die Werte des Kindes zurück zu greifen:
    Du versuchst aber nicht auf das Kind zuzugreifen, sondern du müsstest erst mal eine Ebene höher, was unmöglich ist. Dein "model" ist ein komplett eigenständiges Objekt. Dieses weiß nichts davon, dass ein anderen Objekt darauf eine Referenz hat.

    Und das was du da interessant fandes, ist doch genau das, was wollmaus gesagt hat (siehe code!).
     

  5. #5
    wollmaus wollmaus ist offline Mitglied Gold
    Registriert seit
    Sep 2010
    Beiträge
    115
    Das mit dem hide() da ist dasselbe wie in meiner Antwort, wie CPoly schon sagte:
    Code :
    1
    
    HTMLElement.prototype.getContent=function(){/**/}

    In deinem Eingangsposting jedoch sieht es so aus:
    Code :
    1
    
    HTMLElement.prototype.model.getContent=function(){/**/}
    Damit erweiterst du nicht den prototype von HTMLElement um eine Funktion getContent, sondern weist dem prototype von HTMLElement einen member "model" zu. Der Konstruktor von model ist [Object] und nicht [HTMLElement], daher kein Zugriff auf das Element.


    Was theoretisch ginge wäre die Nutzung von __defineGetter__

    Beispiel: (Erweiterung um Methode swapNode(), welche momentan nur der IE kennt)
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    HTMLElement.prototype.__defineGetter__("model", function() { return this });
    HTMLElement.prototype.model.swapNode=function(e)
    {
      if(this.hasOwnProperty('swapNode') && typeof this.swapNode=='function')
      {
         return this.swapNode(e);                                         
      }
      else
      {
        var tmp=document.createTextNode('');
            e.parentNode.insertBefore(tmp,e);
            this.parentNode.insertBefore(e,this);
            tmp.parentNode.insertBefore(this,tmp);
            tmp.parentNode.removeChild(tmp);
            return this;
      }
      
    };
    Wermutstropfen dabei: IE unterstützt __defineGetter__ bisher noch nicht

    Demo: http://jsfiddle.net/dM4qR/ (Sollte in aktuellen FF und Chrome laufen)
    Geändert von wollmaus (12.11.11 um 14:21 Uhr)
     

  6. #6
    Avatar von einfach nur crack
    einfach nur crack einfach nur crack ist offline mag Cookies & Kekse
    tutorials.de Premium-User
    Registriert seit
    May 2007
    Ort
    Dresden (Sachsen)
    Beiträge
    1.960
    Ich danke euch beiden erstmal, da eure Ansätze mir genug Stoff für eigene Inspiration geliefert haben. Dabei habe ich übrigens herausgefunden, dass die Methoden __defineGetter__ und __defineSetter__ in der neusten Version von Javascript als veraltet gelten. Sie wird demnächst durch die Methode Object.defineProperty ersetzt, welche auch vom Internet Explorer 8 unterstützt wird. Diese Methode bietet wesentlich mehr Möglichkeiten, womit eigene Methoden annähernd gleichzusetzen sind mit denen aus dem nativen Javascript-Code.

    Hier aber auch noch das Ergebnis, zu welchem ich gekommen bin (ich verwende erstmal nur __defineGetter__, da das für mich ausreichend ist und von Chrome auch unterstützt wird):
    Code Javascript:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
    HTMLElement.prototype.__defineGetter__("model", function () {
      if(this.__model__ == undefined) {
        this.__model__ = new Model(this);
      }
      
      return this.__model__;
    });
     
    function Model(obj) {
      this._element = obj;
    }
     
    Model.prototype = {
      set data(values) {
        this._data = values;
      },
      
      add: function (element) {
        
      },
      
      output: function() {
        var output = "";
        for(var line in this._data) {
          output = output + " | " + (typeof line);
        }
        
        console.log(output);
      }
    }
     
    document.getElementById("example").model.data = [1, 2, 3, 4];
    document.getElementById("example").model.output();
    Es soll aber anscheinend auch noch eine Möglichkeit geben, die ich allerdings im Chrome nicht zum Laufen bekommen habe:
    Code Javascript:
    1
    2
    3
    4
    5
    6
    7
    8
    
    HTMLElement.prototype = {
      get model() {
        if(this.__model__ == undefined) {
          this.__model__ = new Model(this);
        }
        return this.__model__;
      }
    }
     
    Ich mag:
    • positive Bewertungen meiner Beiträge
    • ein Danke für meine hilfreichen Beiträge

    Dabei kann ich dir helfen: PHP --- Javascript --- Ruby --- Coffeescript --- CSS --- HTML --- Webtechnologien --- Shell --- UNIX

    ... noch was: falls du mit dem Thema hier fertig bist, dann kannst du es auch als erledigt markieren.

Ähnliche Themen

  1. Auf Objekt zugreifen
    Von RedShot im Forum PHP
    Antworten: 2
    Letzter Beitrag: 24.09.11, 14:34
  2. in Outlook.ItemEvents_10_Event auf MailItem-Objekt zugreifen
    Von StehtimSchilf im Forum .NET Application und Service Design
    Antworten: 1
    Letzter Beitrag: 26.09.10, 17:35
  3. Struts2: von JSP auf eine Objekt-Liste zugreifen
    Von Flo[H] im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 0
    Letzter Beitrag: 09.12.08, 14:07
  4. auf ein TList Objekt zugreifen
    Von sw1987 im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 16.08.07, 15:41
  5. Per void Methode auf Objekt einer Klasse zugreifen
    Von mkoeni1 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 1
    Letzter Beitrag: 09.04.06, 16:41

Stichworte