JSJQ-添加表格信息

一、事件委托

  1、event对象:事件源,不管在哪个事件中,只要你操作的那个元素就是事件源。

  2、nodeName 属性指定节点的节点名称。

  3、在以往的js事件监听中,用js动态创建的子元素是没有事件的,必须重新为它们绑定事件,但是用事件委托就不用这么麻烦了,不需要重新绑定事件依旧可以实现事件监听。

当然事件绑定也是有弊端的,因为它依赖于事件冒泡,如果不支持冒泡那么就不能实现事件绑定了,不过我认为这种几率还是不高的。还有就是会发生事件误判,比如页面中的button1和button2的作用是点击时弹出值,而button3的作用是点击是页面变色,这三个button的同一个事件实现功能不同,当你将click事件委托给它们共同的父元素那么就会出现事件误判。

  所以我认为事件委托是发生在一个子集合的事件功能相同的情况下,如果不相同则不要使用事件委托,以免弄巧成拙。

在实际开发中,掌握事件绑定对于代码的规范性以及效率会有一定提高,总的来说利大于弊。

!!! - CSS

  *{margin:0;padding:0;}
  table{border-collapse: collapse;}
  th,td{border:1px solid #ccc;padding:5px 25px; }

 

!!! -HTML

  <input type="text" id="txt" placeholder="输入姓名"/><input type="button" id="btn" value="添加"/>
  <table id="tab">
    <thead>
      <th>序号</th>
      <th>姓名</th>
      <th>年龄</th>
      <th>操作</th>
    </thead>
    <tbody>
      <tr>  
        <td>01</td>
        <td>隔行变色</td>
        <td>21</td>
        <td><a class="remove" href="#">删除</a></td>
      </tr>
      <tr>
        <td>01</td>
        <td>隔行变色</td>
        <td>21</td>
        <td><a class="remove" href="#">删除</a></td>
      </tr>
      <tr>
        <td>01</td>
        <td>隔行变色</td>
        <td>21</td>
        <td><a class="remove" href="#">删除</a></td>
      </tr>
      <tr>
        <td>01</td>
        <td>隔行变色</td>
        <td>21</td>
        <td><a class="remove" href="#">删除</a></td>
      </tr>
    </tbody>
  </table>

 

!!! -JavaScript

  window.onload=function()
  {
    var tab=document.getElementById('tab');
    var remove=document.getElementsByClassName('remove');
    var bgColor='';
    //隔行变色
    for(var i=0;i<tab.tBodies[0].rows.length;i++)
    {
      tab.tBodies[0].rows[i].onmouseover=function()
      {
        bgColor=this.style.background;
        this.style.background='green';
      }
      tab.tBodies[0].rows[i].onmouseout=function()
      {
        this.style.background=bgColor;
      }  
      if(i%2==0)
      {    
        tab.tBodies[0].rows[i].style.background='yellow';
      }
      else
      {
        tab.tBodies[0].rows[i].style.background='';
      }
    }
    for(var i=0;i<remove.length;i++)
    {
      remove[i].onclick=function()
      {
        this.parentNode.parentNode.remove();
      }
    }
    var btn=document.getElementById('btn');
    btn.onclick=function()
    {
      var aTr=document.createElement('tr');
      aTr.innerHTML='<td>555</td><td>隔行变色</td><td>21</td><td><a class="remove" href="#">删除</a></td> ';
      tab.tBodies[0].appendChild(aTr);
    }
  }

结果如下:发现添加的行,并没有变颜色,这时候就用函数了,把公共的功能用函数提曲出来

window.onload=function()
{
  var tab=document.getElementById('tab');
  var remove=document.getElementsByClassName('remove');
  var bgColor='';
  function addcolor()
  {
    for(var i=0;i<tab.tBodies[0].rows.length;i++)
    {
      tab.tBodies[0].rows[i].onmouseover=function()
      {
        bgColor=this.style.background;
        this.style.background='green';
      }
      tab.tBodies[0].rows[i].onmouseout=function()
      {
        this.style.background=bgColor;
      }
      //隔行变色
      if(i%2==0)
      {
        tab.tBodies[0].rows[i].style.background='yellow';
      }
      else
      {
        tab.tBodies[0].rows[i].style.background='';
      }
      remove[i].onclick=function(ev)
      {
        this.parentNode.parentNode.remove();
      }
    }
  }  
  addcolor();
  var btn=document.getElementById('btn');
  btn.onclick=function()
  {
    var aTr=document.createElement('tr');
    aTr.innerHTML='<td>555</td><td>隔行变色</td><td>21</td><td><a class="remove" href="#">删除</a></td> ';
    tab.tBodies[0].appendChild(aTr);
    addcolor();
  }
}

这样新添加的数据也可以删除+隔行变色+鼠标移入+鼠标移除了

这是一种思维,JS为我们提供了一种更好的做法,用事件委托

****事件委托:

  ev.target   :将事件托付给父级来做

代码如下:

window.onload=function()
{
  var tab=document.getElementById('tab');
  var bgColor='';
  var add=document.getElementById('add');
  var move=document.getElementsByClassName('remove');

  /*添加*/
  add.addEventListener('click',function(){     //addEventListener事件绑定
    var aTr=document.createElement('tr');
    aTr.innerHTML='<td>555</td><td>隔行变色</td><td>21</td><td><a class="remove" href="#">删除</a></td>';
    tab.tBodies[0].appendChild(aTr);
    geColor();
  })

  tab.onclick=function(ev)
  {
    var ev=ev||window.event;
    var target=ev.target||ev.srcElement;
    var tr=target.parentNode.parentNode.nodeName; //TR

    if(tr.toLowerCase() == 'tr')
    {
      //targetA
      target.parentNode.parentNode.remove();
    }
  }
  /*鼠标移入*/
  tab.tBodies[0].onmouseover=function (ev)
  {
    var ev=ev||window.event;
    var target=ev.target||ev.srcElement;
    var tr=target.parentNode.nodeName;//居然是tr
    if(tr.toLowerCase()=='tr')
    {
      bgColor=target.parentNode.style.background;
      target.parentNode.style.background='blue';
    }
  };

  /*鼠标移出*/
  tab.tBodies[0].onmouseout=function (ev)
  {
    var ev=ev||window.event;
    var target=ev.target||ev.srcElement;

    if(target.parentNode.nodeName.toLowerCase()=='tr')
    {
      target.parentNode.style.backgroundColor=bgColor;
    }
  };
  /*隔行变色*/
  function geColor()
  {
    for(var i=0;i<tab.tBodies[0].rows.length;i++)
    {
      if(i%2==0)
      {
        tab.tBodies[0].rows[i].style.background='#ccc';
      }
      else
      {
        tab.tBodies[0].rows[i].style.background='';
      }
    }
  }

  geColor();
}

 

这样一看,好像是完美解决问题了,但可惜,如果在每个TD上都添加A的话,会发现,点击任何一个A,都可以删除一行!!!

这个嘛............让我再想想......

 

posted @ 2017-11-30 22:42  三庙  阅读(197)  评论(0编辑  收藏  举报