MediaWiki:Common.js: Difference between revisions
MediaWiki interface page
More actions
No edit summary Tags: Mobile edit Mobile web edit |
No edit summary Tags: Mobile edit Mobile web edit |
||
| Line 440: | Line 440: | ||
initAllLevels(document); | initAllLevels(document); | ||
} | } | ||
})(); | })(); | ||
| Line 740: | Line 723: | ||
if (opts.pinned) { | if (opts.pinned) { | ||
head.addEventListener("click", function (e) { | head.addEventListener( | ||
"click", | |||
function (e) { | |||
e.preventDefault(); | |||
hidePopup(); | |||
}, | |||
{ once: true } | |||
); | |||
} | } | ||
| Line 777: | Line 764: | ||
} else if (state.anchorKind === "finger") { | } else if (state.anchorKind === "finger") { | ||
left = (vw - w) / 2; | left = (vw - w) / 2; | ||
var y = state.anchorY || | var y = state.anchorY || vh / 2; | ||
top = y - h - gap; | top = y - h - gap; | ||
if (top < margin) top = y + gap; | if (top < margin) top = y + gap; | ||
| Line 784: | Line 771: | ||
var tr = trigger.getBoundingClientRect(); | var tr = trigger.getBoundingClientRect(); | ||
var isIconish = (tr.width || 0) <= 40; | var isIconish = (tr.width || 0) <= 40; | ||
left = isIconish ? | left = isIconish ? tr.right - w : tr.left; | ||
top = tr.bottom + gap; | top = tr.bottom + gap; | ||
left = clamp(left, margin, Math.max(margin, vw - w - margin)); | left = clamp(left, margin, Math.max(margin, vw - w - margin)); | ||
| Line 871: | Line 858: | ||
} | } | ||
if (!attrSize) size = | if (!attrSize) size = mode === "click" ? "lg" : "sm"; | ||
if (!HOVER_CAPABLE && mode === "hover") { | if (!HOVER_CAPABLE && mode === "hover") { | ||
| Line 878: | Line 865: | ||
} | } | ||
if (isDef) { | if (isDef) { | ||
var tipText = getDefTipText(trigger); | |||
if (!tipText) return null; | |||
var linkTitle = getDefLinkTitle(trigger); | |||
var label = trigger.querySelector ? trigger.querySelector(".sv-def-text") : null; | |||
var titleText = label ? String(label.textContent || "").trim() : String(trigger.textContent || "").trim(); | |||
if (!titleText) titleText = "Definition"; | |||
return { | |||
pinned: mode === "click", | |||
size: size, | |||
title: titleText, | |||
titleLink: linkTitle ? buildHeaderLink(linkTitle, titleText) : null, | |||
bodyText: tipText, | |||
bodyPre: true, | |||
bodyNode: null | |||
}; | |||
} | } | ||
var source = getContentNodeFromTrigger(trigger); | var source = getContentNodeFromTrigger(trigger); | ||
| Line 904: | Line 890: | ||
return { | return { | ||
pinned: | pinned: mode === "click", | ||
size: size, | size: size, | ||
title: guessTitle(trigger, source), | title: guessTitle(trigger, source), | ||
| Line 914: | Line 900: | ||
} | } | ||
window.addEventListener("pointerdown", function (e) { | window.addEventListener( | ||
"pointerdown", | |||
function (e) { | |||
if (!e) return; | |||
if (isInsidePopup(e.target)) return; | |||
var trigger = findTrigger(e.target); | |||
if (!trigger) return; | |||
var opts = resolveOpts(trigger); | |||
if (!opts) return; | |||
if (isSummaryTrigger(trigger)) e.preventDefault(); | |||
state.anchorKind = !HOVER_CAPABLE || (e.pointerType && e.pointerType !== "mouse") ? "finger" : "trigger"; | |||
state.anchorX = typeof e.clientX === "number" ? e.clientX : 0; | |||
state.anchorY = typeof e.clientY === "number" ? e.clientY : 0; | |||
if (HOVER_CAPABLE && !opts.pinned && (e.pointerType === "mouse" || !e.pointerType)) { | |||
e.stopPropagation(); | |||
return; | |||
} | |||
e.preventDefault(); | |||
e.stopPropagation(); | e.stopPropagation(); | ||
if (state.open && state.pinned && state.trigger === trigger) { | |||
hidePopup(); | |||
return; | |||
} | |||
openPopup(trigger, opts); | |||
}, | |||
true | |||
); | |||
window.addEventListener( | |||
"mouseover", | |||
function (e) { | |||
if (!HOVER_CAPABLE) return; | |||
if (isInsidePopup(e.target)) return; | |||
var trigger = findTrigger(e.target); | |||
if (!trigger) { | |||
if (state.open && !state.pinned) hidePopup(); | |||
return; | |||
} | |||
var opts = resolveOpts(trigger); | |||
if (!opts || opts.pinned) return; | |||
if ( | |||
state.anchorKind = "trigger"; | |||
e.stopPropagation(); | |||
clearTimeout(state.hideTimer); | |||
state.hideTimer = 0; | |||
openPopup(trigger, opts); | |||
}, | |||
true | |||
); | |||
window.addEventListener( | |||
"mouseout", | |||
function (e) { | |||
if (!HOVER_CAPABLE) return; | |||
if (!state.open || state.pinned) return; | |||
var trigger = findTrigger(e.target); | |||
if (!trigger || trigger !== state.trigger) return; | |||
e.stopPropagation(); | |||
clearTimeout(state.hideTimer); | |||
state.hideTimer = setTimeout(function () { | |||
if (state.open && !state.pinned) hidePopup(); | |||
}, 80); | |||
}, | |||
true | |||
); | |||
window.addEventListener( | |||
"click", | |||
if (state.open | function (e) { | ||
if (!state.open) return; | |||
if (isInsidePopup(e.target)) return; | |||
var trigger = findTrigger(e.target); | |||
if (trigger) { | |||
e.stopPropagation(); | |||
return; | |||
} | |||
if (state.pinned || !HOVER_CAPABLE) { | |||
hidePopup(); | |||
e.stopPropagation(); | |||
} | |||
} | }, | ||
true | |||
); | |||
window.addEventListener( | |||
"keydown", | |||
function (e) { | |||
if (e.key !== "Escape") return; | |||
if (state.open) { | |||
hidePopup(); | |||
window.addEventListener("keydown", function (e) { | e.stopPropagation(); | ||
} | |||
}, | |||
true | |||
); | |||
window.addEventListener("scroll", function () { | window.addEventListener( | ||
"scroll", | |||
function () { | |||
if (!state.open || !state.trigger) return; | |||
positionPopup(state.trigger); | |||
}, | |||
true | |||
); | |||
window.addEventListener("resize", function () { | window.addEventListener( | ||
"resize", | |||
function () { | |||
if (!state.open || !state.trigger) return; | |||
positionPopup(state.trigger); | |||
}, | |||
true | |||
); | |||
function stripDefTitles(root) { | function stripDefTitles(root) { | ||
| Line 1,031: | Line 1,045: | ||
if (document.readyState === "loading") { | if (document.readyState === "loading") { | ||
document.addEventListener("DOMContentLoaded", function () { stripDefTitles(document); }); | document.addEventListener("DOMContentLoaded", function () { | ||
stripDefTitles(document); | |||
}); | |||
} else { | } else { | ||
stripDefTitles(document); | stripDefTitles(document); | ||