MediaWiki:Mobile.js: Unterschied zwischen den Versionen
Erscheinungsbild
Admin (Diskussion | Beiträge) Die Seite wurde geleert. Markierungen: Geleert Manuelle Zurücksetzung Mobile Bearbeitung Mobile Web-Bearbeitung Erweiterte mobile Bearbeitung |
Admin (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung Markierung: Zurückgesetzt |
||
| Zeile 1: | Zeile 1: | ||
/** | |||
* Mobile: Alle Abschnitte automatisch ausklappen (Minerva/MobileFrontend) | |||
* Datei: MediaWiki:Mobile.js | |||
*/ | |||
(function () { | |||
// Nur im Minerva (mobile) Skin laufen lassen | |||
var skin = mw.config.get('skin'); | |||
if (skin !== 'minerva') return; | |||
function expandAllSectionsOnce() { | |||
var didSomething = false; | |||
// 1) Variante A: Über ARIA-Attribute (stabiler, versionsunabhängig) | |||
// Buttons/Headings, die Inhalte steuern und noch zugeklappt sind | |||
document.querySelectorAll('[aria-controls][aria-expanded="false"]').forEach(function (btn) { | |||
var id = btn.getAttribute('aria-controls'); | |||
var panel = id && document.getElementById(id); | |||
if (panel) { | |||
btn.setAttribute('aria-expanded', 'true'); | |||
// Häufige Klassen, die das Zuklappen steuern, entfernen | |||
btn.classList.remove('collapsed', 'mf-collapsible-button--collapsed'); | |||
panel.classList.remove('collapsed', 'mf-collapsible-content--collapsed', 'mf-collapsible--collapsed'); | |||
panel.style.display = ''; // falls per inline-style versteckt | |||
didSomething = true; | |||
} | |||
}); | |||
// 2) Variante B: Falls MobileFrontend eigene Section-Headings nutzt | |||
// (z. B. .section-heading[aria-expanded], .collapsible-header, etc.) | |||
document.querySelectorAll('.section-heading, .collapsible-header, .mf-section-heading').forEach(function (heading) { | |||
var expanded = heading.getAttribute('aria-expanded'); | |||
if (expanded === 'false') { | |||
// Am sichersten: Klick simulieren, damit interne Logik läuft | |||
heading.click(); | |||
didSomething = true; | |||
} | |||
// Zusätzliche Absicherung | |||
heading.setAttribute('aria-expanded', 'true'); | |||
heading.classList.remove('collapsed'); | |||
}); | |||
// 3) Bekannte Content-Container sichtbar schalten | |||
document.querySelectorAll( | |||
'.section-content, .content, .collapsible-block, .mf-collapsible-content' | |||
).forEach(function (el) { | |||
// Nur wenn der Container direkt nach einer Heading-Struktur kommt oder collapsible ist | |||
if ( | |||
el.previousElementSibling && | |||
/section|collapsible|heading/i.test(el.previousElementSibling.className + '') | |||
) { | |||
el.style.display = ''; | |||
el.classList.remove('collapsed', 'mf-collapsible-content--collapsed'); | |||
} | |||
}); | |||
return didSomething; | |||
} | |||
function expandWithRetries() { | |||
// Sofort versuchen… | |||
var changed = expandAllSectionsOnce(); | |||
// …und noch ein paar Mal nachlegen, falls MF/JS später bootet oder Lazy-Transforms kommen | |||
var tries = 0; | |||
var maxTries = 10; | |||
var interval = setInterval(function () { | |||
tries++; | |||
var did = expandAllSectionsOnce(); | |||
if (tries >= maxTries || (!did && tries > 2)) { | |||
clearInterval(interval); | |||
} | |||
}, 300); | |||
} | |||
// Wenn MobileFrontend-Hooks vorhanden sind, darauf warten | |||
if (mw.hook) { | |||
// Häufiger Hook, wenn die mobile Seite „bereit“ ist | |||
mw.hook('mobileFrontend.pageReady').add(expandWithRetries); | |||
} | |||
// Fallback: nach DOMContentLoaded | |||
if (document.readyState === 'loading') { | |||
document.addEventListener('DOMContentLoaded', expandWithRetries); | |||
} else { | |||
expandWithRetries(); | |||
} | |||
})(); | |||
Version vom 1. September 2025, 23:19 Uhr
/**
* Mobile: Alle Abschnitte automatisch ausklappen (Minerva/MobileFrontend)
* Datei: MediaWiki:Mobile.js
*/
(function () {
// Nur im Minerva (mobile) Skin laufen lassen
var skin = mw.config.get('skin');
if (skin !== 'minerva') return;
function expandAllSectionsOnce() {
var didSomething = false;
// 1) Variante A: Über ARIA-Attribute (stabiler, versionsunabhängig)
// Buttons/Headings, die Inhalte steuern und noch zugeklappt sind
document.querySelectorAll('[aria-controls][aria-expanded="false"]').forEach(function (btn) {
var id = btn.getAttribute('aria-controls');
var panel = id && document.getElementById(id);
if (panel) {
btn.setAttribute('aria-expanded', 'true');
// Häufige Klassen, die das Zuklappen steuern, entfernen
btn.classList.remove('collapsed', 'mf-collapsible-button--collapsed');
panel.classList.remove('collapsed', 'mf-collapsible-content--collapsed', 'mf-collapsible--collapsed');
panel.style.display = ''; // falls per inline-style versteckt
didSomething = true;
}
});
// 2) Variante B: Falls MobileFrontend eigene Section-Headings nutzt
// (z. B. .section-heading[aria-expanded], .collapsible-header, etc.)
document.querySelectorAll('.section-heading, .collapsible-header, .mf-section-heading').forEach(function (heading) {
var expanded = heading.getAttribute('aria-expanded');
if (expanded === 'false') {
// Am sichersten: Klick simulieren, damit interne Logik läuft
heading.click();
didSomething = true;
}
// Zusätzliche Absicherung
heading.setAttribute('aria-expanded', 'true');
heading.classList.remove('collapsed');
});
// 3) Bekannte Content-Container sichtbar schalten
document.querySelectorAll(
'.section-content, .content, .collapsible-block, .mf-collapsible-content'
).forEach(function (el) {
// Nur wenn der Container direkt nach einer Heading-Struktur kommt oder collapsible ist
if (
el.previousElementSibling &&
/section|collapsible|heading/i.test(el.previousElementSibling.className + '')
) {
el.style.display = '';
el.classList.remove('collapsed', 'mf-collapsible-content--collapsed');
}
});
return didSomething;
}
function expandWithRetries() {
// Sofort versuchen…
var changed = expandAllSectionsOnce();
// …und noch ein paar Mal nachlegen, falls MF/JS später bootet oder Lazy-Transforms kommen
var tries = 0;
var maxTries = 10;
var interval = setInterval(function () {
tries++;
var did = expandAllSectionsOnce();
if (tries >= maxTries || (!did && tries > 2)) {
clearInterval(interval);
}
}, 300);
}
// Wenn MobileFrontend-Hooks vorhanden sind, darauf warten
if (mw.hook) {
// Häufiger Hook, wenn die mobile Seite „bereit“ ist
mw.hook('mobileFrontend.pageReady').add(expandWithRetries);
}
// Fallback: nach DOMContentLoaded
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', expandWithRetries);
} else {
expandWithRetries();
}
})();