How to copy to clipboard and change tooltips at the same time with JS
I want to click to copy numbers to the clipboard and change the tooltip text from "Copy to clipboard" to "Copied: [number]" when clicked.
With many numbers, I don't want to use IDs to reduce my code.
I have managed to copy numbers to the clipboard but I am struggling with tooltips.
Any help or hint would be appreciated.
const tds = document.querySelectorAll(".number");
tds.forEach(td => {
td.onclick = function () {
document.execCommand("copy");
}
td.addEventListener("copy", function (event) {
event.preventDefault();
if (event.clipboardData) {
event.clipboardData.setData("text/plain", td.textContent);
console.log(event.clipboardData.getData("text"));
//the below 2 lines doesn't work
var tooltip = document.getElementsByClassName("tooltiptext");
tooltip.innerHTML = "copied" + event.clipboardData.getData("text");
}
});
})
function outFunc() {
var tooltip = document.getElementsByClassName("tooltiptext");
tooltip.innerHTML = "Copy to clipboard";
}
.tooltip {
position : relative;
display : inline-block;
}
.tooltip .tooltiptext {
visibility : hidden;
width : 140px;
background-color: #555;
color : #fff;
text-align : center;
border-radius : 6px;
padding : 5px;
position : absolute;
z-index : 1;
bottom : 150%;
left : 50%;
margin-left : -75px;
opacity : 0;
transition : opacity 0.3s;
}
.tooltip .tooltiptext::after {
content : "";
position : absolute;
top : 100%;
left : 50%;
margin-left : -5px;
border-width : 5px;
border-style : solid;
border-color : #555 transparent transparent transparent;
}
.tooltip:hover .tooltiptext {
visibility : visible;
opacity : 1;
}
<div class="tooltip">
<span class="tooltiptext">Copy to clipboard</span>
<a style="font-size: 2em;" onmouseout="outFunc()" class="number">1</a>
</div>
<div class="tooltip">
<span class="tooltiptext">Copy to clipboard</span>
<a style="font-size: 2em;" onmouseout="outFunc()" class="number">2</a>
</div>
<div class="tooltip">
<span class="tooltiptext">Copy to clipboard</span>
<a style="font-size: 2em;" onmouseout="outFunc()" class="number">3</a>
</div>
<div class="tooltip">
<span class="tooltiptext">Copy to clipboard</span>
<a style="font-size: 2em;" onmouseout="outFunc()" class="number">4</a>
</div>
Solution 1:
This biggest problem is you doesn't specify the []
for document.getElementsByClassName
.
.
There is one problem that you have noticed: It won't display the copy information correctly if you copy the two number or more at the same time because you assign the copy function to each individual <span>
Updated: I change the document.getElementsByClassName to document.querySelectorAll
in order to use forEach, but if you don't want to, just use a for loop.
Also, your copy message currently will not working because you set bottom: 150%
and `opacity:0
You should use mouseenter
.
const tds = document.querySelectorAll(".number");
document.querySelectorAll(".tooltiptext").forEach(link =>{
link.addEventListener('mouseenter',function(){
link.textContent = 'Copy and paste'
})
})
tds.forEach(td => {
td.onclick = function () {
document.execCommand("copy");
}
td.addEventListener("copy", function (event) {
event.preventDefault();
if (event.clipboardData) {
event.clipboardData.setData("text/plain", td.textContent);
console.log(event.clipboardData.getData("text"));
//the below 2 lines doesn't work
var tooltip = document.querySelectorAll(".tooltiptext");
tooltip.forEach(item =>{
item.innerHTML = "copied" + event.clipboardData.getData("text");
})
}
});
})
function outFunc() {
var tooltip = document.querySelectorAll(".tooltiptext");
tooltip.forEach(item =>{
item.innerHTML = "Copy to clipboard";
})
}
.tooltip {
position : relative;
display : inline-block;
}
.tooltip .tooltiptext {
width : 140px;
background-color: #555;
color : #fff;
text-align : center;
border-radius : 6px;
padding : 5px;
position : absolute;
z-index : 1;
left : 50%;
margin-left : -75px;
transition : opacity 0.3s;
}
.tooltip .tooltiptext::after {
content : "";
position : absolute;
top : 100%;
left : 50%;
margin-left : -5px;
border-width : 5px;
border-style : solid;
border-color : #555 transparent transparent transparent;
}
.tooltip:hover .tooltiptext {
visibility : visible;
opacity : 1;
}
<div class="tooltip">
<span class="tooltiptext">Copy to clipboard</span>
<a style="font-size: 2em;" onmouseout="outFunc()" class="number">1</a>
</div>
<div class="tooltip">
<span class="tooltiptext">Copy to clipboard</span>
<a style="font-size: 2em;" onmouseout="outFunc()" class="number">2</a>
</div>
<div class="tooltip">
<span class="tooltiptext">Copy to clipboard</span>
<a style="font-size: 2em;" onmouseout="outFunc()" class="number">3</a>
</div>
<div class="tooltip">
<span class="tooltiptext">Copy to clipboard</span>
<a style="font-size: 2em;" onmouseout="outFunc()" class="number">4</a>
</div>