用原生实现点击删除点击的li

简单的实现方式

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta charset="utf-8">
    <style type="text/css">
    #button{
        display:inline-block;
    }
     ul{
        list-style: none;
    }
     li{
        background-color: red;
        display:inline-block;
        width:20px;
        padding:10px;
        margin-left:3px;
        color:white;
    }
    </style>
    <script type="text/javascript">
    window.onload = function (){
        var oBtn1=document.getElementById('leftin');
        var oBtn2=document.getElementById('rightin');
        var oBtn3=document.getElementById('leftout');
        var oBtn4=document.getElementById('rightout');
        var oLi= document.getElementsByTagName('li');
        //console.log(oBtn1);
        var number=[];
        var value;
        var i=0;

        oBtn1.onclick=function(){
            //console.log(document.getElementsByTagName('input')[0].value);
            value=document.getElementsByTagName('input')[0].value;
            if(!/^[0-9]*$/.test(value))
                alert("请输入有效的数字");
            else{
                        number.unshift(value);
                        //console.log(number);
                        show();
                        for (var i = 0; i < oLi.length; i++) {
                           console.log(oLi[i]);
                           oLi[i].onclick = function(e) {
                               oUl.removeChild(e.target);
                           }
                        };
                        value = '';

                 }
        }
        oBtn2.onclick=function(){
            value=document.getElementsByTagName('input')[0].value;
            if(!/^[0-9]*$/.test(value))
                alert("请输入有效的数字");
                     else{
                        number.push(value);
                        show();
                        for (var i = 0; i < oLi.length; i++) {
                           console.log(oLi[i]);
                           oLi[i].onclick = function(e) {
                               oUl.removeChild(e.target);
                           }
                        };
                        value = '';
                 }
        }
        oBtn3.onclick=function(){
            alert(number.shift(number[number.length-1]));
            show();
        }
        oBtn4.onclick=function(){
            alert(number.pop(number[0]));
            show();
        }

     /*var i1='document.getElementById("'+i+'")';
     console.log(i1);
     i1.onclick=function(){
         var tar=parseInt(i1.getAttribute("id"));  
         number.splice(tar,1);   
         show();
         console.log(1);
         return number;
     }*/
     var oUl = document.getElementsByTagName('ul')[0];
     
     console.log(oLi.length);
     //alert(oLi.length);
     /*oLi.onclick = function() {
        console.log(1);
     }*/
     //console.log(oLi[0]);
     for (var i = 0; i < oLi.length; i++) {
         console.log(oLi[i]);
         oLi[i].onclick = function(e) {
             oUl.removeChild(e.target);
         }
     };
     function show(){
         var content=" ";
         for(i=0;i<number.length;i++){
                 content+="<li>"+number[i]+"</li>";
             }
              
         result.innerHTML=content;
     }

    };


    </script>
    
</head>
<body>
    <input id="input" type="text"> 
    <div id="button">
        <button id="leftin">左侧入</button>
        <button id="rightin">右侧入</button>
        <button id="leftout">左侧出</button>
        <button id="rightout">右侧出</button>
    </div>
     <ul id="result">
     </ul>



</body>
</html>

这种方法原理是用For循环来为li添加点击事件,然后点到它的时候去删除ul的子节点

for (var i = 0; i < oLi.length; i++) {
                           console.log(oLi[i]);
                           oLi[i].onclick = function(e) {
                               oUl.removeChild(e.target);
                           }
                        };

这里需要说明一点,为什么不用

oUl.removeChild(oLi[i]);

因为在点击oLi[i]的时候,找不到所以的li节点,而且在这里的我们耶不是想要找所有的li节点,而是想找当前的。

所以,这里可以用

oUl.removeChild(e.target);
或
oUl.removeChild(this);

在这里说一下target

target 事件属性可返回事件的目标节点(触发该事件的节点),如生成事件的元素、文档或窗口。

然后就是一种高级一点的方法

<!DOCTYPE html>
 <html>
 <head>
    <meta charset="utf-8">
    <title>task18</title>
    <style>
    #button{
         display:inline-block;
    }
   ul{
        list-style: none;
    }
     li{
        background-color: red;
       display:inline-block;
        width:20px;
         padding:10px;
      margin-left:3px;
        color:white;
    }
    </style>
 </head>
  <body>
     <input id="input" type="text">
     <div id="button">
        <button id="leftin">左侧入</button>
        <button id="rightin">右侧入</button>
        <button id="leftout">左侧出</button>
        <button id="rightout">右侧出</button>
    </div>
     <ul id="result">
     </ul>
 <script>
     var $=function(id){
       return document.getElementById(id);
     }
     var number=[];
     //给按钮的父元素添加事件委托,避免给每个按钮添加点击事件
     $("button").addEventListener("click",function(e){  
         var target=e.target,
             value=$("input").value;
         switch(target.id){
             case "leftin":{
                 if(!/^\d+$/.test(value))alert("请输入有效的数字");
                 else{
                     number.unshift(value);
                 show();
                 }
                 break;
             }
             case "rightin":{
                 if(!/^\d+$/.test(value)) alert("请输入有效的数字");
                 else{
                     number.push(value);
                     show();
                 }
                 break;
             }
             case "leftout":{
                 alert(number.shift(number[number.length-1]));
                    show();
                    break;
             }
             case "rightout":{
                 alert(number.pop(number[0]));
                 show();
                 break;
             }
         }
     })
     //给输出的结果添加事件委托,使点击的元素被删除
        $("result").addEventListener("click",function(e){
         var target=e.target;
        if(target.nodeName!="LI") return;
         var tar=parseInt(target.getAttribute("id"));   //到被点击元素的id属性,之前id绑定的是该元素在数组中的序号
         number.splice(tar,1);   //删除数组number中的元素,1代表只删除一个元素
         show();
         return number;
     })
    //将得到的用户输入数据输出显示到id为result的列表中
    function show(){
         var content=" ";
         for(var i=0;i<number.length;i++){
                 content+="<li id='"+i+"'>"+number[i]+"</li>";
             }
         result.innerHTML=content;
     }
 </script>
 </body>
</html>

它的主要亮点是删除数组中的对应项来达到删除li的效果

$("result").addEventListener("click",function(e){
         var target=e.target;
        if(target.nodeName!="LI") return;
         var tar=parseInt(target.getAttribute("id"));   //到被点击元素的id属性,之前id绑定的是该元素在数组中的序号
         number.splice(tar,1);   //删除数组number中的元素,1代表只删除一个元素
         show();
         return number;

这个代码还有一个亮点就是用了case语句,从而只添加了一个监听事件。

写这个小dome给我的感受是,我在写代码的过程中多思考的是html中元素的问题。插入和删除我都会从删除文本节点的方面去考虑,对js的应用处于表层,而别人的代码,则是基于一些js自带的函数考虑,更符合一门编程语言。这是我以后需要学习的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • (续jQuery基础(1)) 第5章 DOM节点的复制与替换 (1)DOM拷贝clone() 克隆节点是DOM的常...
    凛0_0阅读 1,316评论 0 8
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,434评论 25 707
  • 今天面试回来,稍微整理下今天被问到的题目,呀,回答的是乱七八糟,最后百度整理下,以供以后学习。 1,vue 中事件...
    AlisaMfz阅读 476评论 0 0