@dom12

Как определить, загрузился ли скрипт или нет?

Здравствуйте.
Сам код рабочий, но я не знаю как определить загрузился ли url-скрипт или нет.
Мне нужно написать условие для функции loadScriptBody, в котором если созданный скрипт еще не прогрузился, то ждать до полной загрузки. Но если скрипт до этого был создан, то сразу запускаем функцию c.callback();.
Тут я не знаю как определить готовность скрипта.

Сам код:
const arrayToUrlParams = (url, array) => {
		let start = true;
		for (let [NAME,VALUE] of Object.entries(array)) {
			if(VALUE != null){
				if(start){
					url += `?${NAME}=${VALUE}`;
				}else{
					url += `&${NAME}=${VALUE}`;
				}
				start = false;
			}
		}
		return url;
	};
const isScript = (url) => {
		let scripts = document.getElementsByTagName('script');
		for(let i = scripts.length; i--;) if(scripts[i].src == url) return scripts[i];
		return false;
	};
const loadScriptBody = (c) => {
		let url = (c.params)?arrayToUrlParams(c.url,c.params):c.url;
		if(script = isScript(url)){
			//В этом месте нужно определить загруженность url-скрипта. 
			//Если скрип еще не загрузился,  то ждём:
			script.addEventListener("load", () => {
				c.callback();
			}, false);
			//Но если скрипт загрузился, то сразу запускаем функцию:
			//c.callback();
		}else{
			let script = document.createElement('script');
			script.src = url;
			script.addEventListener("load", c.callback, false);
			if(c.attributes && c.attributes.length>0){
				for(let i = 0; i < c.attributes.length; i++){
					script.setAttribute(c.attributes[i].name,c.attributes[i].value);
				}
			}
			document.getElementsByTagName('head')[0].appendChild(script);
		}
	};
const mapYandex = () => {

	};
loadScriptBody({
	url:'https://api-maps.yandex.ru/2.1/',
	params:{
		apikey:apikey,
		lang:'ru_RU'
	},
	callback:mapYandex
});

В этом месте нужно определить загруженность url-скрипта:
if(script = isScript(url)){
			//Если скрип еще не загрузился,  то ждём:
			script.addEventListener("load", () => {
				c.callback();
			}, false);
			//Но если скрипт загрузился, то сразу запускаем функцию:
			//c.callback();
		}


Посоветуйте пожалуйста как определить utl-скрипт загружен или нет.
  • Вопрос задан
  • 1227 просмотров
Решения вопроса 1
@holllop
Для того чтобы определить, загружен ли скрипт или находится в процессе загрузки, можно использовать флаги или атрибуты, которые вы могли бы установить в элементе скрипта. В вашем случае, как один из вариантов, можно добавить к элементу скрипта атрибут data-loaded, который будет указывать на его состояние. Для этого вам нужно модифицировать функцию isScript.
spoiler
Примерно как-то так, если я правильно понял ход ваших мыслей
const isScriptLoaded = (url) => {
    const scripts = document.getElementsByTagName('script');
    for(let i = scripts.length; i--;) {
        if(scripts[i].src === url) {
            return scripts[i].getAttribute('data-loaded') === 'true' ? scripts[i] : false;
        }
    }
    return false;
};

const loadScriptBody = (c) => {
    let url = (c.params) ? arrayToUrlParams(c.url, c.params) : c.url;
    let script = isScriptLoaded(url);
    if(script){
        // Скрипт уже загружен и готов к использованию:
        c.callback();
    } else {
        script = document.createElement('script');
        script.src = url;
        script.setAttribute('data-loaded', 'false');  // Устанавливаем флаг загруженности в 'false'
        script.addEventListener("load", () => {
            script.setAttribute('data-loaded', 'true'); // Меняем флаг на 'true', когда скрипт загрузился
            c.callback();
        }, false);

        if(c.attributes && c.attributes.length > 0){
            for(let i = 0; i < c.attributes.length; i++){
                script.setAttribute(c.attributes[i].name, c.attributes[i].value);
            }
        }
        document.getElementsByTagName('head')[0].appendChild(script);
    }
};
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@YuriyBum334
Можно навесить на тег скрипта событие load (onload)
<script id="yourScriptId" type="text/javascript" src="/path/to/script.js"></script>
<script>
   document.querySelector("#yourScriptId").addEventListener("load", (event) => {
     // Действия, когда скрипт загружен
})
</script>
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы