Показать сообщение отдельно
  #17 (permalink)  
Старый 24.09.2011, 09:26
Аватар для poorking
prodigy
Отправить личное сообщение для poorking Посмотреть профиль Найти все сообщения от poorking
 
Регистрация: 01.11.2010
Сообщений: 503

melky, Я писал что-то похожее на то, что tenshi показал
/*!	ScriptLoader API. */
	
//	Constructor
function ScriptLoader(){
	
	var interactive = false, 
		queueStack = [];
	
	this.loadScript = function(src, onload, useQueue, specifyParentNode){
	
		var o = new function(){
			
			if(typeof src !== "string"){
				throw new TypeError("ScriptLoader: bad src " + src);
			}
			
			this.src = src;
			
			this.callback = onload || function(){};
			
			this.useQueue = !!useQueue;
			
			this.parentNode = Object(specifyParentNode).nodeType === 1 ? specifyParentNode :
				( document.body || document.getElementsByTagName("HEAD")[0] );
			
		};
		
		var script = document.createElement("SCRIPT");
			script.setAttribute("type", "text/javascript");
			script.setAttribute("src", o.src);
		
		if(!o.queue){
			script.onload = o.callback;
			o.parentNode.appendChild(script);
			return this;
		}
		
		queueStack.push([script, o.callback, o.parentNode]);
		
		if(!interactive){
			
			interactive = true;
			
			;(function load(){
				
				var place = queueStack.shift();
				
				if(place){
					
					place[0].onload = function(event){
						place[1].call(this, event);
						load();
					};
					
					place[2].appendChild(place[0]);
					
				} else{
					interactive = false;
				}
		
			}());
			
		}
		
		return this;
	}
	
}
	
//	lazyMod
ScriptLoader.prototype.multiLoad = function(multiSrc, onload, useQueue, specifyParentNode){
	
	if({}.toString.call(multiSrc) !== "[object Array]"){
		throw new TypeError("ScriptLoader#multiLoad: bad multiSrc " + multiSrc);
	}
	
	for(var i = 0, l = multiSrc.length; i < l; i ++){
		this.loadScript(multiSrc[i], i === l - 1 ? onload : null, useQueue, specifyParentNode);
	}
	
	return this;
}

ScriptLoader.prototype.load = function(src, onload, useQueue, specifyParentNode){
	if(typeof src === "string"){
		return this.loadScript(src, onload, useQueue, specifyParentNode);
	} else if({}.toString.call(src) === "[object Array]"){
		return this.multiLoad(src, onload, useQueue, specifyParentNode);
	} else{
		throw new TypeError("ScriptLoader#load: unknown src type " + src);
	}
}

//	using

var sloader = new ScriptLoader();

sloader.load("http://yandex.st/jquery/1.3.2/jquery.min.js", function(){
	
	
	alert(!!$);

});


Если использовать мультизагрузку, то колбэк вызывается при загрузке последнего скрипта, если useQueue поставить true, то скрипты загружаются по очереди. Колбэк цепляется на onload скрипта, так что если ошибиться в src, то колбэк не вызовется, также если использовать мультизагрузку с useQueue === true, то если один из скриптов не загрузится, то следующие тоже не пойдут. Иногда удобно пользоваться...
__________________
readOnly

Последний раз редактировалось poorking, 24.09.2011 в 09:38.
Ответить с цитированием