MediaWiki:Common.js: различия между версиями

Нет описания правки
Нет описания правки
 
Строка 633: Строка 633:
var queue = [];
var queue = [];
var processing = false;
var processing = false;
// HTML для спиннера (анимация загрузки)
var loadingImgHTML = '<img alt="Файл:Silva-loading.gif" src="/images/4/45/Silva-loading.gif?20260316201152" decoding="async" width="16" height="16" data-file-width="16" data-file-height="16" style="vertical-align:middle;margin-right:6px">';


function fetchParsedData(wikiText) {
function fetchParsedData(wikiText) {
Строка 695: Строка 698:
applyParsedHTML(parsedHTML, job.placeholder);
applyParsedHTML(parsedHTML, job.placeholder);
} else {
} else {
if (job.placeholder) job.placeholder.textContent = job.fallbackText || "API не вернул ожидаемых данных.";
if (job.placeholder) job.placeholder.textContent = "API не вернул ожидаемых данных.";
}
}
})
})
.fail(function () {
.fail(function () {
if (job.placeholder) job.placeholder.textContent = job.fallbackText || "Ошибка при выполнении запроса к API.";
if (job.placeholder) job.placeholder.textContent = "Ошибка при выполнении запроса к API.";
})
})
.always(function () {
.always(function () {
Строка 715: Строка 718:
var loadingEl = container.querySelector('.ajax-load-loading');
var loadingEl = container.querySelector('.ajax-load-loading');


var contentWikiText = contentEl ? (contentEl.textContent || contentEl.innerText || "").trim() : "";
if (!contentEl) return;
var loadingWikiText = loadingEl ? (loadingEl.textContent || loadingEl.innerText || "").trim() : "";
 
var wikiText = (contentEl.textContent || contentEl.innerText || "").trim();
if (!wikiText) return;


var loadingText = (loadingEl && (loadingEl.getAttribute('data-loading-text') || (loadingEl.textContent || loadingEl.innerText || "").trim())) || "Загрузка...";
var loadingText = (loadingEl && (loadingEl.textContent || loadingEl.innerText || "").trim()) || "Загрузка...";


// Если есть элемент .ajax-load-loading — можно удалить (как в оригинале),
// но плейсхолдер мы всё равно создаём с картинкой + текстом.
if (loadingEl && loadingEl.parentNode) {
if (loadingEl && loadingEl.parentNode) {
loadingEl.parentNode.removeChild(loadingEl);
loadingEl.parentNode.removeChild(loadingEl);
Строка 725: Строка 732:
}
}


if (!contentWikiText && !loadingWikiText) return;
function createPlaceholderWithSpinner(text) {
var placeholder = document.createElement("span");
placeholder.className = "ajax-load-placeholder";
// Добавляем картинку в начало и текст после неё
placeholder.innerHTML = loadingImgHTML + '<span class="ajax-load-text">' + (text || '') + '</span>';
return placeholder;
}
 
if (container.classList.contains('ajax-load-link')) {
container.addEventListener('click', function (ev) {
ev.preventDefault && ev.preventDefault();


function createPlaceholderAndEnqueue(isLinkClick) {
if (container.dataset.ajaxLoaded === "1") return;
if (container.classList.contains('ajax-load-link') && !isLinkClick) return;
container.dataset.ajaxLoaded = "1";


var placeholder = document.createElement("span");
var placeholder = createPlaceholderWithSpinner(loadingText);
placeholder.className = "ajax-load-placeholder";
placeholder.textContent = loadingText;


if (isLinkClick) {
if (container && container.parentNode) {
if (container && container.parentNode) {
container.parentNode.replaceChild(placeholder, container);
container.parentNode.replaceChild(placeholder, container);
Строка 742: Строка 756:
}
}
}
}
} else {
if (contentEl && contentEl.parentNode) {
contentEl.parentNode.replaceChild(placeholder, contentEl);
} else if (container && container.parentNode) {
container.parentNode.replaceChild(placeholder, container);
}
}


if (loadingWikiText) {
queue.push({ wikiText: wikiText, placeholder: placeholder });
queue.push({
processQueue();
wikiText: loadingWikiText,
}, { once: true });
placeholder: placeholder,
} else {
fallbackText: loadingText
var placeholder = createPlaceholderWithSpinner(loadingText);
});
}


if (contentWikiText) {
if (contentEl && contentEl.parentNode) {
queue.push({
contentEl.parentNode.replaceChild(placeholder, contentEl);
wikiText: contentWikiText,
placeholder: placeholder,
fallbackText: "Контент не доступен."
});
}
}
}
if (container.classList.contains('ajax-load-link')) {
container.addEventListener('click', function (ev) {
ev.preventDefault && ev.preventDefault();
if (container.dataset.ajaxLoaded === "1") return;
container.dataset.ajaxLoaded = "1";


createPlaceholderAndEnqueue(true);
queue.push({ wikiText: wikiText, placeholder: placeholder });
processQueue();
}, { once: true });
} else {
createPlaceholderAndEnqueue(false);
}
}
});
});