미디어위키:Gadget-Vector.js: 두 판 사이의 차이
식물 vs 좀비 위키
편집 요약 없음 |
편집 요약 없음 태그: 수동 되돌리기 |
||
| (같은 사용자의 중간 판 8개는 보이지 않습니다) | |||
| 343번째 줄: | 343번째 줄: | ||
} else { | } else { | ||
initV27Interface(); | initV27Interface(); | ||
} | |||
}()); | |||
(function () { | |||
'use strict'; | |||
function installGrassDividers(root) { | |||
var scope = root || document; | |||
var wrappers; | |||
var legacyHeadings; | |||
wrappers = scope.querySelectorAll( | |||
'.skin-vector-legacy .mw-parser-output .mw-heading2' | |||
); | |||
Array.prototype.forEach.call(wrappers, function (wrapper) { | |||
var divider; | |||
wrapper.classList.add('pvz-grass-heading'); | |||
divider = wrapper.querySelector( | |||
':scope > .pvz-grass-divider' | |||
); | |||
if (!divider) { | |||
divider = document.createElement('span'); | |||
divider.className = 'pvz-grass-divider'; | |||
divider.setAttribute('aria-hidden', 'true'); | |||
wrapper.appendChild(divider); | |||
} | |||
}); | |||
legacyHeadings = scope.querySelectorAll( | |||
'.skin-vector-legacy .mw-parser-output > h2' | |||
); | |||
Array.prototype.forEach.call(legacyHeadings, function (heading) { | |||
var divider; | |||
if (heading.closest('.mw-heading2')) { | |||
return; | |||
} | |||
heading.classList.add('pvz-grass-heading'); | |||
divider = heading.querySelector( | |||
':scope > .pvz-grass-divider' | |||
); | |||
if (!divider) { | |||
divider = document.createElement('span'); | |||
divider.className = 'pvz-grass-divider'; | |||
divider.setAttribute('aria-hidden', 'true'); | |||
heading.appendChild(divider); | |||
} | |||
}); | |||
} | |||
function initGrassDividers() { | |||
var observer; | |||
installGrassDividers(document); | |||
observer = new MutationObserver(function (mutations) { | |||
mutations.forEach(function (mutation) { | |||
Array.prototype.forEach.call( | |||
mutation.addedNodes, | |||
function (node) { | |||
if (node.nodeType !== Node.ELEMENT_NODE) { | |||
return; | |||
} | |||
if ( | |||
node.matches( | |||
'.mw-heading2, .mw-parser-output > h2' | |||
) | |||
) { | |||
installGrassDividers(node.parentNode); | |||
return; | |||
} | |||
installGrassDividers(node); | |||
} | |||
); | |||
}); | |||
}); | |||
observer.observe(document.body, { | |||
childList: true, | |||
subtree: true | |||
}); | |||
} | |||
if (document.readyState === 'loading') { | |||
document.addEventListener( | |||
'DOMContentLoaded', | |||
initGrassDividers, | |||
{ once: true } | |||
); | |||
} else { | |||
initGrassDividers(); | |||
} | } | ||
}()); | }()); | ||
| 351번째 줄: | 453번째 줄: | ||
var ACTION_OFFSET = 230; | var ACTION_OFFSET = 230; | ||
var SEARCH_WIDTH = | var SEARCH_WIDTH = 205; | ||
var SEARCH_DOWN_OFFSET = 5; | var SEARCH_DOWN_OFFSET = 5; | ||
var CONTENT_TOP = 24; | var CONTENT_TOP = 24; | ||
function | function getCactionsParts() { | ||
var | var menu = document.getElementById('p-cactions'); | ||
if (!menu) { | |||
return null; | |||
} | |||
return { | |||
menu: menu, | |||
label: | |||
document.getElementById('p-cactions-label') || | |||
menu.querySelector('.vector-menu-heading'), | |||
checkbox: menu.querySelector( | |||
'input.vector-menu-checkbox, input[type="checkbox"]' | |||
), | |||
content: menu.querySelector('.vector-menu-content') | |||
}; | |||
} | |||
function isCactionsOpen(parts) { | |||
if (!parts) { | |||
return false; | |||
} | |||
if (parts.checkbox && parts.checkbox.checked) { | |||
return true; | |||
} | |||
if ( | |||
parts.menu.classList.contains('vector-menu-dropdown-active') || | |||
parts.menu.classList.contains('pvz-cactions-open') | |||
) { | |||
return true; | |||
} | |||
if (parts.label) { | |||
return parts.label.getAttribute('aria-expanded') === 'true'; | |||
} | |||
return false; | |||
} | |||
function closeCactions(parts) { | |||
if (!parts) { | |||
return; | |||
} | |||
if (parts.checkbox) { | |||
parts.checkbox.checked = false; | |||
parts.checkbox.dispatchEvent( | |||
new Event('change', { bubbles: true }) | |||
); | |||
} | |||
parts.menu.classList.remove( | |||
'pvz- | 'pvz-cactions-open', | ||
' | 'vector-menu-dropdown-active' | ||
); | ); | ||
if ( | if (parts.label) { | ||
parts.label.setAttribute('aria-expanded', 'false'); | |||
} | } | ||
if ( | if (parts.content) { | ||
parts.content.setAttribute('aria-hidden', 'true'); | |||
} | } | ||
} | |||
if ( | function handleCactionsClick(event) { | ||
var parts = getCactionsParts(); | |||
var label; | |||
if (!parts) { | |||
return; | |||
} | |||
label = event.target.closest( | |||
'#p-cactions-label, #p-cactions > .vector-menu-heading' | |||
); | |||
if (label && isCactionsOpen(parts)) { | |||
event.preventDefault(); | |||
event.stopImmediatePropagation(); | |||
closeCactions(parts); | |||
return; | |||
} | |||
if ( | |||
isCactionsOpen(parts) && | |||
!event.target.closest('#p-cactions') | |||
) { | |||
closeCactions(parts); | |||
} | } | ||
} | } | ||
function | function syncV35Layout() { | ||
var content = document.querySelector('#content'); | var content = document.querySelector('#content'); | ||
var leftNavigation = document.getElementById('left-navigation'); | var leftNavigation = document.getElementById('left-navigation'); | ||
| 503번째 줄: | 674번째 줄: | ||
} | } | ||
function | function initV35Layout() { | ||
var observer; | var observer; | ||
syncV35Layout(); | |||
document.addEventListener( | |||
'click', | |||
handleCactionsClick, | |||
true | |||
); | |||
window.addEventListener( | window.addEventListener( | ||
'resize', | 'resize', | ||
syncV35Layout, | |||
{ passive: true } | { passive: true } | ||
); | ); | ||
| 517번째 줄: | 693번째 줄: | ||
window.addEventListener( | window.addEventListener( | ||
'orientationchange', | 'orientationchange', | ||
syncV35Layout, | |||
{ passive: true } | { passive: true } | ||
); | ); | ||
observer = new MutationObserver(function () { | observer = new MutationObserver(function () { | ||
window.requestAnimationFrame( | window.requestAnimationFrame(syncV35Layout); | ||
}); | }); | ||
| 537번째 줄: | 710번째 줄: | ||
document.addEventListener( | document.addEventListener( | ||
'DOMContentLoaded', | 'DOMContentLoaded', | ||
initV35Layout, | |||
{ once: true } | { once: true } | ||
); | ); | ||
} else { | } else { | ||
initV35Layout(); | |||
} | } | ||
}()); | }()); | ||
