简体   繁体   English

单击时删除特定按钮(从DOM中删除)

[英]Delete particular button (from DOM) on click

DEMO DEMO

createBtns function create as many buttons as data array is long. createBtns函数创建与data数组一样长的按钮。

What I want to do is to delete (from DOM) single button when we click on it. 我想要做的就是单击我们的按钮(从DOM中)删除。 The problem is all buttons has the same class, they are all the same, except text value inside of each. 问题是所有按钮都具有相同的类,它们都相同,除了每个按钮内部的文本值。 There should be a way to get to know which button has been clicked and delete this and only one, but I don't know it. 应该有一种方法可以知道单击了哪个按钮并将其删除,只有一个按钮可以删除,但是我不知道。

There is btnClick function which should do it (it alerts for now). 有应该执行此操作的btnClick函数(它现在会发出警报)。

var data = [
  {name: "Date", value: "12/31/2018", type: "visible"},
  {name: "Car", value: "Ford", type: "visible"},
  {name: "Country", value: "Russia", type: "visible"},
  {name: "Age", value: "20", type: "visible"},
];

var outer = $(".outerPanel");

var createBtns = () => {
    for (var i = 0; i < data.length; i++) {
    var btn = $('<div class="btn"></div>');
    var name = data[i].name;
    var value = data[i].value;

    btn.html(name + ": " + value);
    btn.click(() => btnClick());
    outer.append(btn);
  }
}

var btnClick = () => {
    alert("test");
}

createBtns();

If you use const and let (block scoped rather than function scoped), you can simply reference the created btn again inside the handler and .remove() it in the closure: 如果使用constlet (块作用域而不是函数作用域),则可以简单地在处理程序中再次引用创建的btn ,并在闭包中对其进行.remove()

btn.click(() => btn.remove());

 const data = [ {name: "Date", value: "12/31/2018", type: "visible"}, {name: "Car", value: "Ford", type: "visible"}, {name: "Country", value: "Russia", type: "visible"}, {name: "Age", value: "20", type: "visible"}, ]; const outer = $(".outerPanel"); const createBtns = () => { for (let i = 0; i < data.length; i++) { const btn = $('<div class="btn"></div>'); const name = data[i].name; const value = data[i].value; btn.html(name + ": " + value); btn.click(() => btn.remove()); outer.append(btn); } } createBtns(); 
 .outerPanel { display: flex; flex-direction: row; justify-content: space-between; } .btn { width: 20%; height: 40px; border: 2px solid red; text-align: center; vertical-align: center; cursor: pointer; } .btn:hover { background: black; color: white; } 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class="outerPanel"></div> 

(without const and let , you'd have to use something like this instead - still works, but it's a lot uglier) (没有constlet ,您必须使用类似这样的东西-仍然可以使用,但是要难看得多)

You can do this like below: 您可以按照以下方式进行操作:

var btnClick = (e) => {
    // get index of clicked button relative to parent element
    var index = Array.prototype.indexOf.call(e.target.parentNode.children, e.target);
    // remove data entry in array
    data.splice(index, 1);
    // remove the clicked button
    e.target.parentNode.removeChild(e.target);
}

Updated version of your demo : 演示的更新版本:

 var data = [{ name: "Date", value: "12/31/2018", type: "visible" }, { name: "Car", value: "Ford", type: "visible" }, { name: "Country", value: "Russia", type: "visible" }, { name: "Age", value: "20", type: "visible" }, ]; var outer = $(".outerPanel"); var createBtns = () => { for (var i = 0; i < data.length; i++) { var btn = $('<div class="btn"></div>'); var name = data[i].name; var value = data[i].value; btn.html(name + ": " + value); btn.click((e) => btnClick(e)); outer.append(btn); } } var btnClick = (e) => { // get index of clicked button relative to parent element var index = Array.prototype.indexOf.call(e.target.parentNode.children, e.target); // remove data entry in array data.splice(index, 1); // refresh displayed text refreshText(); // remove the clicked button e.target.parentNode.removeChild(e.target); } var refreshText = () => { document.getElementById("dataText").innerHTML = JSON.stringify(data); } createBtns(); refreshText(); 
 .outerPanel { display: flex; flex-direction: row; justify-content: space-between; } .btn { width: 20%; height: 40px; border: 2px solid red; text-align: center; vertical-align: center; cursor: pointer; } .btn:hover { background: black; color: white; } 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class="outerPanel"></div> <h3>Data array contents</h1> <p id="dataText"></p> 

var data = [
  {name: "Date", value: "12/31/2018", type: "visible"},
  {name: "Car", value: "Ford", type: "visible"},
  {name: "Country", value: "Russia", type: "visible"},
  {name: "Age", value: "20", type: "visible"},
];

var outer = $(".outerPanel");

var createBtns = () => {
    for (var i = 0; i < data.length; i++) {
    var btn = $('<div class="btn"></div>');
    var name = data[i].name;
    var value = data[i].value;

    btn.html(name + ": " + value);
    btn.click((e) => btnClick(e));
    outer.append(btn);
  }
}

var btnClick = (e) => {
    e.currentTarget.remove()
}

createBtns();

I assume $ is JQuery? 我假设$是JQuery?

edit: (from comments) 编辑:(来自评论)

And if I'd like to also update data array, how would it look like? 如果我也想更新数据数组,它会是什么样? I mean delete the object from data when button disappears 我的意思是当按钮消失时从数据中删除对象

On this I can think of two kind of approach, the first is to embed the data into the button 关于这一点,我可以想到两种方法,第一种是将数据嵌入按钮

var data = [
  {name: "Date", value: "12/31/2018", type: "visible"},
  {name: "Car", value: "Ford", type: "visible"},
  {name: "Country", value: "Russia", type: "visible"},
  {name: "Age", value: "20", type: "visible"},
];

var outer = $(".outerPanel");

var createBtns = () => {
    for (var i = 0; i < data.length; i++) {
    var btn = $('<div class="btn"></div>');
    btn[0].data = data[i];
    var name = data[i].name;
    var value = data[i].value;

    btn.html(name + ": " + value);
    btn.click((e) => btnClick(e));
    outer.append(btn);
  }
}

var btnClick = (e) => {
    var index = data.indexOf(e.currentTarget.data);
    data = data.slice(0,index).concat(data.slice(index+1,data.length));
    e.currentTarget.remove()
}

createBtns();

the second approach is just delete the data and re-render the whole thing 第二种方法是删除数据并重新渲染整个内容

var data = [
  {name: "Date", value: "12/31/2018", type: "visible"},
  {name: "Car", value: "Ford", type: "visible"},
  {name: "Country", value: "Russia", type: "visible"},
  {name: "Age", value: "20", type: "visible"},
];

var outer = $(".outerPanel");

var createBtns = () => {
    for (var i = 0; i < data.length; i++) {
    var btn = $('<div class="btn"></div>');
    btn[0].data = data[i];
    var name = data[i].name;
    var value = data[i].value;

    btn.html(name + ": " + value);
    btn.click((e) => btnClick(e));
    outer.append(btn);
  }
}

var btnClick = (e) => {
    var index = data.indexOf(e.currentTarget.data);
    data = data.slice(0,index).concat(data.slice(index+1,data.length));
    outer[0].innerHTML = "";
    createBtns();
}

createBtns();

You can try add an event to the button, like this : 您可以尝试向按钮添加事件,如下所示:

  function addHideEvent(element) { for(i=0;i<element.length;i++) { element[i].onclick = function(e) { this.remove() } } } addHideEvent(document.getElementsByClassName("btn")) 
 <button class="btn"> CLICK HERE </button> </br> <button class="btn"> CLICK HERE </button> </br> <button class="btn"> CLICK HERE </button> </br> <button class="btn"> CLICK HERE </button> </br> 

Update 更新

removing the btn from DOM instead of CSS change 从DOM而不是CSS更改中删除btn

Solution

You can add an event listener to the button when u create it inside the for loop. 当您在for循环中创建按钮时,可以向按钮添加事件监听器。

Example code here: 示例代码在这里:

 var data = [{ name: "Date", value: "12/31/2018", type: "button" }, { name: "Car", value: "Ford", type: "button" }, { name: "Country", value: "Russia", type: "button" }, { name: "Age", value: "20", type: "button" }, ]; const createBtns = () => { for (var i = 0; i < data.length; i++) { let btn = document.createElement('input'); btn.setAttribute('class', 'btn'); btn.setAttribute('value', data[i].value); btn.setAttribute('type', data[i].type); btn.addEventListener('click', () => { document.body.removeChild(btn) }); document.body.appendChild(btn); } } createBtns(); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM