Следующее будет динамически создавать теги сценария и удалять их (и глобальные, которые требуются) после завершения данного вызова.
Вы также можете использовать 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>