这是我的代码:
const copyContent = async() => {
try {
let copyText = event.target.parentNode.lastChild.value;
let copied = event.target.nextSibling.nextSibling;
await navigator.clipboard.writeText(copyText);
console.log('Content copied to clipboard');
copied.style.animation = "appear 4s linear";
} catch (err) {
console.error('Failed to copy: ', err);
}
}
<div class="cards-container">
<div class="card">
<div class="card-container" onclick="copyContent()">
<div>
<img src="https://google.com">
<span>#1</span>
</div>
<div class="copied">
<span>Copied!</span>
</div>
</div>
<input class="link" type="text" value="https://google.com">
</div>
<div class="card">
<div class="card-container" onclick="copyContent()">
<div>
<img src="https://yahoo.com">
<span>#2</span>
</div>
<div class="copied">
<span>Copied!</span>
</div>
</div>
<input class="link" type="text" value="https://yahoo.com">
</div>
</div>
这是我得到的错误:
复制失败:TypeError:无法读取copyContent处的null属性(阅读“style”)
我知道我错在哪里了:
let copyText = event.target.parentNode.lastChild.value;
let copied = event.target.nextSibling.nextSibling;
但是我试过很多不同的组合,都不起作用。我避免使用身份证,因为我会有很多“卡”。
3条答案
按热度按时间7hiiyaii1#
需要解决的问题:
event
窗口属性,尤其是在async
函数中,该函数可能会读取事件对象以获取在调用该函数后发生的事件。event
作为参数传递给调用的函数。(如果您想知道,"event"将作为参数传递给HTML解析器根据属性的文本值生成的函数。)element.addEventListener
语法在JavaScript中添加事件处理程序。.card-container
分区中不同嵌套级别的各种子元素之一。虽然您 * 可以 * 使用closest
来查找分区,但它已经作为event.currentTarget
可用,因为这是处理事件的位置。nextSibling
,previousSibing
,firstChild
和lastChild
非常能够返回文本和HTML注解节点-这不是您在本例中想要的。在查找元素时,请使用nextElementSibling
,previousElementSibling
,firstElementChild
和lastElementChild
版本。这里是一个修改过的例子,使用了一个过渡而不是动画,因为它没有包含在帖子中。复制到剪贴板的值是卡片容器后面的
input
元素的文本内容-如果应该复制其他内容,请修改。eqqqjvef2#
首先,您没有在onclick上传递事件,它应该是
onclick="copyContent(event)"
第二,正如一些评论所提到的,
event.target
可能不是你所想的元素,onclick被附加到card-container
div和它的所有子元素上,所以如果你点击带有文本Copied!
的span,目标的图像或其他东西就会改变。可以使用
closest
方法来解决这个问题观察结果:我认为使函数异步应该是不必要的,因为也等待导航器
inn6fuwd3#
您收到的错误消息指出
event.target
是null
,这意味着事件对象没有被传递给copyContent
函数。解决这个问题的一个方法是将事件对象作为参数传递给函数。然后,在函数中,您可以引用作为参数
const copyContent = async(event) => {...
传递的事件。此外,您可以考虑在函数中使用event.currentTarget
而不是event.target
,因为差异:target是触发事件的元素(例如,用户点击),currentTarget是事件侦听器附加到的元素。另一个想法是使用querySelector来选择元素。您可以使用这个querySelector方法来选择元素,因此不必使用
parentNode
和nextSibling
。