javascript - 为每个元素添加复选框
问题描述
div
所以我是 JavaScript 的新手,并且正在努力使用“用户列表”为每个元素添加复选框id
。
这是我的 HTML:
<div id="userlist"> //Here's the element with the ID "userlist"
<div class="user me" id="user_9a9pkmz43nkp6t3rr383xlzcj99xmi4m">
<div class="buttonholder">
<div class="button color" style="background-color: rgb(0, 0, 0);">
</div>
<div class="button tool eyes"></div> </div>
<div class="usertext"><span class="username" style="text-decoration: none;">from Prairie Village, United States</span> <span id="chat">send chat msg</span></div>
</div>
<div class="user" id="user_7ku2rum35ko7nddwdpjd2c53zordfzzd">
<div class="buttonholder">
<div class="button color" title="click to show last line drawn by user" style="background-color: rgb(77, 255, 112);"></div>
<div class="button tool eyes"></div> </div>
<div class="usertext"><span class="username">Imp</span> <span class="ignore">ignore</span><span class="rename">rename</span></div>
</div>
<div class="user" id="user_id6rwedzewineum8t2f6xf2dbqejorfs" style="display: none;">
<div class="buttonholder">
<div class="button color" title="click to show last line drawn by user" style="background-color: rgb(255, 255, 255);"></div>
<div class="button tool eyes"></div> </div>
<div class="usertext"><span class="username">from an unknown place</span> <span class="ignore">ignore</span><span class="rename">rename</span></div>
</div>
</div>
所以我可以以某种方式为每个带有“用户”类的元素添加一个复选框,并在选中该复选框时获取该类的 ID 值,然后将该值记录到控制台?所以如果它得到检查。它会记录该类的 Id 值吗?
到目前为止,这是我设法刮掉的。我想以某种方式使用这个基本布局。请注意,这不起作用,这就是我在这里寻求帮助的原因。请不要对我太苛刻。
var muteArray = {};
var users = document.getElementById("userlist");
users.addEventListener('DOMSubtreeModified', function() {
muteArray = {};
for (let i = 0; i < users.childNodes.length; i++) {
if (users.childNodes[i].getElementsByClassName("mute")[0]) {
if (users.childNodes[i].getElementsByClassName("mute")[0].checked)
{
console.log(muteArray) // Log the selected users Id value :( doesn't
work.
};
} else {
let checkbox = document.createElement('input');
checkbox.className = "mute";
checkbox.type = "checkbox";
checkbox.style.width = "30px";
checkbox.style.height = "30px";
checkbox.addEventListener('change', function() {
if (this.checked) {
console.log("") //Maybe log Id's value here?
} else {
console.log("something")
};
});
users.childNodes[i].insertBefore(checkbox, users.childNodes[i].getElementsByClassName("user")[0]);
};
所以如果一个元素的复选框被选中。做一个功能。该函数将记录该类的 Id 值。
解决方案
首先考虑使用 MutationObserver 而不是 DOMSubtreeModified - MutationObserver 要快得多,并且不推荐使用 DOMSubtreeModified。
在 MutationObserver 回调中,用于querySelectorAll
查找.user
还没有复选框的 s。(简而言之,在添加复选框时,将data-
属性添加到.user
,以便.user
具有该data-
属性的 s 以后不会再次迭代。)只需插入复选框即可进行回调。
要监听动态插入元素上的复选框更改事件,请使用事件委托:监听父change
级上的事件,. 在用户列表中选中的复选框将触发事件,这些事件将冒泡到用户列表,并且侦听器可以检查触发的事件是否来自您的用户脚本创建的元素之一 - 如果是,只需从事件目标导航(复选框)到它的父母,然后你可以记录父母的ID。userlist
const userlist = document.querySelector('#userlist');
new MutationObserver(() => {
userlist.querySelectorAll('.user:not([data-has-checkbox])').forEach((userDiv) => {
const checkbox = userDiv.insertBefore(document.createElement('input'), userDiv.children[0]);
checkbox.type = 'checkbox';
userDiv.dataset.hasCheckbox = true;
});
}).observe(userlist, { childList: true });
userlist.innerHTML = `
<div class="user me" id="user_9a9pkmz43nkp6t3rr383xlzcj99xmi4m"><div>content 1</div></div>
<div class="user" id="user_7ku2rum35ko7nddwdpjd2c53zordfzzd"><div>content 2</div></div>
<div class="user" id="user_id6rwedzewineum8t2f6xf2dbqejorfs" style="display: none;"><div>content 3</div></div>
`;
setTimeout(() => {
userlist.insertAdjacentHTML(
'beforeend',
`<div class="user" id="user_7ku2rum35ko7nddwdpjd2c53zordfzzd"><div>content 4</div></div>`
);
}, 2500);
userlist.addEventListener('change', ({ target }) => {
if (target.matches('.user > input[type="checkbox"]')) {
const userDiv = target.parentElement;
console.log(userDiv.id);
}
});
.user {
border: 1px solid black;
}
<div id="userlist">
</div>
推荐阅读
- docker - 单独卷容器的原因
- apache - 如何使用 htaccess 在单个页面上禁用 https 重定向
- xcode - Xcode 加减平均值
- vue.js - Vuetify - 使用实际应用程序宽度而不是视口作为断点
- postgresql - 如何在 Postgres 中显示有关已创建扩展的信息?
- asp.net-core - 带有部分视图的模态上的 Onclick 事件不起作用
- c# - 使用表列的文本框自动完成整数类型
- react-native - ReactNative0.63 无法使用 Xcode11.6 运行 yarn ios
- azure - Microsoft Graph - 后台进程中的委派访问
- javascript - 我想在本地下载正在发送到服务器的数据