【笔记】 《js权威指南》- 第18章 脚本化HTTP - 18.2 JSONP - 18.3 Comet推

1.JSONP跨域请求:

function getJSONP(url, callBack) {
	var cbnum = "cb" + getJSONP.counter++;
	var cbname = "getJSONP." + cbnum;
	
	if (url.indexOf("?") === -1)
		url += "?jsonp=" + cbnamme;
	else
		url += "&jsonp=" + cbname;
	
	var script = document.createElement("script");
	
	getJSONP[cbnum] = function(response) {
		try {
			callback(response);
		}
		finally {
			delete getJONP[cbnum];
			script.parentNode.removeChild[script];
		}
	};
	
	script.src = url;
	document.body.appendChild(script);
}

getJSONP.counter = 0;

 

2.Comet推:

var ticker = new EventSource("stockprices.php");
ticker.onmessage = function(e) {
	var type = e.type;
	var data = e.data;
};


兼容实现:

if (window.EventSource === undefined) {
	window.EventSource = function(url) {
		var xhr;
		var evtsrc = this;
		var charsReceived = 0;
		var type = null;
		var data = "";
		var eventName = "message";
		var lastEventId = "";
		var retrydelay = 1000;
		var aborted = false;
		
		xhr = new XMLHttpRequest();
		xhr.onreadystatechange = function() {
			switch(xhr.readyState) {
				case 3: processData(); break;
				case 4: reconnect(); break;
			}
		};
		
		connect();
		
		function reconnect() {
			if (aborted) return;
			if (xhr.status >= 300) return;
			setTimeout(connect, retrydelay);
		};
		
		function connect() {
			charsReceived = 0;
			type = null;
			xhr.open("GET", url);
			xhr.setRequestHeader("Cache-Control", "no-cache");
			if (lastEventId) xhr.setRequestHeader("Last-Event-ID", lastEventId);
			xhr.send();
		};
		
		function processData() {
			if (!type) {
				type = xhr.getResponseHeader("Content-Type");
				if (type !== "text/event-stream") {
					aborted = true;
					xhr.abort();
					return;
				}
			}
			
			var chunk = xhr.responseText.substring(charsReceived);
			charsReceived = xhr.responseText.length;
			var lines = chunk.replace(/(\r\n|\r|\n)$/, "").split(/\r\n|\r|\n/);
			for (var i = 0; i < lines.lenght; i++) {
				var line = lines[i], pos = line.indexOf(":"), name, value="";
				if (pos == 0) continue;
				if (pos > 0) {
					name = line.substring(0, pos);
					value = line.substring(pos+1);
					if (value.charAt(0) == " ") value = value.substring(1);
				}
				else name = line;
				
				switch(name) {
					case "event": eventName = value; break;
					case "data": data += value + "\n"; break;
					case "id": lastEventId = value; break;
					case "retry": retrydelay = parseInt(value) || 1000; break;
					default: break;
				}
				
				//空行发送
				if (line === "") {
					if (evtsrc.onmessage && data !== "") {
						if (data.charAt(data.length - 1) == "\n")
							data = data.substring(0, data.length - 1);
						evtsrc.onmessage({type: eventName, data: data, origin: url});
					}
					data = "";
					continue;
				}
			}
		};
	};
}


   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值