미디어위키:Gadget-Vector.js: 두 판 사이의 차이
둘러보기로 이동
검색으로 이동
편집 요약 없음 |
편집 요약 없음 |
||
| 2번째 줄: | 2번째 줄: | ||
'use strict'; | 'use strict'; | ||
var | var SPIN_CLASS = 'pvz-watch-spinning'; | ||
var | var WATCHED_CLASS = 'pvz-watch-watched'; | ||
var | var NOT_WATCHED_CLASS = 'pvz-watch-not-watched'; | ||
var SPIN_TIME = 360; | |||
var cleanupTimer = 0; | |||
function | function getContainer() { | ||
return document.querySelector('#ca-watch, #ca-unwatch'); | return document.querySelector( | ||
'#ca-watch, #ca-unwatch, li.mw-watchlink, a.mw-watchlink' | |||
); | |||
} | } | ||
function | function getLink(container) { | ||
if (!container) { | |||
return null; | |||
} | |||
return container.matches('a') ? container : container.querySelector('a'); | |||
} | |||
function applyState(isWatched) { | |||
var container = getContainer(); | |||
if (!container) { | |||
return; | |||
} | } | ||
container.classList.toggle(WATCHED_CLASS, !!isWatched); | |||
container.classList.toggle(NOT_WATCHED_CLASS, !isWatched); | |||
} | } | ||
function | function syncFromMarkup() { | ||
var | var container = getContainer(); | ||
var | var link = getLink(container); | ||
var href; | |||
if ( | if (!container || !link) { | ||
return; | return; | ||
} | } | ||
href = link.getAttribute('href') || ''; | |||
applyState( | |||
container.id === 'ca-unwatch' || | |||
href.indexOf('action=unwatch') !== -1 | |||
); | |||
} | |||
function spin() { | |||
var container = getContainer(); | |||
if (! | if (!container) { | ||
return; | return; | ||
} | } | ||
window.clearTimeout(cleanupTimer); | |||
container.classList.remove(SPIN_CLASS); | |||
void container.offsetWidth; | |||
container.classList.add(SPIN_CLASS); | |||
window.setTimeout(function () { | cleanupTimer = window.setTimeout(function () { | ||
container.classList.remove(SPIN_CLASS); | |||
}, | }, SPIN_TIME + 40); | ||
} | } | ||
function handleClick(event) { | function handleClick(event) { | ||
var link = event.target.closest('#ca-watch > a, #ca-unwatch > a'); | var link = event.target.closest( | ||
'#ca-watch > a, #ca-unwatch > a, li.mw-watchlink > a, a.mw-watchlink' | |||
); | |||
if ( | if (link) { | ||
spin(); | |||
} | } | ||
} | } | ||
function init() { | function init() { | ||
var observer; | |||
syncFromMarkup(); | |||
document.addEventListener('click', handleClick, true); | document.addEventListener('click', handleClick, true); | ||
observer = new MutationObserver(function () { | observer = new MutationObserver(function () { | ||
syncFromMarkup(); | |||
}); | }); | ||
observer.observe(document.body, { | observer.observe(document.body, { | ||
subtree: true, | |||
childList: true, | childList: true, | ||
attributes: true, | attributes: true, | ||
attributeFilter: ['id'] | attributeFilter: ['id', 'href'] | ||
}); | }); | ||
if (window.mw && mw.hook) { | |||
mw.hook('wikipage.watchlistChange').add(function (isWatched) { | |||
applyState(isWatched); | |||
spin(); | |||
}); | |||
} | |||
} | } | ||
2026년 7월 27일 (월) 22:44 판
(function () {
'use strict';
var SPIN_CLASS = 'pvz-watch-spinning';
var WATCHED_CLASS = 'pvz-watch-watched';
var NOT_WATCHED_CLASS = 'pvz-watch-not-watched';
var SPIN_TIME = 360;
var cleanupTimer = 0;
function getContainer() {
return document.querySelector(
'#ca-watch, #ca-unwatch, li.mw-watchlink, a.mw-watchlink'
);
}
function getLink(container) {
if (!container) {
return null;
}
return container.matches('a') ? container : container.querySelector('a');
}
function applyState(isWatched) {
var container = getContainer();
if (!container) {
return;
}
container.classList.toggle(WATCHED_CLASS, !!isWatched);
container.classList.toggle(NOT_WATCHED_CLASS, !isWatched);
}
function syncFromMarkup() {
var container = getContainer();
var link = getLink(container);
var href;
if (!container || !link) {
return;
}
href = link.getAttribute('href') || '';
applyState(
container.id === 'ca-unwatch' ||
href.indexOf('action=unwatch') !== -1
);
}
function spin() {
var container = getContainer();
if (!container) {
return;
}
window.clearTimeout(cleanupTimer);
container.classList.remove(SPIN_CLASS);
void container.offsetWidth;
container.classList.add(SPIN_CLASS);
cleanupTimer = window.setTimeout(function () {
container.classList.remove(SPIN_CLASS);
}, SPIN_TIME + 40);
}
function handleClick(event) {
var link = event.target.closest(
'#ca-watch > a, #ca-unwatch > a, li.mw-watchlink > a, a.mw-watchlink'
);
if (link) {
spin();
}
}
function init() {
var observer;
syncFromMarkup();
document.addEventListener('click', handleClick, true);
observer = new MutationObserver(function () {
syncFromMarkup();
});
observer.observe(document.body, {
subtree: true,
childList: true,
attributes: true,
attributeFilter: ['id', 'href']
});
if (window.mw && mw.hook) {
mw.hook('wikipage.watchlistChange').add(function (isWatched) {
applyState(isWatched);
spin();
});
}
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init, { once: true });
} else {
init();
}
}());