以下將動態創建腳本標記並在完成給定的呼叫後刪除它們(以及它所需的全局)。
您也可以使用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