【问题标题】:How to create a remove/delete function button in javascript? Button that can delete an element如何在 javascript 中创建删除/删除功能按钮?可以删除元素的按钮
【发布时间】:2018-05-18 05:41:14
【问题描述】:

我在HTML 中有一个表格。这是我的代码:

    <div id="format">
         <form id="myForm" onsubmit="myForm(event)">
         <b>Name:</b></br>
         <input type="text" name="name" id="name"  required="required" ></input></br>
         <b>Phone Number:</b></br>
         <input type="phone" name="phone" id="phone"  required="required" ></input></br>
        <b>Birthday:</b></br>
        <input type="date" name="bday" id="bday" required="required" ></input></br>
        <b>Email:</b></br>
        <input type="email" name="email" id="email"  required="required" ></input></br>
        <b>Password:</b></br>
        <input type="password" name="pWord" id="pWord" required" ></input></br>
        <button type="submit" name="submit" id="submit" value="Submit" onsubmit="myData()" >Submit</button>

    </form>
        <div id="sample"></div>
</div>

这是我的Javascript 代码。在这段代码中,当我从 html 触发提交按钮时,它将显示用户的信息,并为每个用户提交的信息附加一个 div。

var data = [];
var i, item;

function myForm(event){
    event.preventDefault();
    var name = document.getElementById("name").value;
    var phone = document.getElementById("phone").value;
    var bday = document.getElementById("bday").value;
    var email = document.getElementById("email").value;
    var pWord = document.getElementById("pWord").value;
    var age = document.getElementById("bday").value;
    var ageValue;




    var Bdate = document.getElementById("bday").value;
    var Bday = +new Date(Bdate);
    ageValue = ~~ ((Date.now() - Bday) / (31557600000));
    var theBday = document.getElementById("age");
    theBday.innerHTML = ageValue;


    var userObject = {
        name: name,
        phone: phone,
        bday: bday,
        email: email,
        pWord: pWord,
        ageValue: ageValue,

    };
       data.push(userObject);

        document.getElementById("sample").innerHTML = ""; //Prevents duplicate
        for (var i=0 ; i <data.length ; i++){
            var theDiv ;
            var container ;
            var button;

            theDiv = document.createElement( "div" );
            button = document.createElement( "button");
            button.setAttribute("id", "remove");
            button.remove(sample);
            theDiv.style = "background-color:pink; border-style:solid; margin:1%;";

            for (item in data[i]) {
                var x = item + ":" + data[i][item] + "</br>" ;              

                theDiv.innerHTML += item + ":" + data[i][item] + "</br>" ;

            }
            button.innerHTML += "Remove";   
            button.style = "background-color:maroon; color:white;"; 

            container = document.getElementById( "sample" );
            container.appendChild( theDiv );
            theDiv.appendChild (button);
        }


    console.log(data);

}

我想为每个附加的div 创建一个按钮。该按钮将具有删除该按钮所在的整个div的功能。

【问题讨论】:

  • 避免using "for...in" to iterate over an array。不要尝试将相同的id 属性分配给多个元素。 `button.remove(sample);` 是伪代码。您是否尝试过实施它?按钮的data[] 数组中的userObject 条目是否也应该被删除?
  • 好的,我知道了,抱歉我不熟悉伪代码。如果按钮被触发,则 data[] 数组中的 userObject 条目应删除

标签: javascript html arrays button


【解决方案1】:

从列表中正确删除对象的一个​​相当简单的算法是在每个删除按钮上提供一个data- attribute value,以在数据数组中给出其原始索引。 (下面使用的属性名称是data-index)。

然后把添加对象的内联代码变成三个函数来

  • (重新)绘制 所有 保存在 data 数组中的对象。
  • 将单个对象添加到data 并重绘所有对象。
  • 从数据数组中移除一个对象(编码为移除按钮onclick处理程序)并重绘所有对象。

添加新对象时,代码已经重绘了所有对象,因此在删除对象时重绘所有对象可以保持同样的简单性。


简化形式的示例代码:

"use strict";
var data = [];

function myFormData(event){

    // halper functions
    function addData( userObject) {
        data.push(userObject);
        redrawList();
    }
    function removeData( event) {
       var index = this.getAttribute("data-index");
       data.splice( index,1);
       redrawList();
    }
    function redrawList() {
        var container = document.getElementById( "sample" );
        container.innerHTML = ""; // reset list displayed on page
        for (var index=0 ; index <data.length ; index++){
            var theDiv = document.createElement( "div" );
            var divHTML = "";
            var button = document.createElement( "button");
            var userObject = data[index];

            for( var item in userObject) {
                if( !userObject.hasOwnProperty( item)) {
                     continue; // ignore inherited properties
                }
                divHTML +=  item + ":" + userObject[item] + "</br>" ;
            }
            theDiv.innerHTML = divHTML;
            theDiv.style = "background-color:pink; border-style:solid; margin:1%;";
            button.type="button";
            button.setAttribute("data-index", index);
            button.innerHTML = "remove";
            button.style = "background-color:maroon; color:white;";
            button.onclick=removeData;   
            theDiv.appendChild (button);
            container.appendChild( theDiv );
        }
    }

    //  handle form submit event to add an event
    event.preventDefault();
    // cut down form:
    var name = document.getElementById("name").value;
    var userObject = {
        name: name
    };
    addData( userObject);
    // console.log(data);  // not used in code example
}
<div id="format">
  <form id="myForm" onsubmit="myFormData(event);">
    <b>Name:</b></br>
    <input type="text" name="name" id="name"  required="required" ></input></br>
    <button type="submit" name="submit" id="submit" value="Submit"
      onsubmit="myFormData(event)" >Submit</button>
  </form>
  <div id="sample">
  </div>
</div>

请注意,代码使用getAttribute("data-index"),以防目标浏览器对element.dataset 的支持未知或不存在。函数名称 myFormmyData 已更改为 myFormData,因为我认为它们是相同的函数。

可能的问题:清除示例列表防止重复的现有代码注释是错误的。在示例代码中,多次单击提交按钮会添加同一个用户。在将用户添加到列表时,您可以添加测试以检查重复的电子邮件地址,但此类代码超出了此问题的范围。您还可以考虑在将数据添加到“样本”列表后重新设置表单。

【讨论】:

  • 程序稳定。谢谢。我可以再问一个问题吗?我想使用 console.log 来显示已删除用户的详细信息 例如我输入了 3 个用户用户 1:John 用户 2:Matt 用户 3:Joy 然后我删除了 Matt,我希望用户 2 显示在控制台中。谢谢
  • 这应该很容易 - 但请尝试编写一些代码来自己完成。研究算法以理解它应该有助于确定将代码放在哪里。有关更多信息,请参阅help center 中的“询问”。
  • 我已经这样做了。哈哈哈,发现代码真是太好了。我是数组和循环的初学者。谢谢
【解决方案2】:

检查fiddler,我已使用单个值“名称”实现。

var data = [];
var i, item;

function myForm(event){
    event.preventDefault();
    var name = document.getElementById("name").value;
   
    var userObject = {
        name: name
        };
       data.push(userObject);

        document.getElementById("sample").innerHTML = ""; //Prevents duplicate
        for (var i=0 ; i <data.length ; i++){
            var theDiv ;
            var container ;
            var button;
            var index;

            theDiv = document.createElement( "div" );
            button = document.createElement( "button");
            index = document.createElement("input");
            index.setAttribute('hidden', 'true');
            button.setAttribute("id", "remove");
            button.setAttribute("onclick", "removeItem(this)");            

            for (item in data[i]) {
            	var x = item + ":" + data[i][item] + "</br>" ;              
                theDiv.innerHTML += item + ":" + data[i][item] + "</br>" ;
                index.value += i; 

            }
            button.innerHTML += "Remove";   
           
            container = document.getElementById( "sample" );
            container.appendChild( theDiv );
            theDiv.appendChild (button);
            theDiv.appendChild(index);
        }
}
function removeItem(event){
	let el = event;
    let index = el.parentNode.lastElementChild.value;
    el.parentElement.remove();
    data.splice(index,1);
}
   <div id="format">
         <form id="myForm" onsubmit="myForm(event)">
         <b>Name:</b>
         <input type="text" name="name" id="name"  required="required" >
        
        <button type="submit" name="submit" id="submit" value="Submit" onsubmit="myData()" >Submit</button>

    </form>
        <div id="sample"></div>
</div>

【讨论】:

  • 好的,我现在明白了。谢谢! :D
  • 未完全调试。隐藏输入中的值是创建样本时的data[] 索引。如果您稍后删除数组中的先前条目,这不是恒定的。如果您从第一个开始“删除”元素,然后添加另一个条目,则从示例容器中删除的数据条目的条目(而不是数据数组)重新出现。
  • @traktor53 是的,程序中似乎存在错误。我试过了,时间过去了,一些应该删除的数据重新出现并替换了其他数据
  • @akhilaravind 当我控制台你的程序时,我注意到数组中的对象存在一些问题,程序只删除数组中的当前 [0] 索引,无论我选择删除什么 div ,它只在 html 方面专门删除,而不是在控制台日志中。不管怎样,谢谢你的努力,我很感激。
猜你喜欢
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2021-04-22
  • 2021-10-12
  • 2016-02-29
  • 1970-01-01
相关资源
最近更新 更多