53 lines
1.7 KiB
JavaScript
53 lines
1.7 KiB
JavaScript
|
window.addEventListener('load', () => {
|
||
|
document.querySelectorAll('span.copy-icon').forEach(element => {
|
||
|
element.addEventListener('click', (el) => copyElementsContentToClipboard(element));
|
||
|
})
|
||
|
|
||
|
document.querySelectorAll('span.anchor-icon').forEach(element => {
|
||
|
element.addEventListener('click', (el) => {
|
||
|
if(element.hasAttribute('pointing-to')){
|
||
|
const location = hrefWithoutCurrentlyUsedAnchor() + '#' + element.getAttribute('pointing-to')
|
||
|
copyTextToClipboard(element, location)
|
||
|
}
|
||
|
});
|
||
|
})
|
||
|
})
|
||
|
|
||
|
const copyElementsContentToClipboard = (element) => {
|
||
|
const selection = window.getSelection();
|
||
|
const range = document.createRange();
|
||
|
range.selectNodeContents(element.parentNode.parentNode);
|
||
|
selection.removeAllRanges();
|
||
|
selection.addRange(range);
|
||
|
|
||
|
copyAndShowPopup(element, () => selection.removeAllRanges())
|
||
|
}
|
||
|
|
||
|
const copyTextToClipboard = (element, text) => {
|
||
|
var textarea = document.createElement("textarea");
|
||
|
textarea.textContent = text;
|
||
|
textarea.style.position = "fixed";
|
||
|
document.body.appendChild(textarea);
|
||
|
textarea.select();
|
||
|
|
||
|
copyAndShowPopup(element, () => document.body.removeChild(textarea))
|
||
|
}
|
||
|
|
||
|
const copyAndShowPopup = (element, after) => {
|
||
|
try {
|
||
|
document.execCommand('copy');
|
||
|
element.nextElementSibling.classList.add('active-popup');
|
||
|
setTimeout(() => {
|
||
|
element.nextElementSibling.classList.remove('active-popup');
|
||
|
}, 1200);
|
||
|
} catch (e) {
|
||
|
console.error('Failed to write to clipboard:', e)
|
||
|
}
|
||
|
finally {
|
||
|
if(after) after()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const hrefWithoutCurrentlyUsedAnchor = () => window.location.href.split('#')[0]
|
||
|
|