renovations, new pics from @bezart

This commit is contained in:
Ilya Kantor 2015-02-22 12:44:37 +03:00
parent b1cf35268b
commit 801ff5f119
145 changed files with 711 additions and 300 deletions

View file

@ -0,0 +1,49 @@
var CallbackRegistry = {}; // реестр
// при успехе вызовет onSuccess, при ошибке onError
function scriptRequest(url, onSuccess, onError) {
var scriptOk = false; // флаг, что вызов прошел успешно
// сгенерировать имя JSONP-функции для запроса
var callbackName = 'f'+String(Math.random()).slice(2);
// укажем это имя в URL запроса
url += ~url.indexOf('?') ? '&' : '?';
url += 'callback=CallbackRegistry.'+callbackName;
// ..и создадим саму функцию в реестре
CallbackRegistry[callbackName] = function(data) {
scriptOk = true; // обработчик вызвался, указать что всё ок
delete CallbackRegistry[callbackName]; // можно очистить реестр
onSuccess(data); // и вызвать onSuccess
};
// эта функция сработает при любом результате запроса
// важно: при успешном результате - всегда после JSONP-обработчика
function checkCallback() {
if (scriptOk) return; // сработал обработчик?
delete CallbackRegistry[callbackName];
onError(url); // нет - вызвать onError
}
var script = document.createElement('script');
// в старых IE поддерживается только событие, а не onload/onerror
// в теории 'readyState=loaded' означает "скрипт загрузился",
// а 'readyState=complete' -- "скрипт выполнился", но иногда
// почему-то случается только одно из них, поэтому проверяем оба
script.onreadystatechange = function() {
if (this.readyState == 'complete' || this.readyState == 'loaded'){
this.onreadystatechange = null;
setTimeout(checkCallback, 0); // Вызвать checkCallback - после скрипта
}
}
// события script.onload/onerror срабатывают всегда после выполнения скрипта
script.onload = script.onerror = checkCallback;
script.src = url;
document.body.appendChild(script);
}