JS的Dom与事件小结

  dom对象的innerText和innerHTML有什么区别?
 
  innerHTML指的是从对象的起始位置到终止位置的全部内容,包括Html标签。
 
  innerText指的是从起始位置到终止位置的内容,但它去除Html标签。
 
  elem.children和elem.childNodes的区别?
 
  Node(节点)是DOM层次结构中的任何类型的对象的通用名称,Node有很多类型,如元素节点,属性节点,文本节点,注释节点等。Element继承了Node类,也就是说Element是Node多种类型中的一种,即当NodeType为1时Node即为ElementNode,另外Element扩展了Node,Element拥有id、class、children等属性。children是Element的属性,childNodes是Node的属性。
 
  查询元素有几种常见的方法?
 
  常见的获取元素的方法有3种,分别是通过元素ID、通过标签名字和通过类名字来获取。
 
  1.getElementById
 
  DOM提供了一个名为getElementById的方法,这个方法将返回一个与之对应id属性的节点对象。
 
  2.getElementsByTagName
 
  该方法返回一个对象数组(准确的说是HTMLCollection集合,它不是真正意义上的数组),每个对象分别对应着文档里有着给定标签的一个元素。类似于getElementById,同样,该方法只提供一个参数,它的参数是指定标签的名字。
 
  3.getElementsByClassName
 
  除了通过指定标签获取元素外,DOM还提供了getElementsByClassName方法来获取指定class名的元素。
 
  如何创建一个元素?如何给元素设置属性?
 
  1.createElement(name)创建元素节点
 
  createElement()是Document对象中的方法,该方法会根据指定的元素名称name,返回一个Element对象。
 
  2.设置创建元素节点的属性
 
  创建元素后,我们可能需要设置元素属性,如:给元素设置CSS样式、添加点击事件等。设置元素属性可以使用Element对象的setAttribute方法,也可以使用属性名设置。
 
  3.将元素节点插入到DOM文档的指定位置
 
  元素创建后,需要将元素节点插入到DOM文档的指定位置,添加元素使用Element对象的appendChild()方法或insertBefore()方法。appendChild()
 
  方法的作用是向元素添加新的子节点,被添加的子节点将作为其最后一个子节点。insertBefore()方法的作用是在已有的节点之前插入新节点,被添加的节点会做为同级节点。
 
  元素的添加、删除?
 
  元素的添加:使用createElement来添加元素
 
  元素的删除:如需删除HTML元素,您必须首先获得该元素的父元素,然后用removeChild来删除对应元素。
 
  DOM0事件和DOM2级在事件监听使用方式上有什么区别?
 
  DOM0事件:DOM0事件是指直接将事件绑定在节点上,一个节点只能绑定一个事件,不然后面的灰覆盖前面的。
 
  varoBtn=document.querySelctor('#btn');
 
  oBtn.onclick=function(){
 
  console.log('a')
 
  };
 
  DOM2事件:DOM2级事件可以对一个元素绑定多个事件,后面的事件不会覆盖前面事件;可以通过参数true、false来设置事件在冒泡阶段或者捕获阶段触发事件。使用removeEventListener来删除事件。
 
  oBtn.addEventListener("click",function(){
 
  });
 
  oBtn.removeEventListener("click",fn,false);
 
  attachEvent与addEventListener的区别?
 
  1.addEventListener和attachEvent的兼容性问题
 
  addEventListener是符合W3C规范的事件绑定方法,FireFox、Chrome、Safari都是用它来绑定事件。
 
  attachEvent是IE私有的,不符合W3C规范,而且在IE下,只能使用它来绑定事件,addEventListener是无效的。
 
  所以,要想绑定事件,必须处理兼容性问题。
 
  2.addEventListener和attachEvent的语法规则
 
  addEventListener共有3个参数:element.addEventListener(type,listener,useCapture)
 
  attachEvent共有2个参数:element.attachEvent(type,listener);
 
  3.代码兼容处理
 
  functionregEvent(ele,event_name,fun)
 
  {
 
  if(window.attachEvent)
 
  ele.attachEvent(event_name,fun);//IE浏览器
 
  else
 
  {
 
  event_name=event_name.replace(/^on/,“”);//如果on开头,删除on,如onclick->click
 
  ele.addEventListener(event_name,fun,false);//非IE浏览器
 
  }
 
  }
 
  解释IE事件冒泡和DOM2事件传播机制?
 
  IE事件冒泡:事件发生在触发元素上,从触发元素开始,事件向父元素一级一级传递,直到html元素。
 
  DOM2事件:事件传播分3个阶段,捕获阶段,处于事件目标阶段,冒泡阶段。事件监听程序只能选择在捕获阶段或者冒泡阶段其中的一个阶段执行。
 
  捕获阶段:事件发生时,先从根节点开始传递,一级一级向下找,知道目标元素。
 
  冒泡阶段:从触发元素开始,事件向父元素一级一级传递,直到html元素
 
  如何阻止事件冒泡?如何阻止默认事件?
 
  阻止事件冒泡:w3c的方法是e.stopPropagation(),IE则是使用e.cancelBubble=true。
 
  阻止默认事件:w3c的方法是e.preventDefault(),IE则是使用e.returnValue=false。
 
  问答
 
  有如下代码,要求当点击每一个元素li时控制台展示该元素的文本内容。不考虑兼容
 
  <ulclass="ct">
 
  <li>这里是</li>
 
  <li>饥人谷</li>
 
  <li>前端6班</li>
 
  </ul>
 
  <script>
 
  //todo...
 
  </script>
 
  代码:
 
  
 
  <ulclass="ct">
 
  <li>这里是</li>
 
  <li>饥人谷</li>
 
  <li>前端6班</li>
 
  </ul>
 
  <script>
 
  //方法一
 
  /*varitem=document.getElementsByClassName("ct")[0].getElementsByTagName('li')
 
  for(vari=0;i<item.length;i++){
 
  item[i].addEventListener('click',function(){
 
  console.log(this.innerText);
 
  })
 
  }*/
 
  //方法二
 
  varitem=document.getElementsByTagName('li')
 
  for(vari=0;i<item.length;i++){
 
  item[i].addEventListener('click',function(){
 
  console.log(this.innerText);
 
  })
 
  }
 
  </script>
 
  补全代码,要求:
 
  1.当点击按钮开头添加时在<i>这里是</li>元素前添加一个新元素,内容为用户输入的非空字符串;当点击结尾添加时在<li>前端6班</li>后添加用户输入的非空字符串.
 
  2.当点击每一个元素li时控制台展示该元素的文本内容。
 
  <ulclass="ct">
 
  <li>这里是</li>
 
  <li>555</li>
 
  <li>666</li>
 
  </ul>
 
  <inputclass="ipt-add-content"placeholder="添加内容"/>
 
  <buttonid="btn-add-start">开头添加</button>
 
  <buttonid="btn-add-end">结尾添加</button>
 
  <script>
 
  //todo...
 
  </script>
 
  代码:
 
  <ulclass="ct">
 
  <li>这里是</li>
 
  <li>666</li>
 
  <li>555</li>
 
  </ul>
 
  <inputclass="ipt-add-content"placeholder="添加内容"/>
 
  <buttonid="btn-add-start">开头添加</button>
 
  <buttonid="btn-add-end">结尾添加</button>
 
  <script>varct=document.querySelector('.ct')varstart=document.getElementById('btn-add-start');varend=document.getElementById('btn-add-end');varinput=document.querySelector(".ipt-add-content");
 
  end.addEventListener('click',function(){varlist=document.createElement('li');list.innerText=input.valuect.appendChild(list);})start.addEventListener('click',function(){varlist=document.createElement('li');list.innerText=input.valuect.insertBefore(list,ct.firstChild);})ct.addEventListener('click',function(e){if(e.target.tagName.toLowerCase()==='li'){console.log(e.target.innerText);}});</script>
 
  补全代码,要求:当鼠标放置在li元素上,会在img-preview里展示当前li元素的data-img对应的图片。
 
  <ulclass="ct">
 
  <lidata-img="1.webp">鼠标放置查看图片1</li>
 
  <lidata-img="2.webp">鼠标放置查看图片2</li>
 
  <lidata-img="3.webp">鼠标放置查看图片3</li>
 
  </ul>
 
  <divclass="img-preview"></div>
 
  <script>
 
  //todo...
 
  </script>
 
  代码:
 
  <ulclass="ct"><lidata-img="http://img5.imgtn.bdimg.com/it/u=3425851328,2681317699&fm=21&gp=0.webp">鼠标放置查看图片1</li><lidata-img="http://pic24.nipic.com/20121003/10754047_140022530392_2.webp">鼠标放置查看图片2</li><lidata-img="http://img2.3lian.com/img2007/4/22/303952037bk.webp">鼠标放置查看图片3</li></ul><divclass="img-preview"></div><script>varct=document.querySelector('.ct')varlist=document.getElementsByTagName('li')varpreview=document.querySelector('.img-preview')for(vari=0;i<list.length;i++){list[i].addEventListener('mouseover',function(){if(document.querySelector('img')){preview.removeChild(document.querySelector('img'))console.log(1)}varitem=document.createElement('img')varimg=this.getAttribute('data-img')preview.appendChild(item)item.src=img;
 
  })}</script>





本文转载自中文网

 

推荐阅读