⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 io.js

📁 一个简单的AJAX图书展示平台
💻 JS
字号:
/*	Copyright (c) 2004-2006, The Dojo Foundation	All Rights Reserved.	Licensed under the Academic Free License version 2.1 or above OR the	modified BSD license. For more information on Dojo licensing, see:		http://dojotoolkit.org/community/licensing.shtml*/dojo.provide("dojo.io.IO");dojo.require("dojo.string");dojo.require("dojo.lang.extras");/****************************************************************************** *	Notes about dojo.io design: *	 *	The dojo.io.* package has the unenviable task of making a lot of different *	types of I/O feel natural, despite a universal lack of good (or even *	reasonable!) I/O capability in the host environment. So lets pin this down *	a little bit further. * *	Rhino: *		perhaps the best situation anywhere. Access to Java classes allows you *		to do anything one might want in terms of I/O, both synchronously and *		async. Can open TCP sockets and perform low-latency client/server *		interactions. HTTP transport is available through Java HTTP client and *		server classes. Wish it were always this easy. * *	xpcshell: *		XPCOM for I/O. A cluster-fuck to be sure. * *	spidermonkey: *		S.O.L. * *	Browsers: *		Browsers generally do not provide any useable filesystem access. We are *		therefore limited to HTTP for moving information to and from Dojo *		instances living in a browser. * *		XMLHTTP: *			Sync or async, allows reading of arbitrary text files (including *			JS, which can then be eval()'d), writing requires server *			cooperation and is limited to HTTP mechanisms (POST and GET). * *		<iframe> hacks: *			iframe document hacks allow browsers to communicate asynchronously *			with a server via HTTP POST and GET operations. With significant *			effort and server cooperation, low-latency data transit between *			client and server can be acheived via iframe mechanisms (repubsub). * *		SVG: *			Adobe's SVG viewer implements helpful primitives for XML-based *			requests, but receipt of arbitrary text data seems unlikely w/o *			<![CDATA[]]> sections. * * *	A discussion between Dylan, Mark, Tom, and Alex helped to lay down a lot *	the IO API interface. A transcript of it can be found at: *		http://dojotoolkit.org/viewcvs/viewcvs.py/documents/irc/irc_io_api_log.txt?rev=307&view=auto *	 *	Also referenced in the design of the API was the DOM 3 L&S spec: *		http://www.w3.org/TR/2004/REC-DOM-Level-3-LS-20040407/load-save.html ******************************************************************************/// a map of the available transport options. Transports should add themselves// by calling add(name)dojo.io.transports = [];dojo.io.hdlrFuncNames = [ "load", "error", "timeout" ]; // we're omitting a progress() event for nowdojo.io.Request = function(url, mimetype, transport, changeUrl){	if((arguments.length == 1)&&(arguments[0].constructor == Object)){		this.fromKwArgs(arguments[0]);	}else{		this.url = url;		if(mimetype){ this.mimetype = mimetype; }		if(transport){ this.transport = transport; }		if(arguments.length >= 4){ this.changeUrl = changeUrl; }	}}dojo.lang.extend(dojo.io.Request, {	/** The URL to hit */	url: "",		/** The mime type used to interrpret the response body */	mimetype: "text/plain",		/** The HTTP method to use */	method: "GET",		/** An Object containing key-value pairs to be included with the request */	content: undefined, // Object		/** The transport medium to use */	transport: undefined, // String		/** If defined the URL of the page is physically changed */	changeUrl: undefined, // String		/** A form node to use in the request */	formNode: undefined, // HTMLFormElement		/** Whether the request should be made synchronously */	sync: false,		bindSuccess: false,	/** Cache/look for the request in the cache before attempting to request?	 *  NOTE: this isn't a browser cache, this is internal and would only cache in-page	 */	useCache: false,	/** Prevent the browser from caching this by adding a query string argument to the URL */	preventCache: false,		// events stuff	load: function(type, data, evt){ },	error: function(type, error){ },	timeout: function(type){ },	handle: function(){ },	//FIXME: change BrowserIO.js to use timeouts? IframeIO?	// The number of seconds to wait until firing a timeout callback.	// If it is zero, that means, don't do a timeout check.	timeoutSeconds: 0,		// the abort method needs to be filled in by the transport that accepts the	// bind() request	abort: function(){ },		// backButton: function(){ },	// forwardButton: function(){ },	fromKwArgs: function(kwArgs){		// normalize args		if(kwArgs["url"]){ kwArgs.url = kwArgs.url.toString(); }		if(kwArgs["formNode"]) { kwArgs.formNode = dojo.byId(kwArgs.formNode); }		if(!kwArgs["method"] && kwArgs["formNode"] && kwArgs["formNode"].method) {			kwArgs.method = kwArgs["formNode"].method;		}				// backwards compatibility		if(!kwArgs["handle"] && kwArgs["handler"]){ kwArgs.handle = kwArgs.handler; }		if(!kwArgs["load"] && kwArgs["loaded"]){ kwArgs.load = kwArgs.loaded; }		if(!kwArgs["changeUrl"] && kwArgs["changeURL"]) { kwArgs.changeUrl = kwArgs.changeURL; }		// encoding fun!		kwArgs.encoding = dojo.lang.firstValued(kwArgs["encoding"], djConfig["bindEncoding"], "");		kwArgs.sendTransport = dojo.lang.firstValued(kwArgs["sendTransport"], djConfig["ioSendTransport"], false);		var isFunction = dojo.lang.isFunction;		for(var x=0; x<dojo.io.hdlrFuncNames.length; x++){			var fn = dojo.io.hdlrFuncNames[x];			if(isFunction(kwArgs[fn])){ continue; }			if(isFunction(kwArgs["handle"])){				kwArgs[fn] = kwArgs.handle;			}			// handler is aliased above, shouldn't need this check			/* else if(dojo.lang.isObject(kwArgs.handler)){				if(isFunction(kwArgs.handler[fn])){					kwArgs[fn] = kwArgs.handler[fn]||kwArgs.handler["handle"]||function(){};				}			}*/		}		dojo.lang.mixin(this, kwArgs);	}});dojo.io.Error = function(msg, type, num){	this.message = msg;	this.type =  type || "unknown"; // must be one of "io", "parse", "unknown"	this.number = num || 0; // per-substrate error number, not normalized}dojo.io.transports.addTransport = function(name){	this.push(name);	// FIXME: do we need to handle things that aren't direct children of the	// dojo.io namespace? (say, dojo.io.foo.fooTransport?)	this[name] = dojo.io[name];}// binding interface, the various implementations register their capabilities// and the bind() method dispatchesdojo.io.bind = function(request){	// if the request asks for a particular implementation, use it	if(!(request instanceof dojo.io.Request)){		try{			request = new dojo.io.Request(request);		}catch(e){ dojo.debug(e); }	}	var tsName = "";	if(request["transport"]){		tsName = request["transport"];		// FIXME: it would be good to call the error handler, although we'd		// need to use setTimeout or similar to accomplish this and we can't		// garuntee that this facility is available.		if(!this[tsName]){ return request; }	}else{		// otherwise we do our best to auto-detect what available transports		// will handle 		for(var x=0; x<dojo.io.transports.length; x++){			var tmp = dojo.io.transports[x];			if((this[tmp])&&(this[tmp].canHandle(request))){				tsName = tmp;			}		}		if(tsName == ""){ return request; }	}	this[tsName].bind(request);	request.bindSuccess = true;	return request;}dojo.io.queueBind = function(request){	if(!(request instanceof dojo.io.Request)){		try{			request = new dojo.io.Request(request);		}catch(e){ dojo.debug(e); }	}	// make sure we get called if/when we get a response	var oldLoad = request.load;	request.load = function(){		dojo.io._queueBindInFlight = false;		var ret = oldLoad.apply(this, arguments);		dojo.io._dispatchNextQueueBind();		return ret;	}	var oldErr = request.error;	request.error = function(){		dojo.io._queueBindInFlight = false;		var ret = oldErr.apply(this, arguments);		dojo.io._dispatchNextQueueBind();		return ret;	}	dojo.io._bindQueue.push(request);	dojo.io._dispatchNextQueueBind();	return request;}dojo.io._dispatchNextQueueBind = function(){	if(!dojo.io._queueBindInFlight){		dojo.io._queueBindInFlight = true;		if(dojo.io._bindQueue.length > 0){			dojo.io.bind(dojo.io._bindQueue.shift());		}else{			dojo.io._queueBindInFlight = false;		}	}}dojo.io._bindQueue = [];dojo.io._queueBindInFlight = false;dojo.io.argsFromMap = function(map, encoding, last){	var enc = /utf/i.test(encoding||"") ? encodeURIComponent : dojo.string.encodeAscii;	var mapped = [];	var control = new Object();	for(var name in map){		var domap = function(elt){			var val = enc(name)+"="+enc(elt);			mapped[(last == name) ? "push" : "unshift"](val);		}		if(!control[name]){			var value = map[name];			// FIXME: should be isArrayLike?			if (dojo.lang.isArray(value)){				dojo.lang.forEach(value, domap);			}else{				domap(value);			}		}	}	return mapped.join("&");}dojo.io.setIFrameSrc = function(iframe, src, replace){	try{		var r = dojo.render.html;		// dojo.debug(iframe);		if(!replace){			if(r.safari){				iframe.location = src;			}else{				frames[iframe.name].location = src;			}		}else{			// Fun with DOM 0 incompatibilities!			var idoc;			if(r.ie){				idoc = iframe.contentWindow.document;			}else if(r.safari){				idoc = iframe.document;			}else{ //  if(r.moz){				idoc = iframe.contentWindow;			}			//For Safari (at least 2.0.3) and Opera, if the iframe			//has just been created but it doesn't have content			//yet, then iframe.document may be null. In that case,			//use iframe.location and return.			if(!idoc){				iframe.location = src;				return;			}else{				idoc.location.replace(src);			}		}	}catch(e){ 		dojo.debug(e); 		dojo.debug("setIFrameSrc: "+e); 	}}/*dojo.io.sampleTranport = new function(){	this.canHandle = function(kwArgs){		// canHandle just tells dojo.io.bind() if this is a good transport to		// use for the particular type of request.		if(				(				(kwArgs["mimetype"] == "text/plain") ||				(kwArgs["mimetype"] == "text/html") ||				(kwArgs["mimetype"] == "text/javascript")			)&&(				(kwArgs["method"] == "get") ||				( (kwArgs["method"] == "post") && (!kwArgs["formNode"]) )			)		){			return true;		}		return false;	}	this.bind = function(kwArgs){		var hdlrObj = {};		// set up a handler object		for(var x=0; x<dojo.io.hdlrFuncNames.length; x++){			var fn = dojo.io.hdlrFuncNames[x];			if(typeof kwArgs.handler == "object"){				if(typeof kwArgs.handler[fn] == "function"){					hdlrObj[fn] = kwArgs.handler[fn]||kwArgs.handler["handle"];				}			}else if(typeof kwArgs[fn] == "function"){				hdlrObj[fn] = kwArgs[fn];			}else{				hdlrObj[fn] = kwArgs["handle"]||function(){};			}		}		// build a handler function that calls back to the handler obj		var hdlrFunc = function(evt){			if(evt.type == "onload"){				hdlrObj.load("load", evt.data, evt);			}else if(evt.type == "onerr"){				var errObj = new dojo.io.Error("sampleTransport Error: "+evt.msg);				hdlrObj.error("error", errObj);			}		}		// the sample transport would attach the hdlrFunc() when sending the		// request down the pipe at this point		var tgtURL = kwArgs.url+"?"+dojo.io.argsFromMap(kwArgs.content);		// sampleTransport.sendRequest(tgtURL, hdlrFunc);	}	dojo.io.transports.addTransport("sampleTranport");}*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -