Мне было интересно, правильный ли мой подход к JSONP, и если нет, то что я могу изменить.
Мой стандартный подход JSONP:
Сервер
Стандартный параметр ?jsonp=обратного вызова
Клиент
- Вызов функции (пример: jsonp(url, callback)) *1
- Создайте тег
<script>
*2 - Выполнить скрипт
- Удалить тег скрипта
Код
Примечание. Я только что написал все это в редакторе stackoverflow, код не тестировался
1:
jsonp("http://example.com/sampleAPI", function(result) {
// Do something
});
2:
var callbackID = 0;
var jsonp = function(url, callback) {
var callbackName = 'callback' + callbackID;
// put the callback in the URL
callbackID++;
if (url.indexOf('?') != -1) {
url += '&jsonp=' + callbackName;
} else {
url += '?jsonp=' + callbackName;
}
// create the callback
window[callbackName] = function(result) {
$('jsonpScriptElement' + callbackID).remove();
callback(result);
window.splice(callbackName);
}
// Create the actual element (do this as the last thing because of caching)
// Assuming prototype.js usage
$$('body')[0].insert(new Element('script', {'href': url, 'id': 'jsonpScriptElement' + callbackID}));
}