问题描述
您好,我是 javascript 新手,但我尽我所能编写了一个 javascript 来复制 <p></p>
中的文本。但是根据我的 javascript,我需要为不同的 <p></p>
元素保留不同的 id。供参考
function copyToClipboard(var1,btn){
let val = document.getElementById(var1).innerHTML;
const selBox = document.createElement('textarea');
selBox.style.position = 'fixed';
selBox.style.left = '0';
selBox.style.top = '0';
selBox.style.opacity = '0';
selBox.value = val;
document.body.appendChild(selBox);
selBox.focus();
selBox.select();
document.execCommand('copy');
document.body.removeChild(selBox);
let item = btn.parentNode.querySelector(".invisible");
if (item) {
item.classList.remove("invisible");
setTimeout(function() {
item.classList.add("invisible");
},400);
}
}
我的HTML
<div class="Engstatus">
<h2 class="statusheading">Latest English Status</h2>
<div class="englishstatus">
<div class="car">
<div class="latestatus">
<p id="p9">life os good when hou have books</p>
<button class="copystatus btn" onclick="copyToClipboard('p9',this)">copy</button>
<span class="copystatusalert invisible">copied!</span>
</div>
<div class="latestatus">
<p id="p10">Google is a open source library. It is a open source by lary page and sergy brime</p>
<button class="copystatus btn" onclick="copyToClipboard('p10',this)">copy</button>
<span class="copystatusalert invisible">copied!</span>
</div>
</div>
<div class="car">
<div class="latestatus">
<p id="p11">Cat is better than dog</p>
<button class="copystatus btn" onclick="copyToClipboard('p11',this)">copy</button>
<span class="copystatusalert invisible">copied!</span>
</div>
<div class="latestatus">
<p id="p12">Cat is better than dog</p>
<button class="copystatus btn" onclick="copyToClipboard('p12',this)">copy</button>
<span class="copystatusalert invisible">copied!</span>
</div>
</div>
</div>
</div>
我的 CSS
.invisible {
display: none;
animation: slideInFromright 1s ease-in;
}
.copystatusalert{
position: relative;
background-color: #18b495;
color: #ffffff;
margin-left: 10px;
padding: 10px 10px;
border-radius: 10px;
z-index: 2;
opacity: 1;
pointer-events: none;
transition: opacity 0.4s,margin-top 0.4s;
text-align: center;
我的 CSS 仅供参考。 PLZZ 帮助我先生在这里呆了一个星期并且厌倦了搜索结果。主要是提前谢谢你。
解决方法
那么问题是什么?究竟是什么问题?听起来您已经回答了自己的问题,但不确定自己想要做什么?
在 DOM 中,元素 id 必须是唯一的 - 这不是您可以更改的,对多个元素使用相同的 id 是无效的 HTML。
document.getElementById(id)
返回单个元素。如果 DOM 中有多个具有相同 id 的元素,它只会返回第一个。
如果元素的 id 相同并且您使用 document.getElementById,它怎么知道您想要第一个、第二个还是第三个?
由于您将“this”传递给函数,因此您可以获取传入元素的父元素,然后在该父元素中搜索 p 元素并获取其内部文本。
this.parentElement.getElementsByTagName('p')[0].textContent
这假设只有一个段落元素,并且您的布局将与您在此处显示的一样一致。
或者使用默认事件:
function copyToClipboard(event){
let val = event.target.parentElement.getElementsByTagName('p')[0].textContent;
const selBox = document.createElement('textarea');
selBox.style.position = 'fixed';
selBox.style.left = '0';
selBox.style.top = '0';
selBox.style.opacity = '0';
selBox.value = val;
document.body.appendChild(selBox);
selBox.focus();
selBox.select();
document.execCommand('copy');
document.body.removeChild(selBox);
let item = btn.parentNode.querySelector(".invisible");
if (item) {
item.classList.remove("invisible");
setTimeout(function() {
item.classList.add("invisible");
},400);
}
}
<div class="Engstatus">
<h2 class="statusheading">Latest English Status</h2>
<div class="englishstatus">
<div class="car">
<div class="latestatus">
<p id="p9">life os good when hou have books</p>
<button class="copystatus btn" onclick="copyToClipboard">Copy</button>
<span class="copystatusalert invisible">Copied!</span>
</div>
<div class="latestatus">
<p id="p10">Google is a open source library. It is a open source by lary page and sergy brime</p>
<button class="copystatus btn" onclick="copyToClipboard">Copy</button>
<span class="copystatusalert invisible">Copied!</span>
</div>
</div>
<div class="car">
<div class="latestatus">
<p id="p11">Cat is better than dog</p>
<button class="copystatus btn" onclick="copyToClipboard">Copy</button>
<span class="copystatusalert invisible">Copied!</span>
</div>
<div class="latestatus">
<p id="p12">Cat is better than dog</p>
<button class="copystatus btn" onclick="copyToClipboard">Copy</button>
<span class="copystatusalert invisible">Copied!</span>
</div>
</div>
</div>
</div>
更新:为了避免在 html 中设置 onClick,您可以通过 javascript 来完成:
const buttons = document.getElementByClassName("copystatus");
for (const button in buttons) {
button.onClick = copyToClipboard;
}
这假设“copystatus”类只会在那些按钮上,否则你需要派生自己的选择器,它只会解析你想要的按钮。