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

    AW: CommonJS Module mit Browser laden

    ... und genau deswegen darfst du in einem Modul einfach nichts asynchron laden.

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

    AW: CommonJS Module mit Browser laden

    Code:
    var require = (function(){
    	// get base-url (the url of this script)
    	var scripts = document.getElementsByTagName("script");
    	var checkRE = /(^.*?)[^\/]*require\.js(?:$|\?)/, match;
    	var base = "";
    	for (var i = 0; i < scripts.length; i++){
    		if ((match = checkRE.exec(scripts[i].src)) !== null){
    			base = match[1] + base;
    			break;
    		}
    	}
    	
    	// caching issues
    	function LoadingModule(name){
    		this.name = name;
    		this.queue = [];
    	}
    	LoadingModule.prototype = {
    		constructor: LoadingModule,
    		addOnload: function(func){
    			this.queue.push(func);
    		},
    		onload: function(exports){
    			for (var i = 0; i < this.queue.length; i++){
    				this.queue[i](exports);
    			}
    			this.queue = [];
    			delete loadingModules[this.name];
    		}
    	};
    	
    	var loadingModules = {};
    	var cache = {};
    	var useableXHRObjects = [];
    	
    	function finishRequest(module, code){
    		if (cache.hasOwnProperty(module)) return cache[module];
    		var exports = {};
    		require.eval(exports, code);
    		cache[module] = exports;
    		if (loadingModules.hasOwnProperty(module)){
    			loadingModules[module].onload(exports);
    		}
    		return exports;
    	};
    	
    	function getXHRObject(){
    		if (useableXHRObjects.length){
    			return useableXHRObjects.pop();
    		}
    		var req;
    		if (window.XMLHttpRequest){
    			req = new XMLHttpRequest();
    		}
    		else if(window.ActiveXObject){
    			var tries = ['Msxml2.XMLHTTP.7.0', 'Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP'];
    			for (var i = 0; i < tries.length; i++){
    				try{
    					req = new ActiveXObject(tries[i]);
    					break;
    				}
    				catch (e){}
    			}
    		}
    		if (!req){
    			throw new Error('Error creating request object!');
    		}
    		return req;
    	}
    	
    	// perform XHR-request
    	function doRequest(module, asynch){
    		var req = getXHRObject();
    		req.open(
    			"GET",
    			(/^\.{0,2}\//.test(module)? "": base) + module + ".js",
    			asynch
    		);
    		
    		function onRSChange(){
    			if (req.readyState == 4){
    				if (req.status != 200){
    					throw new Error("Module " + module + " not found! (HTTP status code " + req.status + ")");
    				}
    				else {
    					return finishRequest(module, req.responseText);
    				}
    				useableXHRObjects.push(req);
    			}
    		};
    		if (asynch) req.onreadystatechange = onRSChange;
    		req.send(null);
    		if (!asynch) return onRSChange.call(req);
    		return req;
    	};
    	
    	return function(module, callbackFn){
    		if (typeof callbackFn == "function" || callbackFn instanceof Function){
    			if (!(module instanceof Array)){
    				module = [module];
    			}
    			var reqFinished = 0;
    			var exportsArr = [];
    			function getOnloadFunction(i){
    				return function(exports){
    					exportsArr[i] = exports;
    					reqFinished++;
    					if (reqFinished == module.length){
    						// perform in next tic to avoid synchronity-problems
    						window.setTimeout(function(){
    							callbackFn.apply(undefined, exportsArr);
    						}, 0);
    					}
    				}
    			}
    			for (var i = 0; i < module.length; i++){
    				if (typeof module[i] != "string" && !(module[i] instanceof String)){
    					throw new Error("module parameter is not a string");
    				}
    				if (cache.hasOwnProperty(module[i])){
    					getOnloadFunction(i)(cache[module[i]]);
    					continue;
    				}
    				if (!loadingModules.hasOwnProperty(module[i])){
    					loadingModules[module[i]] = new LoadingModule(module[i]);
    					doRequest(module[i], true);
    				}
    				loadingModules[module[i]].addOnload(getOnloadFunction(i));
    			}
    			return exportsArr;
    		}
    		else {
    			if (typeof module != "string" && !(module instanceof String)){
    				throw new Error("module parameter is not a string");
    			}
    			if (cache.hasOwnProperty(module)){
    				return cache[module];
    			}
    			else {
    				return doRequest(module, false);
    			}
    		}
    	}
    })();
    
    require.eval = function(exports, code){
    	eval(code);
    }
    in der Funktion onRSChange this mit req ersetzt, weil this bei IE6 anscheinend ein anderes Object zurück gibt...

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

    AW: CommonJS Module mit Browser laden

    ... mein IE6 im IETester hat damit kein Problem ... ABER wen interessiert schon der IE6

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

    AW: CommonJS Module mit Browser laden

    mhh... komisch, weil mein ie6 auf virtualbox hatte probleme damit... aber soweit ich weiß ist da gerade mal sp1 drauf.

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

    AW: CommonJS Module mit Browser laden

    IE6 in der Virtualbox... klingt nach einer lustigen Kombination.

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

    AW: CommonJS Module mit Browser laden

    Mir hat das require als blockender Aufruf nicht gefallen und deshalb das Script grundlegend geändert:
    require.js
    Code:
    function require(module) {
        if(require.modules.hasOwnProperty(module))
            return require.modules[module];
        if(!require.moduleSrc.hasOwnProperty(module))
            throw new Error("Cannot find Module '" + module + "'");
        var exports = {};
        require.eval(exports, require.moduleSrc[module]);
        require.modules[module] = exports;
        return exports;
    }
    
    require.load = function(modules, callback) {
        
        if(!require.dependencies.dir)
            throw Error("No directory defined for dependencies");
        if(!modules || ! modules instanceof Array)
            throw new Error("No modules to load");
        if(!require.dependencies.modules)
            require.dependencies.modules = {};
        if(typeof modules == "string")
            modules = [modules];
        
        var useableXHRObjects = [];
        
        var toLoad = 0;
        var depends;
        var loading = {};
        for(var i=0; i<modules.length; i++) {
            loadModule(modules[i]);
        }
        
        function loadModule(module) {
            if(require.dependencies.modules[module]) {
                depends = require.dependencies.modules[module];
                for(var j=0; j<depends.length; j++) {
                    if(!loading.hasOwnProperty(depends[j]))
                        loadModule(depends[j]);
                    loading[depends[j]] = true;
                }
            }
            if(!loading.hasOwnProperty(module))
                loadPath(module);
            loading[module] = true;
        }
        
        function loadPath(module) {
            toLoad++;
            var path = require.dependencies.dir + "/" + module + ".js?" + Math.random(), req = getXHRObject();
            
            req.open("GET", path, true);
            req.onreadystatechange = function() {
                if(req.readyState == 4) {
                    if(req.status != 200) {
                        throw new Error("Module '" + module + "' not found! (HTTP status code " + req.status + ")");
                    }
                    else {
                        finishRequest(module, req.responseText);
                    }
                    useableXHRObjects.push(req);
                    if(--toLoad == 0) {
                        callback();
                    }
                }
            };
            
    		req.send(null);
    		return req;
        }
        
        function finishRequest(module, data) {
            require.moduleSrc[module] = data;
        }
        
        	
    	function getXHRObject(){
    		if (useableXHRObjects.length){
    			return useableXHRObjects.pop();
    		}
    		var req;
    		if (window.XMLHttpRequest){
    			req = new XMLHttpRequest();
    		}
    		else if(window.ActiveXObject){
    			var tries = ['Msxml2.XMLHTTP.7.0', 'Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'Msxml2.XMLHTTP.3.0', 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP'];
    			for (var i = 0; i < tries.length; i++){
    				try{
    					req = new ActiveXObject(tries[i]);
    					break;
    				}
    				catch (e){}
    			}
    		}
    		if (!req){
    			throw new Error('Error creating request object!');
    		}
    		return req;
    	}
        
    }
    
    require.eval = function(exports, src) {
        eval(src);
    }
    
    require.dependencies = {};
    
    require.moduleSrc = {};
    
    require.modules = {};
    dependencies.js
    Code:
    require.dependencies = {
        dir: "/path/to/modules",
        modules: {
            x: ["a", "b", "c"],
            a: ["y"]
        }
    };
    und zum Aufrufen:
    Code:
    <script type="text/javascript" src="require.js"></script>
    <script type="text/javascript" src="dependencies.js"></script>
    <script type="text/javascript">
    require.load(["x", "c"], function() {
        // hier stehen die Module x und c sowie alle Abhängigkeiten (hier a, b, c, y) zur Verfügung
        var x = require("x");
    });
    </script>

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

    AW: CommonJS Module mit Browser laden

    Wenn du jetzt aber zwei mal require("x") aufrufst, kommen zwei verschiedene Objekte zurück...

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

    AW: CommonJS Module mit Browser laden

    äh, nein.
    Code:
    if(require.modules.hasOwnProperty(module))
            return require.modules[module];
    Code:
    require.modules[module] = exports;

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

    AW: CommonJS Module mit Browser laden

    Oh - irgendwie übersehen...

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. CommonJS Module im Browser
    Von Junkee[] im Forum JavaScript
    Antworten: 5
    Letzter Beitrag: 31-01-2011, 14:51
  2. Browser nach dem Laden der Site zentrieren
    Von kuli im Forum JavaScript
    Antworten: 4
    Letzter Beitrag: 27-06-2007, 09:22
  3. Browser hört nicht auf zu laden
    Von FaFoo im Forum JavaScript
    Antworten: 2
    Letzter Beitrag: 19-11-2006, 21:13
  4. HTML-Datei in das aktuelle Browser-Fenster laden
    Von Julia im Forum JavaScript
    Antworten: 9
    Letzter Beitrag: 24-03-2005, 08:17
  5. Browser zwingen gecachte Bilder neu zu laden
    Von ObeY im Forum Allgemeines
    Antworten: 3
    Letzter Beitrag: 10-05-2004, 06:40

Lesezeichen

Berechtigungen

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