Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 17
  1. #1
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.698

    Element.prototype in IE<8

    Hi Leute!

    Da ich meine Testseite für das Problem des fehlenden window.Element in IE<8 schon in einem anderen Thread (http://forum.jswelt.de/javascript/50...tml#post315904 (JS-Dateien laden in index.html mit scr=Variable) - Testseite: http://kkjs.kkapsner.de/tests/Element.prototype.html) gepostet habe wollte ich jetzt doch mal einen extra Thread dazu aufmachen und euch fragen, was ihr prinzipiell von der Technik haltet (also ich finde sie natürlich super )

    Also erst einmal der Basiscode:
    Code:
    var load_url = "/"; //the url to the directory where the PHP-file lies
    function createNodePrototype(name, selector){
    	if (!name){
    		name = "Element";
    		selector = "html, body, body *, head, head title, head base, head isindex, head link, head meta, head object, head object *, head style, head script";
    	}
    	if (!selector) selector = name.toLowerCase();
    	
    	// check if it exists already
    	if (window[name]) return window[name];
    	var wrapper, style = document.createStyleSheet(),
    		rule = [];
    	if (document.createComment){
    		wrapper = document.createComment("wrapper for " + name + ".prototype");
    	}
    	else {
    		// I do NOT support IE5.5 
    		return false;
    	}
    	selector = selector.split(/\s*,\s*/);
    	for (var i = 0; i < selector.length; i++){
    		style.addRule(selector[i], "behavior: url(" + kkjs.url.load + "init.htc);");
    		rule.push(style.rules[style.rules.length - 1]);
    	}
    	
    	wrapper.onpropertychange = function(){
    		var url = load_url + "Element.prototype.php?nodeName=" + name + "&func=" + window.event.propertyName + "&rand=" + (new Date().getTime());
    		for (var i = 0; i < rule.length; i++){
    			rule[i].style.behavior += " url(" + url + ")";
    		}
    	};
    	document.getElementsByTagName("head")[0].appendChild(wrapper);
    	
    	window[name] = function(){};
    	window[name].prototype = wrapper;
    	return window[name];
    };
    
    createNodePrototype();
    und hier noch die Element.prototype.php:
    PHP-Code:
    <?php header("Content-type: text/x-component");?><PUBLIC:COMPONENT>
        <PUBLIC:METHOD NAME="<?php echo $_GET['func'];?>" INTERNALNAME="_<?php echo $_GET['func'];?>"/>
        <SCRIPT LANGUAGE="JScript" type="text/javascript">
            if (element != window.<?php echo $_GET['nodeName'];?>.prototype){
                _<?php echo $_GET['func'];?> = function(){ return window.<?php echo $_GET['nodeName'];?>.prototype.<?php echo $_GET['func'];?>.apply(this, arguments);};
            }
        </SCRIPT>
    </PUBLIC:COMPONENT>
    Kommentare und Fragen erwünscht.

    EDIT: Hab' gerade noch einen Fehler entdeckt - werd' ich gleich ausbessern! EDIT2: behoben.
    Geändert von kkapsner (19-02-2010 um 14:30 Uhr) Grund: Fehler behoben

  2. #2
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Element.prototype in IE<8

    Ich hab das jetzt nicht im Detail verfolgt, aber kann es sein, dass du sowas suchst: SELFHTML Forum: (JAVASCRIPT) HTML-Elementobjekte um Methoden/Eigenschaften erweitern

  3. #3
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.698

    AW: Element.prototype in IE<8

    Nicht ganz (v.A. abgesehen von
    Funktioniert in allen aktuellen Browsern (Firefox 3.6, Safari 4, IE 8, Chrome 4, Opera 10.10)
    - im iE7 funktioniert's nicht).

    Ich dachte eher an Zuweisungen à la:
    Code:
    Element.prototype.toWhat = function(){
    	alert("what");
    }
    - ohne spezielle Syntax.

  4. #4
    Avatar von Junkee[]
    Junkee[] ist offline Lounge-Member
    registriert
    08-05-2009
    Ort
    Leonberg
    Beiträge
    3.169

    AW: Element.prototype in IE<8

    kannst du biite erklären, was die php datei macht, was des ist bzw. was für eine Wirkung es hat,

  5. #5
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.698

    AW: Element.prototype in IE<8

    Die PHP-Datei erzeugt die richtige .htc-Datei (Stichwort behaviour) damit die Funktion auch bei den Elementen registriert wrid.

  6. #6
    Avatar von Junkee[]
    Junkee[] ist offline Lounge-Member
    registriert
    08-05-2009
    Ort
    Leonberg
    Beiträge
    3.169

    AW: Element.prototype in IE<8

    okay, habs verstanden. Ich finde es ein guten Weg und eine Alternative zu sowas:
    Code:
    if(!window.Element) {
    	window.Element = function() { };
    	window.Element.prototype._isIe = true;
    }
    
    var $ = function(id) {
      var element = document.getElementById(id) || id;
      if(Element.prototype._isIe) {
        for(var k in Element.prototype)
    		if(!element[k]) element[k] = Element.prototype[k];
      }
      return element;
    }
    	
    Element.prototype.doSomething = function() {
    	alert(this.tagName);
    };
    der Nachteil ist aber, dass eine serverseitige Programmiersprache nötig ist.

  7. #7
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.698

    AW: Element.prototype in IE<8

    Die mit dem $ ist ja ganz nett, aber dann kannst du Elemente nur noch darüber aufrufen (z.B. musst du bei einer einfachen Schleife über .childNodes jedes Element durch $ jagen, damit du auf deine Funktionen zurücjgreifen kannst).
    Der Nachteil ist wohl eher marginal, da PHP auf den meisten Servern zur Verfügung steht - aber mein Ansatz über die behaviours ist anders nicht zu lösen.

    PS: Ich muss noch mal sehen, ob es noch eine gute Lösung für sowas gibt:
    Code:
    Element.prototype.obj = {
         test: 4,
         was: "hallo",
         func: function(){}
    }
    - das bis jetzt ist ja nur für Funktionen.

  8. #8
    Avatar von Junkee[]
    Junkee[] ist offline Lounge-Member
    registriert
    08-05-2009
    Ort
    Leonberg
    Beiträge
    3.169

    AW: Element.prototype in IE<8

    Die mit dem $ ist ja ganz nett, aber dann kannst du Elemente nur noch darüber aufrufen (z.B. musst du bei einer einfachen Schleife über .childNodes jedes Element durch $ jagen, damit du auf deine Funktionen zurücjgreifen kannst).
    wird aber von fast allen js frameworks so ähnlich gahandhabt.

  9. #9
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.698

    AW: Element.prototype in IE<8

    Zitat Zitat von Junkee[] Beitrag anzeigen
    wird aber von fast allen js frameworks so ähnlich gahandhabt.
    Was alle tun muss ja noch nicht das Optimum sein

  10. #10
    Avatar von Junkee[]
    Junkee[] ist offline Lounge-Member
    registriert
    08-05-2009
    Ort
    Leonberg
    Beiträge
    3.169

    AW: Element.prototype in IE<8

    Zitat Zitat von kkapsner Beitrag anzeigen
    Was alle tun muss ja noch nicht das Optimum sein
    natürlich. Die wollen ja sowieso auf serverseitige anpassungen verzichten.

    PS: für alle die keine schimmer haben was htc-komponenten sind: http://www.html-world.de/program/dhb_1.php

    PPS:
    Ich muss noch mal sehen, ob es noch eine gute Lösung für sowas gibt:
    das Funktioniert bei beinem script schon

  11. #11
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.698

    AW: Element.prototype in IE<8

    Nein. Schau' dir die .htc noch mal genauer an.

  12. #12
    Avatar von Junkee[]
    Junkee[] ist offline Lounge-Member
    registriert
    08-05-2009
    Ort
    Leonberg
    Beiträge
    3.169

    AW: Element.prototype in IE<8

    oh man... das sollte meinem und nicht deinen sein. Ein Buchstabe. =(

  13. #13
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.698

    AW: Element.prototype in IE<8

    Aber ich sagte: "gute Lösung"

  14. #14
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.698

    AW: Element.prototype in IE<8

    Und du kannst damit auch keine bestehenden Funktionen überschreiben.

  15. #15
    Avatar von Junkee[]
    Junkee[] ist offline Lounge-Member
    registriert
    08-05-2009
    Ort
    Leonberg
    Beiträge
    3.169

    AW: Element.prototype in IE<8

    Ich benutze dein Script gerade und dabei sind mit 2 bugs aufgefallen.
    1. Elemente die nicht im DOM verankert sind besitzen die Methoden nicht.
    Code:
    Element.prototype.test = function() {
        alert(this);
    };
    window.onload = function() {
        var x = document.createElement("div");
        x.test();
    };
    2. Wenn man ein Element erzeugt, und dieses per appendChild in das DOM einhängt sind die Methoden noch nicht zur Verfügung. Erst beim nächstem Tick (setTimeout(.., 0); ) sind die Methoden erreichbar.
    Code:
    // fehler
    window.onload = function() {
        var x = document.createElement("div");
        document.body.appendChild(x);
        x.test();
    };
    Code:
    // kein fehler
    window.onload = function() {
        var x = document.createElement("div");
        document.body.appendChild(x);
        window.setTimeout(function() {
          x.test();
        }, 0);
    };

Seite 1 von 2 12 LetzteLetzte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •