MediaWiki:Common.js: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
| Line 1: | Line 1: | ||
/* | /* Copy-to-clipboard for .wiki-copy-btn inside <code> */ | ||
(function () { | |||
function copyText(text) { | |||
if (navigator.clipboard && navigator.clipboard.writeText) { | |||
return navigator.clipboard.writeText(text); | |||
} | |||
return new Promise(function (resolve) { | |||
var ta = document.createElement('textarea'); | |||
ta.value = text; | |||
ta.setAttribute('readonly', ''); | |||
ta.style.position = 'fixed'; | |||
ta.style.left = '-9999px'; | |||
document.body.appendChild(ta); | |||
ta.select(); | |||
try { document.execCommand('copy'); } catch (e) {} | |||
document.body.removeChild(ta); | |||
resolve(); | |||
}); | |||
} | |||
function showTip(targetEl, msg) { | |||
// создаём tooltip не внутри <code>, а в body (чтобы не обрезался) | |||
var rect = targetEl.getBoundingClientRect(); | |||
var tip = document.createElement('div'); | |||
tip.className = 'copy-tooltip-floating'; | |||
tip.textContent = msg || 'Copied!'; | |||
document.body.appendChild(tip); | |||
// | // позиционируем над элементом | ||
var tip | var tipRect = tip.getBoundingClientRect(); | ||
var top = window.scrollY + rect.top - tipRect.height - 8; | |||
var left = window.scrollX + rect.left + (rect.width / 2) - (tipRect.width / 2); | |||
tip.style.top = Math.max(window.scrollY + 8, top) + 'px'; | |||
tip.style.left = Math.max(window.scrollX + 8, left) + 'px'; | |||
setTimeout(function () { | setTimeout(function () { | ||
if (tip && tip.parentNode) tip.remove(); | |||
}, 1100); | |||
}, | } | ||
}); | |||
document.addEventListener('click', function (e) { | |||
var el = e.target.closest ? e.target.closest('.wiki-copy-btn') : null; | |||
if (!el) return; | |||
var text = el.getAttribute('data-copy'); | |||
if (!text) return; | |||
e.preventDefault(); | |||
copyText(text).then(function () { | |||
el.classList.add('copied'); | |||
showTip(el, 'Copied!'); | |||
setTimeout(function () { el.classList.remove('copied'); }, 1000); | |||
}).catch(function () { | |||
showTip(el, 'Copy failed'); | |||
}); | |||
}, true); | |||
})(); | |||
Revision as of 15:20, 21 January 2026
/* Copy-to-clipboard for .wiki-copy-btn inside <code> */
(function () {
function copyText(text) {
if (navigator.clipboard && navigator.clipboard.writeText) {
return navigator.clipboard.writeText(text);
}
return new Promise(function (resolve) {
var ta = document.createElement('textarea');
ta.value = text;
ta.setAttribute('readonly', '');
ta.style.position = 'fixed';
ta.style.left = '-9999px';
document.body.appendChild(ta);
ta.select();
try { document.execCommand('copy'); } catch (e) {}
document.body.removeChild(ta);
resolve();
});
}
function showTip(targetEl, msg) {
// создаём tooltip не внутри <code>, а в body (чтобы не обрезался)
var rect = targetEl.getBoundingClientRect();
var tip = document.createElement('div');
tip.className = 'copy-tooltip-floating';
tip.textContent = msg || 'Copied!';
document.body.appendChild(tip);
// позиционируем над элементом
var tipRect = tip.getBoundingClientRect();
var top = window.scrollY + rect.top - tipRect.height - 8;
var left = window.scrollX + rect.left + (rect.width / 2) - (tipRect.width / 2);
tip.style.top = Math.max(window.scrollY + 8, top) + 'px';
tip.style.left = Math.max(window.scrollX + 8, left) + 'px';
setTimeout(function () {
if (tip && tip.parentNode) tip.remove();
}, 1100);
}
document.addEventListener('click', function (e) {
var el = e.target.closest ? e.target.closest('.wiki-copy-btn') : null;
if (!el) return;
var text = el.getAttribute('data-copy');
if (!text) return;
e.preventDefault();
copyText(text).then(function () {
el.classList.add('copied');
showTip(el, 'Copied!');
setTimeout(function () { el.classList.remove('copied'); }, 1000);
}).catch(function () {
showTip(el, 'Copy failed');
});
}, true);
})();