1、关于DOM
1、DOM——文档对象模型。将HTML文件描绘成一个层次化的节点树,允许开发人员添加、修改页面。
2、文档节点是每个文档的根节点,是最外层的元素,每个文档只能有一个文档元素,对于HTML文件来说,文档元素始终是<html>元素。
3、每个节点都有个nodeType属性,不同类型的节点有相应不同的值。比如element为1,document为9,text为3.
所以可以根据nodeType的值来判断这个节点的类型。比如在用nodelist时,对于列表元素来说会返回很多个带空的列表,那么可以通过if(nodelist[i].nodeType==1){ .... }来筛选出是li元素(element性质)
4、操作节点:
① 添加:
1、fathernode.appendChild(childnode) //默认在最后添加,为lastChild
如果childnode为已经存在的子节点,那么就会将其从原始位置移到lastChild位置
2、fathrernode.insertBefore(newnode , somenode) //将newnode添加到somenode之前,并且成为somenode的同级别节点,并不是父级节点
②替换:
fathernode.replaceChild(newnode , somechildnode) // 将newnode替换到fathernode下的somechildnode节点,原来的somechildnode将被完全删除
③删除:
fathernode.removeChild(somechildnode) //直接将fathernode中的somechildnode删除
④复制:
cloneNode( flag ) //flag可以选true——深复制,即复制该节点及其下面所有的子节点
false——浅复制,只复制该节点本身
注意复制完的节点为孤儿节点,需要为其指定一下父节点,例如append,inset
而且不会复制绑定到节点上电js函数,需要自己重新写
5、节点类型
①Documnet
documnet.body ==<body>
document.title == <title>
document.URL ==完整URL
document.domain ==url中的域名,可以进行设置解决跨域问题。例如两个页面直接不同URL但是要互相访问,那么就将二者的domain名设置一样的,就可以通过js通信了
document.getElementById
documnet,getElementByTagName ==返回一个nodeList,需要用类似数组的方式进行调用里面的内容,想获得文档所有内容,直接TagName(" * ") 代表全部
documnet.getElementByName ==最常用语单选按钮,一组单选radio设置相同name,这样才能做到每次直选1个,方法会返回此时选中的那一个
documnet,write == 可以直接在括号内写标签内容,会自动生成dom元素。也可以引入外部js文件,注意写<script>的时候,结尾</script>需要添加转义符<\/script>,否则会与文档自己原有的</script>起冲突
document.writeln == 作用与write相同,就是自带一个换行符
②Element
即HTML的元素
有id,class(注意对象用的时候为className),title(为提示性内容)之类的常见属性。
可以创建createElement(" ..."),直接写标签名当参数
访问元素的子节点:childNodes,注意<ul>元素中的问题
③Text
就是纯纯的文本,默认可以包含内容的节点最多只能有一个文本节点,无论多长都算一个
举例<div>hello world</div> ,那么<div>含有一个文本节点,可以用nodeValue,从节点的层面对其进行修改
也可以创建document.createTwxtNode("...."),同样其中内容可以直接上标签,读取的时候回自动转义。反过来也要注意用text节点读取的value值,若里面有<>,/这种标签用的符号,读出来也会被转义,比如<是<之类 的。
有一个合并文本节点的方法:normalize(),会自动合并父级下的所有text子节点,为拼接起来的值
④Comment
是注释的内容,值可以通过nodeValue()获取
2、动态插入DOM
① 动态插入script
两种方法:
1、直接插入外部文件
var script = document.creatElemrnt("script");
script.type = "text/javascript";
script.src = "new.js";
documnet.body.appendChild(script);
效果等同于HTML中直接写:
<script type="text/javascript" src="new.js"></script>
2、直接插入代码
var script = document.creatElemrnt("script");
script.type = "text/javascript";
script.appendChild(document.creatwTextNode("function say(){alert("hi!")}"));
documnet.body.appendChild(script);
② 动态插入css
两种方法:
1、用<link>包含外部文件
var link = document.createElement("link");
link.rel = "stylesheet";
link.type = "text/css";
link.href = "style.css";
var head = document.getElementByTagName("head")[0]; //注意link要添加在<head>中
head.appendChild(link);
等同于在HTML中直接写:
<link rel="stylesheet" type="text/css" href="style.css">
2、用<style>直接写
类比,创建style元素,然后通过创建text类型节点直接写内部的代码
③ 动态插入table
在js中,特意为table准备了一些属性和方法可以直接调用。比如插入一行insertRow()
也有为tr准备的一些方法