Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   проверка существования js-класса на этапе инициалиации (https://javascript.ru/forum/misc/85327-proverka-sushhestvovaniya-js-klassa-na-ehtape-inicialiacii.html)

Дмитрий Луценко 27.06.2023 10:35

проверка существования js-класса на этапе инициалиации
 
Мое почтение

Вопрос у меня возник следующий.

Как на нативном js написать проверку, существует ли вообще js-класс или нет?

Можно скрипт подрубить в 1-м месте и его использовать,
но условимся, что:
  • Подрубать скрипт только тогда, когда есть хоть один активный компонент(блок html с js)
  • Подрубать скрипт на этапе вывода компонента(там могут быть разный набор правил в объекте для каждого компонента)
  • Футер и шапка для всех страниц общие либо для каждой страницы своя. Нет резона в них запихивать проверки на существование нод в html-структуре. Проверки и подключение пусть будет только в блоке компонентов.

Поэтому хочется понять, как происходит проверка существования класса на этапе объявления объекта?
window.addEventListener("load", (event) => {
	let myScript = CustomScript() // Ошибка undefined, как-то нужно проверить, есть ли этот класс или нет
	if(myScript === undefined || myScript === null) { //Класса CustomScript еще нет, подключаем его.
		const includeScript = document.createElement('script');
                includeScript .setAttribute("src", "/assets/custom_script.js");
                includeScript .setAttribute("type", "text/javascript");
		document.getElementsByTagName("head")[0].appendChild(includeScript );
	}
//Вызов объекта класса CustomScript
    myScript = CustomScript({
    element: '.my-block',
    itemColon: 4,
    grid: true,
    slide: true,
    autoWidth: true
  });
});

voraa 27.06.2023 10:57

Вместо этого
let myScript = CustomScript() // Ошибка undefined, как-то нужно проверить, есть ли этот класс или нет
    if(myScript === undefined || myScript === null) { //Класса CustomScript еще нет, подключаем его.

просто
if(CustomScript === undefined)

После присоединения скрипта надо дожидаться окончания его загрузки - ловить событие onload.

Про какой класс идет речь, и как "подрубают" скрипты - не понял.

voraa 27.06.2023 11:21

Так можно попробовать
function loadScript (src) {
	return new Promise ((res, rej) => {
			const script = document.createElement('script');
			script.src = src;
			script.onload = res;
			script.onerror = rej;
			document.head.append(script)
	}) 
}

window.addEventListener("load", async (event) => {
	let myScript;
	try {
		myScript = CustomScript(); // проверяем наличие скрипта. Если его нет будет ошибка
	} catch () {
		await loadScript("/assets/custom_script.js // При ошибке подключаем и ждем загрузку
	} finally {
		myScript = CustomScript({  // В любом случае выполняем это.
			element: '.my-block',
			itemColon: 4,
			grid: true,
			slide: true,
			autoWidth: true
		});
	}
});

Дмитрий Луценко 27.06.2023 11:32

Прекрасное решение:) Все отлично работает:)

Про какой класс идет речь, и как "подрубают" скрипты - не понял.
Я спрашивал про проверку существования класса (прототипа) в ООП js, если я правильно понял Ваш вопрос.

Скрипты библиотек подключаются в шапке путем прописывания <script src="/{url}/{name}.js">
Все, что касается инициализации объектов классов, вызывается внутри тегов <script>


Часовой пояс GMT +3, время: 14:18.