javascript - 如何使用事件传播将两个跨度标签与 Javascript 连接起来?
问题描述
我有以下代码:
document.querySelector('.test').addEventListener('keyup', function(event) {
if (event.target.className === "badge alert-info village"){
const elementsToChange = document.querySelectorAll('.badge alert-info village');
for (let i = 0; i < elementsToChange.length; i++) {
const currentElement = elementsToChange[i];
currentElement.innerText = event.target.innerText;
}
}
});
span.badge[contenteditable] {
display: inline-block;
}
span.badge[contenteditable]:empty::before {
content: attr(data-placeholder);
display: inline-block;
}
span.badge[contenteditable]:empty:focus::before {
content: attr(data-focused-advice);
}
<!DOCTYPE html>
<html lang="en">
<head>
<title>Document</title>
<link rel="stylesheet" href="./static/style.css">
</head>
<body>
<p class="test">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Temporibus, beatae!
<span contenteditable="true" class="badge alert-info name" data-placeholder="Enter your name" data-focused-advice="Start typing"></span><i class="fa fa-lg fa-plus-circle"></i>
Lorem ipsum dolor sit, amet consectetur adipisicing elit. Perspiciatis, laboriosam?
<span contenteditable="true" class="badge alert-info village" data-placeholder="Enter your village" data-focused-advice="Start typing"></span><i class="fa fa-lg fa-plus-circle"></i>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Voluptate, deleniti.
<span contenteditable="true" class="badge alert-info name" data-placeholder="Enter your name" data-focused-advice="Start typing"></span><i class="fa fa-lg fa-plus-circle"></i>
Lorem ipsum dolor sit amet.
<span contenteditable="true" class="badge alert-info village" data-placeholder="Enter your village" data-focused-advice="Start typing"></span><i class="fa fa-lg fa-plus-circle"></i>
Lorem ipsum, dolor sit amet consectetur adipisicing.
</p>
</body>
</html>
我试图实现的期望行为是,如果用户在任何带有“名称”类的跨度标签上输入她的名字,其他人会自动完成但不是带有“村庄”类的跨度标签,反之亦然。
这对于用户需要在多个位置输入她的姓名的表单很有用。无论她在哪里输入,其他所有内容也会更新。
我认为这个简单的 javascript 函数可以解决问题,但我显然遗漏了一些东西,因为它不起作用。
解决方案
你真的很亲近!首先 - 将类选择器更改const elementsToChange = document.querySelectorAll('.badge alert-info village');
为
.badge.alert-info.village
. 这样就可以找到了。其次,稍微调整一下,当您遍历需要更改的元素时,您需要排除当前正在编辑的元素。如果你不这样做,你会得到一些有趣的结果=)我没有做这name
部分,因为除了类名之外它应该与村庄相同。
let item = document.querySelector('.test');
item.addEventListener('keyup', function(event) {
if (event.target.className === "badge alert-info village"){
const elementsToChange = document.querySelectorAll('.badge.alert-info.village');
for (let i = 0; i < elementsToChange.length; i++) {
const currentElement = elementsToChange[i];
if(currentElement != document.activeElement){ //excluding current element
currentElement.innerText = event.target.innerText;
}
}
}
});
推荐阅读
- javascript - 正则表达式到特定字符串
- javascript - 如何仅在地图中执行所有等待之后才增加变量值,以便我可以执行承诺并行?
- python - Python 列表循环
- php - PHP / SQL:如果在表A和表B中更新后满足条件,则更新表C
- php - 如何从发送用户个人资料更改电子邮件中排除 WooCommerce 结帐?
- scala - 辅助构造函数调用似乎是未定义的方法
- php - 如何修改此 PHP 代码以将数据发送到服务器上的 json 文件,如下所示 json 格式
- akka - java - 如何在java中使用akka actor将消息发布到一个actor实例
- android - 尝试将 Eclipse ADT 项目导入 android studio 但 gradle 失败
- ios - 在 Swift 中打开带有自动填充号码的电话应用程序