使用其中的按钮删除 dom 元素,vanilla JS
Delete a dom element using a button within it, vanilla JS
我对此很陌生,一直在寻找一种方法来制作一个带有分配的 eventListener 的 'delete' 按钮,以删除它与 (li) 相关的元素。
我还不太了解 JS,所以这可能不是最好的方法,但这就是我目前所掌握的:
一个简单的HTML
<h1>The List</h1>
<ul>
<li>Delete me<button id="del">x</button></li>
<li>Delete me too<button id="del">x</button></li>
</ul>
我想让每个 'del' 按钮删除其父级 - 'li' 嵌套此按钮的地方..我想编写一个可重用的函数。
我大概知道我需要“使单击功能删除父项 (ul) 的子项 (li)”。如何将特定的 'li' 与嵌套在其中的 'button' 连接起来?
我也在想也许可以循环给它一个唯一的ID或一个数字..我在这里有点迷路,考虑到我真的很新而且不会做,你能建议我可以做什么吗任何框架,只是希望能够在 JS 中完成。
我做这个是为了尝试,但这太具体了,最终它需要在不知道顺序的情况下对它们中的任何一个重复使用:
const parent = document.getElementsByTagName('ul')[0];
const child = parent.getElementsByTagName('li')[0];
const del = document.getElementById('del');
function removeMe() {
parent.removeChild(child);
}
del.addEventListener('click', removeMe);
谢谢!
因为您想在多个按钮上添加相同的逻辑,所以您应该使用 classes
而不是 ids
。 ID 应该是唯一的。使用 Element.closest() 您可以从发生点击的位置找到最近的父级,直到找到与提供的选择器字符串匹配的节点。在此处阅读代码示例中的注释
const deleteButtons = document.querySelectorAll('.del'); // will give you an array of buttons
deleteButtons.forEach( button => {
button.addEventListener('click', removeMe); // add the event listener to each button
});
function removeMe() {
this.closest('li').remove(); // this is the button, from there you want to move up in DOM and find the closes <li> to remove
}
<h1>The List</h1>
<ul>
<li>Delete me<button class="del">x</button></li>
<li>Delete me too<button class="del">x</button></li>
</ul>
正如其他人所说,元素 ID should be unique in the document。
使用 event delegation and use a data-attribute 识别应激活删除的按钮。
document.addEventListener('click', evt => {
const origin = evt.target;
if (+origin.dataset.deleteparent) {
origin.closest("li").remove();
}
});
/*
--explained--
const origin = evt.target;
^ where did the click originated?
if (+origin.dataset.deleteparent)
^ ^ only if the button contains data-deleteparent attribute
^ convert data-attribute value to Number.
If it's not there, or 0, nothing will happen
origin.closest("li").remove();
^ parent li ^
^ remove it
}
*/
button[data-deleteparent] { color: red; border: none; background-color: transparent; cursor: pointer}
<h1>The List</h1>
<ul>
<li>Delete me <button data-deleteparent="1">✘</button></li>
<li>Delete me too <button data-deleteparent="1">✘</button></li>
<li>Delete me not <button>Do not delete</button></li>
</ul>
只需使用 DOM 节点的 parentElement
属性。
此外,如上所述 - 在您的情况下,您应该使用 class
es 而不是 id,因为 id
必须是唯一的。
const buttons = document.querySelectorAll('.rm-button');
function rmParent() {
this.parentElement.remove();
}
buttons.forEach(button => {
button.addEventListener('click', rmParent);
});
<h1>The List</h1>
<ul>
<li>Delete me<button class="rm-button">x</button></li>
<li>Delete me too<button class="rm-button">x</button></li>
</ul>
我对此很陌生,一直在寻找一种方法来制作一个带有分配的 eventListener 的 'delete' 按钮,以删除它与 (li) 相关的元素。
我还不太了解 JS,所以这可能不是最好的方法,但这就是我目前所掌握的:
一个简单的HTML
<h1>The List</h1>
<ul>
<li>Delete me<button id="del">x</button></li>
<li>Delete me too<button id="del">x</button></li>
</ul>
我想让每个 'del' 按钮删除其父级 - 'li' 嵌套此按钮的地方..我想编写一个可重用的函数。
我大概知道我需要“使单击功能删除父项 (ul) 的子项 (li)”。如何将特定的 'li' 与嵌套在其中的 'button' 连接起来?
我也在想也许可以循环给它一个唯一的ID或一个数字..我在这里有点迷路,考虑到我真的很新而且不会做,你能建议我可以做什么吗任何框架,只是希望能够在 JS 中完成。
我做这个是为了尝试,但这太具体了,最终它需要在不知道顺序的情况下对它们中的任何一个重复使用:
const parent = document.getElementsByTagName('ul')[0];
const child = parent.getElementsByTagName('li')[0];
const del = document.getElementById('del');
function removeMe() {
parent.removeChild(child);
}
del.addEventListener('click', removeMe);
谢谢!
因为您想在多个按钮上添加相同的逻辑,所以您应该使用 classes
而不是 ids
。 ID 应该是唯一的。使用 Element.closest() 您可以从发生点击的位置找到最近的父级,直到找到与提供的选择器字符串匹配的节点。在此处阅读代码示例中的注释
const deleteButtons = document.querySelectorAll('.del'); // will give you an array of buttons
deleteButtons.forEach( button => {
button.addEventListener('click', removeMe); // add the event listener to each button
});
function removeMe() {
this.closest('li').remove(); // this is the button, from there you want to move up in DOM and find the closes <li> to remove
}
<h1>The List</h1>
<ul>
<li>Delete me<button class="del">x</button></li>
<li>Delete me too<button class="del">x</button></li>
</ul>
正如其他人所说,元素 ID should be unique in the document。
使用 event delegation and use a data-attribute 识别应激活删除的按钮。
document.addEventListener('click', evt => {
const origin = evt.target;
if (+origin.dataset.deleteparent) {
origin.closest("li").remove();
}
});
/*
--explained--
const origin = evt.target;
^ where did the click originated?
if (+origin.dataset.deleteparent)
^ ^ only if the button contains data-deleteparent attribute
^ convert data-attribute value to Number.
If it's not there, or 0, nothing will happen
origin.closest("li").remove();
^ parent li ^
^ remove it
}
*/
button[data-deleteparent] { color: red; border: none; background-color: transparent; cursor: pointer}
<h1>The List</h1>
<ul>
<li>Delete me <button data-deleteparent="1">✘</button></li>
<li>Delete me too <button data-deleteparent="1">✘</button></li>
<li>Delete me not <button>Do not delete</button></li>
</ul>
只需使用 DOM 节点的 parentElement
属性。
此外,如上所述 - 在您的情况下,您应该使用 class
es 而不是 id,因为 id
必须是唯一的。
const buttons = document.querySelectorAll('.rm-button');
function rmParent() {
this.parentElement.remove();
}
buttons.forEach(button => {
button.addEventListener('click', rmParent);
});
<h1>The List</h1>
<ul>
<li>Delete me<button class="rm-button">x</button></li>
<li>Delete me too<button class="rm-button">x</button></li>
</ul>