1.dom对象的innerText和innerHTML有什么区别?
innerTest:显示对象中的文本内容
innerHTML:返回元素的HTML结构,在写入的时候也会自动构建DOM
2.elem.children和elem.childNodes的区别?
elem.children:非标准的,它返回指定元素的子元素集合。经测试,它只返回HTML节点,不返回文本节点。
elem.childNodes:标准的,它返回指定元素的子元素集合,包括HTML节点,所有属性,文本。可以通过nodeType来判断是哪种类型的节点,只有当nodeType==1时才是元素节点,2是属性节点,3是文本节点。
3.查询元素有几种常见的方法?
getElementById:方法返回匹配指定ID属性的元素节点。如果没有发现匹配的节点,则返回null。这也是获取一个元素最快的方法
getElementsByClassName:方法返回一个类似数组的对象(HTMLCollection类型的对象),包括了所有class名字符合指定条件的元素(搜索范围包括本身),元素的变化实时反映在返回结果中。这个方法不仅可以在document对象上调用,也可以在任何元素节点上调用
getElementsByTagName:方法返回所有指定标签的元素(搜索范围包括本身)。返回值是一个HTMLCollection对象,搜索结果是一个动态集合,任何元素的变化都会实时反映在返回的集合中。这个方法不仅可以在document对象上调用,也可以在任何元素节点上调用。
getElementsByName:方法用于选择拥有name属性的HTML元素,比如form、img、frame、embed和object,返回一个NodeList格式的对象,不会实时反映元素的变化。不兼容IE浏览器
querySelector方法返回匹配指定的CSS选择器的元素节点。如果有多个节点满足匹配条件,则返回第一个匹配的节点。如果没有发现匹配的节点,则返回null
querySelectorAll方法返回匹配指定的CSS选择器的所有节点,返回的是NodeList类型的对象。NodeList对象不是动态集合,所以元素节点的变化无法实时反映在返回结果中。
4.如何创建一个元素?如何给元素设置属性?
createElement方法用来生成HTML元素节点。
var newDiv = document.createElement("div");
createTextNode方法用来生成文本节点,参数为所要生成的文本节点的内容。
var newDiv = document.createTextNode("your")
createDocumentFragment方法生成一个DocumentFragment对象,DocumentFragment对象是一个存在于内存的DOM片段,但是不属于当前文档,常常用来生成较复杂的DOM结构,然后插入当前文档。这样做的好处在于,因为DocumentFragment不属于当前文档,对它的任何改动,都不会引发网页的重新渲染,比直接修改当前文档的DOM有更好的性能表现
var docFragment = document.createDocumentFragment()
设置属性:
<div id="test"></div>
<script>
var node=document.getElementById("test");
node.setAttribute("myAttrib","new-value");
</script>
5.元素的添加、删除?
appendChild(),在元素末尾添加元素
insertBefore(),在某个元素之前插入元素
删除元素使用removeChild()方法即可或replaceChild( )替换节点
6.DOM0 事件和DOM2级在事件监听使用方式上有什么区别?
a.DOM0 级事件处理程序不能添加多个事件处理程序,前面的会被后面的覆盖,一共有2种
<input type=button value="click" onclick="click()">
<script type="text/javascript">
var btn=document.getElementById("btn");
btn.onclick=function show(){
alert("hello everyone")
}
btn.onclick=function showmessage(){
alert("hello two")
};//后面onclick会覆盖前面的onclick事件
btn.onclick=null;//onclick 事件被删除
</script>
b.DOM2级事件定义了两个方法用来添加和移除事件处理程序:addEventListener()和removeEventListener()。addEventListener():可以为元素添加多个事件处理程序,而且可以是同一事件类型,不同效果叠加,触发时会按照添加顺序依次调用先后执行。removeEventListener():用于移除由 addEventListener() 方法添加的事件句柄,不能移除匿名添加的函数。
所有的DOM节点都包含这两个方法,并且它们都接受三个参数:
1.事件类型
2.事件处理方法
3.布尔参数,如果是true表示在捕获阶段调用事件处理程序,如果是false,则是在事件冒泡阶段处理
7.attachEvent与addEventListener的区别?
a.参数个数不相同,这个最直观,addEventListener有三个参数,attachEvent只有两个,attachEvent添加的事件处理程序只能发生在冒泡阶段,addEventListener第三个参数可以决定添加的事件处理程序是在捕获阶段还是冒泡阶段处理(我们一般为了浏览器兼容性都设置为冒泡阶段)
b.
第一个参数意义不同,addEventListener第一个参数是事件类型(比如click,load),而attachEvent第一个参数指明的是事件处理函数名称(onclick,onload)
c.事件处理程序的作用域不相同,addEventListener的作用域是元素本身,this是指的触发元素,而attachEvent事件处理程序会在全局变量内运行,this是window,所以刚才例子才会返回undefined,而不是元素id
d.为一个事件添加多个事件处理程序时,执行顺序不同,addEventListener添加会按照添加顺序执行,而attachEvent添加多个事件处理程序时顺序无规律(添加的方法少的时候大多是按添加顺序的反顺序执行的,但是添加的多了就无规律了),所以添加多个的时候,不依赖执行顺序的还好,若是依赖于函数执行顺序,最好自己处理,不要指望浏览器
8.解释IE事件冒泡和DOM2事件传播机制?
IE的事件冒泡:事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的元素
DOM2级事件规定事件流包括三个阶段,事件捕获阶段,处于目标阶段,事件冒泡阶段,首先发生的是事件捕获,为截取事件提供机会,然后是实际目标接收事件,最后是冒泡阶段
9.如何阻止事件冒泡? 如何阻止默认事件?
阻止事件冒泡
function stop(e){
if(e.stopPropagation){
e.stopPropagation()//其他浏览器
}else{
e.cancelBubble=true;//IE
}
}
阻止事件的默认行为
function preDafault(e){
if(e.preventDefault){
e.preventDefault();//其他浏览器,前提是cancelable值为true
}else{
e.returnValue=false;//IE
}
}