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

    AW: Element.prototype in IE<8

    Danke! Ist mir gar nicht aufgefallen...
    Mit einem Wrapper für document.createElement lässt sich das Problem lösen:
    Code:
    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;
    	
    	// 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 
    		// just not to create an error
    		window[name] = function(){};
    		return false;
    	}
    	selector = selector.split(/\s*,\s*/);
    	for (var i = 0; i < selector.length; i++){
    		style.addRule(selector[i], "behavior: url(" + load_url + "init.htc);");
    		rule.push(style.rules[style.rules.length - 1]);
    	}
    	
    	var properties = [];
    	wrapper.onpropertychange = function(){
    		properties.push({
    			name: window.event.propertyName,
    			content: this[window.event.propertyName]
    		});
    		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);
    	
    	var createElement = document.createElement;
    	document.createElement = function(tag){
    		var node = createElement(arguments);
    		for (var i = 0; i < properties.length; i++){
    			node[properties[i].name] = properties[i].content;
    		}
    		return node;
    	};
    	
    	window[name] = function(){};
    	window[name].prototype = wrapper;
    	return window[name];
    }
    PS: die init.htc hatte ich ganz zu erwähnen vergessen:
    Code:
    <PUBLIC:COMPONENT>
    	<SCRIPT LANGUAGE="JScript" type="text/javascript">
    	</SCRIPT>
    </PUBLIC:COMPONENT>
    - wird benötigt, um das behavior zu initialisieren.
    Geändert von kkapsner (07-01-2011 um 23:19 Uhr)

  2. #17
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.702

    AW: Element.prototype in IE<8

    Hab' jetzt nach langer Zeit mal wieder an dem Thema gearbeitet und einen neuen Ansatz angewendet: expressions
    Vorteil: keine serverseitige Sprache nötig und kürzere Ladezeit (die .htc-Dateien wurden teilweise für jedes Element neu geladen - fragt mich nicht wieso)
    Nachteil: expressions werden immer mal wieder ausgewertet und damit haben wir erstens ein Performanceproblem und außerdem kann man dann mir gezielter Überschreibung von Funktionen Probleme bekommen.

    Hier mal der Code - freigegeben für Kritik:
    Code:
    createNodePrototype = 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;
    	
    	// check if it exists already
    	if (window[name]) return window[name];
    	var wrapper, style = document.createStyleSheet();
    	if (document.createComment){
    		wrapper = document.createComment("wrapper for " + name + ".prototype");
    	}
    	else {
    		// I do NOT support IE5.5 
    		// just not to create an error
    		window[name] = function(){};
    		return false;
    	}
    	selector = selector.split(/\s*,\s*/);
    	
    	var properties = [];
    	wrapper.onpropertychange = function(){
    		var propertyName = window.event.propertyName;
    		properties.push({
    			name: propertyName,
    			content: this[window.event.propertyName]
    		});
    		
    		for (var i = 0; i < selector.length; i++){
    			style.addRule(
    				selector[i],
    				"zoom: expression(createNodePrototype.addProperties(this, false));"
    			);
    		}
    	};
    	
    	var addProperties = createNodePrototype.addProperties;
    	createNodePrototype.addProperties = function(node, setZoom){
    		if (addProperties) addProperties(node, setZoom);
    		if (name == "Element" || tag.toLowerCase() == selector.toLowerCase()){
    			wrapper._IEinitProperties(node, setZoom);
    		}
    	}
    	wrapper._IEinitProperties = function(node, setZoom){
    		for (var i = 0; i < properties.length; i++){
    			node[properties[i].name] = properties[i].content;
    		}
    		if (setZoom) node.style.zoom = 1;
    	}
    	document.getElementsByTagName("head")[0].appendChild(wrapper);
    	
    	var createElement = document.createElement;
    	document.createElement = function(tag){
    		var node = createElement.apply(document, arguments);
    		if (name == "Element" || tag.toLowerCase() == selector.toLowerCase()){
    			wrapper._IEinitProperties(node);
    		}
    		return node;
    	};
    	
    	window[name] = function(){};
    	window[name].prototype = wrapper;
    	return window[name];
    }

Seite 2 von 2 ErsteErste 12

Lesezeichen

Berechtigungen

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