以下将动态创建脚本标记并在完成给定的呼叫后删除它们(以及它所需的全局)。
您也可以使用CORS来允许除GET之外的请求,尽管您可能已经知道这在旧版浏览器中不受支持。
为了避免竞争条件或慢速网络期间的性能问题,您可以允许JSONP回调以递归方式调用该函数,从而仅在返回回调时才发出新的呼叫,尽管可选的setTimeout
调用可确保存在至少有一个最小的延迟。
以下使用维基百科的API来获取特定的页面修订及其用户。
<script>
var JSONP = function(global){
// (C) WebReflection Essential - Mit Style (http://webreflection.blogspot.com/2011/02/all-you-need-for-jsonp.html)
// 202 bytes minified + gzipped via Google Closure Compiler
function JSONP(uri, callback) {
function JSONPResponse() {
try { delete global[src] } catch(e) { global[src] = null }
documentElement.removeChild(script);
callback.apply(this, arguments);
}
var
src = prefix + id++,
script = document.createElement("script")
;
global[src] = JSONPResponse;
documentElement.insertBefore(
script,
documentElement.lastChild
).src = uri + "=" + src;
}
var
id = 0,
prefix = "__JSONP__",
document = global.document,
documentElement = document.documentElement
;
return JSONP;
}(this);
// Be sure to include the callback parameter at the end
function startAPI (start) {
start = start || new Date();
var url = 'http://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles=Main%20Page&rvprop=timestamp|user|comment|content&format=json&callback';
var minimum = 10000;
function execute (str) {
alert(str);
}
JSONP(url, function (obj) {
for (var pageNo in obj.query.pages) {
var page = obj.query.pages[pageNo];
var str = 'The user ' + page.revisions[0]['user'] + ' left the page with this code ' + page.revisions[0]['*'];
execute(str);
var elapsed = (new Date().getTime()) - start;
setTimeout(startAPI, (elapsed < minimum) ? (minimum - elapsed) : 0);
break;
}
});
}
startAPI();
</script>
尽管没有得到广泛的支持,WebSocket可以在服务器和客户端之间建立一个'实时'连接,从而使您能够立即向服务器发送数据。而且带宽较少,因为您没有每10秒触发一次请求。 – pimvdb 2011-05-17 07:25:21