DOM总结:
DOM:文档对象模型document object model
DOM三层模型:
DOM1:将HTML文档封装成对象
DOM2:将XML文档封装成对象
DOM3:将XML文档封装成对象
DOM树:将HTML中的标签按照层级关系封装成节点对象
DOM的出现使静态的HTML页面的标签变为动态的可操作的节点对象
DHTML:动态的HTML,是HTML、CSS、DOM、js四种技术的综合
HTML:封装页面数据
CSS:设置标签中的数据样式
DOM:将标签封装成对象
js:将三种进行融合,通过程序设计完成动态效果的操作
标记型文档一加载进内存,内存中就产生了相应的DOM树,由此产生的弊端就是,文档过大时,消耗资源,对于大型文档,可用SAX方式解析。
HTML文档中的层次关系,DOM树的层次结构
document HTML文档对象
|--head
|--title
|--base
|--meta
|--link
|--body
|--form
|--input
|--select
|--textarea
|--div
|--table
|--tbody默认是有的,即使没写
|--tr
|--td
|--th
|--a
.....
将HTML文档及其中的标签都封装成对象,方便操作。
节点都有的属性:nodeName,nodeType,nodeValue
注意区分DOM代码中对象的属性和HTML、CSS代码中的属性写法上不同
节点类型:
标签型节点:nodeType为1,容器型节点的value为空null,没有值
文本型节点:名字#text类型为3
注释型节点:#comment类型为8
属性型节点:类型为2 属性可通过对象的attributes集合属性获取
文档型节点:#document类型为9
节点关系:
父节点:每个节点有且只有一个父节点,通过节点parentNode属性获取
子节点:可以有多个,通过节点childNodes属性获取子节点集合(数组)
兄弟节点:分上一个和下一个,通过previousSlbing和nextSlibing属性获取
注意页面中标签之间的空行也是文本节点,浏览器解析时出现也可能没有这个节点
获取节点的方法:
1、getElementById(HTML标签中定义的Id值)
获取文档中指定的id对象的标签对象,注意保证id值的唯一性
如果有多个标签id相同,获取id对应的第一个对象
div内部数据
style属性中的内容为CSS代码,注意区分DOM中的相同属性名称
2、getElementsByName(HTML标签中定义的name值)
获取文档中所有与指定标签名相同的所有对象,封装为数组返回
3、getElementsByTagName(HTML标签名)
获取文档中与指定标签名相同的所有对象,返回数组
容器型标签中都有该方法,如Div,table,p
每个对象都有一个集合属性all,可以获取该对象中的所有节点对象的引用,但是all属性不获取文本型节点和空行产生的节点,还有有一个attributes集合属性,用来获取该对象的所有属性。
window对象:代表浏览器打开一个窗口
window中的对象:
document:窗口中的HTML文档event:事件状态
history:历史记录location,当前地址栏信息
navigator:关于浏览器的信息screen:屏幕信息
navigator对象:window.navigator.href或者navigator.href
属性:appCodeName appName appVersion获取浏览器代码名称、名称、版本
platform获取操作系统名称
history对象:只有一个length属性
方法:back() forward() go()都是从历史列表中装入URL
location对象:此对象的属性既可用来获取又可用来设置对应属性的值
属性:host获取或设置URL的主机名和端口号 hostname port
href :URL protocol:协议 pathname:文件名或路径
search:href属性中问号后面的部分 hash:href属性中井号后的部分
location对象的任一属性改变后浏览器都将立即前往指定的URL
screen对象:
属性:availHeight和availWidth是系统屏幕的有效区域,不包括Windows的任务栏
height和width是系统屏幕的分辨率值
window对象方法:
alert:确定对话框
confirm:确定取消对话框,返回true或false
prompt(提示信息,[输入默认值]):可接收输入数据的对话框,返回输入的文本数据
moveBy(x, y):使窗体根据指定的坐标值偏移 窗口抖动效果
moveTo(x, y):使窗体移动到指定坐标值
resizeBy(x, y):窗体缩放指定偏移值 resizeTo(x, y):窗体缩放至指定值
scroll(x, y):将窗口滚动到距窗口左上角指定偏移值的位置
scrollBy(x, y):将窗口滚动指定的偏移值
scrollTo(x, y):将窗口滚动到指定位置
close:关闭窗口
open:打开一个窗口window.open( [sURL] [, sName] [, sFeatures] [, bReplace])
window.open("","_blank","fullscreen=1");这句NB了,整个屏幕都是白板
sURL:打开窗口的地址,默认打开一个新的空白窗体about:blank
sName:指定窗口的打开方式,即target属性值
_blank:新的无标题窗口
_parent:当前框架的父窗体,没有父窗体则为_self
_self:当前窗口,替换当前窗口内容
_search:浏览器的搜索面板内,IE5及以后版本有效
_top:替换所有可以加载的框架集,没有框架则为_self
sFeatures:(for example, "fullscreen=yes, toolbar=yes")
height≥100px,width≥100px,left≥0,top≥0
下边的属性取值可以为yes/no或1/0
channelmode 默认值no
fullscreen 默认值no,改为yes记得提供关闭窗口的按钮或方法ALT+F4
下边的默认值都为yes directories location地址栏
menubar菜单栏 resizable可调大小 scroll bars滚动条
status状态栏 titlebar标题栏 toolbar工具栏
window.open()
bReplace:false(新建)或者true(替换)历史列表中的记录
setTimeout:经过指定毫秒值后,计算表达式的值或执行表达式内容。返回一个id值
setTimeout(“window.close()”, 5000);5秒后自动关闭窗口
setInterval:没经过指定毫秒值计算表达式,循环。返回一个事件id值
setInterval(“alert(111)”,3000)每隔3秒弹一次
clearTimeout(id)、clearInterval(id):清除使用上边两个方法开始的事件
focus:获取焦点
window.setInterval(“window.focus()”, 3000);将窗口每隔3秒前置一次
window事件
onload:对象加载完成后 打开窗口后
onunload:对象卸载完成 关闭窗口,窗体消失后
onbeforeunload:对象卸载前 关闭窗口,窗体还在时
onkeypress:键盘事件
event对象:
keyCode属性:设置或获取事件对应的按键码
returnValue:设置或获取事件的返回值,false或true,用于取消事件执行效果
例:文本框只允许输入数字,非数字不允许显示在文本框中
<input type=text onclick=checkNum() />
function checkNum()
{
if (!(window.event.keyCode>=48 && window.event.keyCode<=59))
{
alert(“不允许输入非数字”);
//不加下边这句,非数字会提示但还会在文本框显示
window.event.returnValue = false;取消事件执行
}
}
returnValue可用在表单提交中,当表单数据不符合要求时取消提交按钮效果
srcElement属性可设置或获取事件源对象
取消超链接默认点击效果:让浏览器启动JavaScript解析引擎执行一个空的函数
<a href=”javascript:void(0)” onclick=”method()”></a>
CSS中的布局属性overflow:设置当对象中的内容超过其指定宽度或高度时的显示方式
hidden隐藏、visible显示、scroll滚动条、auto自动
使用此属性可以实现展开闭合效果,如好友列表
display属性也可以完成这个效果 none隐藏,block块状显示 分行,
inline一行内显示
获取事件源对象的两种方式
1、event.srcElement
2、事件处理时直接将事件对象通过this传递
创建节点:
document.createElement(标签名)创建一个指定标签名的节点
document.createTextNode(文本内容)创建一个文本节点
添加节点:添加到的目的节点.appendChild(要添加的节点) 添加到尾部
table对象
rows属性:获取表格中所有的行 cells属性:表格中所有单元格
使用table对象创建行对象:table.insertRow([index])index默认-1行尾
用tr对象创建单元格:tr.insertCell()
注意table的下一级子节点tbody,添加行节点要加在tbody下
tr对象也有cells集合属性,获取的是这一行中的单元格集合
给对象添加属性
1、tabNode.id = “tabid”
2、tabNode.setAttribute(“id”,”tabid”)
删除表格节点:
删除行:tabNode.deleteRow(rowIndex)
删除列:删除所有行的指定单元格 获取列数tabNode.rows[0].cells.length
trNode.deleteCell(cellIndex)
表格数据排序过程中定义的临时容器(存放行对象的数组)存放的都是行对象的引用。
表格行颜色间隔显示和鼠标悬浮行高亮效果:
间隔显示:奇偶行分别加载不同样式即可,onload事件中加载
悬浮高亮:行对象的onmouseover和onmouseout事件
对象.innerText 可以获取或设置对象的内部文本,但是包含的HTML标签或属性也会作为纯文本解析。要将内部的标签或HTML属性解析,需要使用innerHTML
按钮一次性点击效果:event.srcElement事件源/input对象.disabled=true 按钮点击后变灰
复选框操作:获取总金额
获取所有复选框checkboxs,遍历,判断checked属性if (checkedboxs[x].checked)
注意将复选框的value属性值进行parseInt转换
全选时将其他复选框的checked属性值改为全选框的checked属性值即可
通过下拉列表动态改变页面样式:select标签的onchange事件
options属性:所有列表项 selectedIndex:选中项的角标
获取列表选中项:selectNode.options[selectNode.selectedIndex] 值.value
DOM代码改变div区域内文本样式:divNode.style.textTransform
uppercase lowercase capitalize首字母大写
JavaScript代码写在head标签内时要注意全局变量的问题:
函数只有调用时才执行,封装在函数内部的变量没有问题;在函数外部定义的全局变量,页面加载时还没读到下边的具体标签,全局变量获取指定标签对象时就会出现null
获取鼠标的坐标,让指定区域随鼠标移动
获取鼠标坐标方法:event.x event.y
随鼠标移动:改变指定区域的left和top属性
用到的事件:body对象的onmousemove
还用到CSS样式的position定位属性,将页面分层,使指定区域悬浮在body区域上方。层次:直接定义页面所有对象到同一个层里,为了对某个区域进行移动、定位,将该区域分离到另一个单独的层里
//用position属性将广告区域进行分层,绝对定位,使广告区域悬浮在body区域上方
<body>
<div id=”ad” style=”position:absolute; left:0; top:0”>广告</div>
<div id=”bodyid”>body区域</div>
</body>
window.onload=function()
{
document.body.onmousemove = function()
{
var adNode=document.getElementById(‘ad’)
adNode.style.left = event.x;
adNode.style.top = event.y;
}
}
流氓:将广告区域的坐标值设置为鼠标坐标值左上一点,使鼠标停在广告区域中
将广告区域用a标签封装
在广告区域添加点击事件,点击后关闭广告ad.style.dislay=none
限定边界: addiv.offsetWidth 广告区域自己的宽度
document.body.clientWidth body区域的宽度
边界内移动代码:
<script type="text/javascript">
var x=y=1;
var movex=movey=0;
function move()
{
var ad = document.getElementById("ad");
movex = movex + x*5; //每次移动位置递增5个像素
movey = movey + y*5;
ad.style.left = movex; //移动
ad.style.top = movey;
//alert("aaaaaaaa");
var bdx = document.body.clientWidth; //获取当前浏览器页面窗口的宽和高
var bdy = document.body.clientHeight;
var adx = ad.offsetWidth; //获取广告区域的大小
var ady = ad.offsetHeight;
//alert(bdx+"----------"+bdy);
if (movex+adx >= bdx) //判断是否移到边界了
{ //移到边界开始递减
x = -1;
}
else if (movex <= 0) //递减只零再开始递增
{
x = 1;
}
if (movey+ady >= bdy)
{
y = -1;
}
else if (movey <= 0)
{
y = 1;
}
}
var timeid;
function fly()//飞吧 每个10毫秒执行一次移动
{
//move();
timeid = window.setInterval("move()", 100);
}
function over()//鼠标进入广告区停止移动
{
window.clearInterval(timeid);
}
window.onload = function() //页面一加载就开始飞
{
fly();
var ad = document.getElementById("ad");
ad.onmouseover = function()
{
over(); //鼠标进入取消定时移动
}
ad.onmouseout = function()
{
fly(); //鼠标离开继续移动
}
}
function closeAD() //点击关闭后停止定时移动,隐藏广告区域
{
var ad = document.getElementById("ad");
ad.style.display = 'none';
over();
}
</script>
</head>
<body>
<div id="ad" style="position:absolute; border: red 1px solid; left:0; top:0; height:90; width:90">
<a href="http://www.ad.com" target="_blank">广告</a><br/><br/><br/><br/>
<a href="javascript:void(0)" onclick="closeAD()">关闭广告</a></div>
</body>
级联菜单:省市选择示例 select标签onchange事件 添加option项
将省份对应的城市城市列表封装进二维数组,角标和省的option项角标一致
选中省份后,遍历对应的城市列表,将其封装进option标签中并添加到子菜单中
注意:在添加子项前需先清空子菜单项,以免将上一选项结果遗留
再次注意:清空子项用遍历时,注意removeChild一次,length就减一次,如果循环变量跟着递增就会移不完
移除下拉选项的简单方法,直接将列表的options属性的length置为0即可
邮件列表示例中删除所选邮件时注意:
和用遍历方法删除列表项时的问题一样,删除时,长度递减,循环变量递增,删不全
可定义一个临时容器用来存储待删除的节点索引,然后遍历临时容器时再删除这些节点。临时容器中存放的也是表格行节点的引用,每次删除完颜色事件都要加载一遍
表单验证:
可以用document.forms获取页面中的所有表单对象
拿到表单对象后,可以直接使用表单中的组件名获取对应组件
输入框失去焦点时就开始验证:onblur事件发生就开始验证
怎么让表单验证失败时提交不出去呢?
1、表单标签中的onsubmit事件中,event.returnValue=false提交按钮就失效了
2、在onsubmit事件处理函数中返回false(不提交)或true(提交),再将返回结果返回给onsubmit事件即可 onsubmit=“return checkForm()”
事件处理函数中使用returnValue时,onsubmit不用return即可
JS中的正则表达式 限定开始结束位置^ $
两种写法
var reg = /^\d{5}$/ 5位数字,下同
var reg = new RegExp(“^\\d{5}$”);
var namereg = /^[a-z]{5}$/i 5为字母 后面加i不分大小写
下面的示例创建一个包含正则表达式模式及相关标志的对象(re),向您演示正则表达式对象的用法。在本例中,作为结果的正则表达式对象又用于 match 方法中:
function MatchDemo(){
var r, re; // 声明变量。
var s = "The rain in Spain falls mainly in the plain";
re = new RegExp("Spain","i"); // 创建正则表达式对象。
r = s.match(re); // 在字符串 s 中查找匹配。
return(r); // 返回匹配结果。
}
如果String对象的 match 方法没有找到匹配,返回 null。
RegExp对象的test方法也可判断是否匹配
reg.test(str) 返回boolean
附件添加删除、通过下拉列表改变字体颜色、字体样式、省市级联菜单示例
<style type="text/css">
/*CSS区域*/
a:link, a:visited{
color: #FF0000;
font-size: 22;
text-decoration: none;
}
</style>
<script type="text/javascript">
/*javascript区域*/
function addFile()
{
var tabNode = document.getElementById("file");
var trNode = tabNode.insertRow();
var tdNode_file = trNode.insertCell();
var tdNode_del = trNode.insertCell();
tdNode_file.innerHTML = "<input type='file' />";
tdNode_del.innerHTML = "<img src='1.jpg' alt='删除文件' onclick='delFile(this)' />";
}
function delFile(node)
{
//var tabNode = document.getElementById("file");
var trNode = node.parentNode.parentNode;
//alert(tabNode.nodeName);
//alert(trNode.nodeName);
trNode.parentNode.removeChild(trNode); //父节点删除子节点 他杀
}
</script>
<body>
<!--添加删除附件-->
<a href="javascript:void(0)" onclick="addFile()">点击上传文件</a>
<table id="file">
</table>
<hr/>
<style type="text/css">
#bbb{
border: red 3px solid;
width: 200px;
}
#colorid{
width: 50px;
}
#text{
border: blue 1px solid;
width: 100px;
text-align: center;
margin: 10px 0px 0px 20px;
}
</style>
<script type="text/javascript">
/*鼠标指上去就盖住背景色了 想去掉没成功
onload=function()
{
var sel = document.getElementById("colorid");
sel.onmouseover = function(){sel.className="";};
sel.onmouseout = function(){sel.className="";};
}
*/
function changeColor()
{
var sel = document.getElementById("colorid");
var div = document.getElementById("text");
var val = sel.options[sel.selectedIndex].value;
div.style.color = val;
}
</script>
<div id="bbb">
选择颜色:
<select id="colorid" onchange="changeColor()">
<option value=#FFFF00 style=background:#FFFF00></option>
<option value=#FF0000 style=background:#FF0000></option>
<option value=#33FF00 style=background:#33FF00></option>
<option value=#0033FF style=background:#0033FF></option>
</select>
<div id="text">
变变变<br />
变变变<br />
变变变<br />
变变变<br />
变变变<br />
</div>
</div>
<hr />
<style type="text/css">
#div1{
background: #FFCC00;
width: 300;
height: 80;
}
#selid{
width: 200;
margin-top: 20px;
margin-bottom: 20px;
}
#div2{
background: #669999;
width: 300;
}
</style>
<script type="text/javascript">
<!—改变字体样式-->
function textChange()
{
var div1 = document.getElementById("div1");
var div2 = document.getElementById("div2");
var sel = document.getElementById("selid");
var val = sel.options[sel.selectedIndex].value;
//alert(val);
div1.style.textTransform = val;
div2.innerHTML = "text-transform : "+val+";";
}
</script>
<div id="div1">
Every man dies. Not every man really lives.
</div>
<select id="selid" onchange="textChange()">
<option value="none">--text-transform--</option>
<option value="uppercase">UPPERCASE</option>
<option value="lowercase">lowercase</option>
</select>
<div id="div2">
text-transform : none;
</div>
<hr/>
<!—省市级联菜单-->
<style type="text/css">
#seldiv select{
width: 150px;
}
</style>
<script type="text/javascript">
function showCity()
{
var arr = [[], ["朝阳区", "海淀区", "西城区", "东城区"],
["郑州市", "南阳市", "邓州市", "信阳市", "驻马店市", "开封市"],
["唐山市", "石家庄市", "廊坊市", "邯郸市"],
["北京", "上海", "深圳", "天津", "重庆", "香港特别行政区", "澳门特别行政区"]];
var sel1 = document.getElementById("sel1");
var sel2 = document.getElementById("sel2");
var index = sel1.selectedIndex;
//sel2中添加内容之前先清空下 有简单方法
for (var x=1; x<sel2.options.length; )//x++) //length在减 x在递增 只移除一半
{
sel2.removeChild(sel2.options[x]);
}
for (var x=1; x<sel1.options.length; x++)
{
if (x == index)
{
for (var y=0; y<arr[x].length; y++)
{
var opNode = document.createElement("option");
opNode.innerHTML = arr[x][y];
sel2.appendChild(opNode);
}
}
}
if (sel1.selectedIndex!=0)
sel2.selectedIndex = 1;
}
</script>
<div id="seldiv">
<select id="sel1" onchange="showCity()">
<option value="0">选择省市</option>
<option value="1">北京市</option>
<option value="2">河南省</option>
<option value="3">河北省</option>
<option value="4">中国</option>
</select>
<select id="sel2">
<option value="none">选择城市</option>
</select>
</div>
</body>
邮件列表示例:
<style type="text/css">
/*CSS区域*/
table{
border: black 2px solid;
border-collapse: collapse;
text-align: center;
width: 600px;
/* margin: 10px; 外框边距*/
}
table th{
background: #33FF33;
}
table td, table th{
padding: 5px;
border: black 1px solid;
}
.one{
background: #CCFF66;
}
.two{
background: #FFCCFF;
}
.over{
background: #FF9933;
}
</style>
<script type="text/javascript">
/*javascript区域*/
var name;
function trColor()
{
var tabNode = document.getElementById("maillist");
var tabRows = tabNode.rows;
for (var x=1; x<tabRows.length-1; x++)
{
if (x%2==1)
{
tabRows[x].className = "one";
}
else
tabRows[x].className = "two";
tabRows[x].onmouseover = function()
{
name = this.className;
this.className = "over";
}
tabRows[x].onmouseout = function()
{
this.className = name;
}
}
}
window.onload = function()
{
trColor();
}
function checkAll(index)
{
var allNodes = document.getElementsByName("all");
//不管选的哪个都让两个全选框一样
allNodes[Math.abs(index-1)].checked = allNodes[index].checked;
var mails = document.getElementsByName("mail");
for (var x=0; x<mails.length; x++)
{
mails[x].checked = allNodes[index].checked;
}
}
function checkByBut(mode) //选择按钮事件处理
{
/*简单写法
var mails = document.getElementsByName("mail");
for (var x=0; x<mails.length; x++)
{
if (mode==2)
mails[x].checked = !mails[x].checked;
else
mails[x].checked = mode;
}
*/
if (mode==1)
{
document.getElementsByName("all")[0].checked = true;
checkAll(0);
//alert(mode);
}
if (mode==0)
{
document.getElementsByName("all")[0].checked = false;
checkAll(0);
}
if (mode==2)
{ //mails[x].checked = !mails[x].checked;
var alls = document.getElementsByName("all");
if (alls[0].checked) //使两个全选框同步
{
alls[0].checked = false;
alls[1].checked = false;
}
var mails = document.getElementsByName("mail");
for (var x=0; x<mails.length; x++)
{
if (mails[x].checked)
{
mails[x].checked = false;
}
else
{
mails[x].checked = true;
}
}
}
}
function del() //删除所选
{
/*
var mails = document.getElementsByName("mail");
for (var x=0; x<mails.length; x++)
{
if (mails[x].checked)
{
var trNode = mails[x].parentNode.parentNode;
trNode.removeNode(true); //这样删掉之后length在减小 而x在递增 导致删一半留一半
}
}
trColor();
*/
var arr = []; //记录被选择的行号
var pos = 0;
var mails = document.getElementsByName("mail");
for (var x=0; x<mails.length; x++)
{
if (mails[x].checked)
{
var trNode = mails[x].parentNode.parentNode;
arr[pos++] = trNode;
}
}
var tabNode = document.getElementById("maillist");
var tabRows = tabNode.rows;
for (var x=0; x<arr.length; x++)
{
arr[x].removeNode(true);
}
trColor(); //重新加载一次样式,颜色间隔效果
}
</script>
<body> <!--邮件列表操作演示-->
<table id="maillist">
<tr>
<th><input type="checkbox" name="all" onclick="checkAll(0)" />全选</th>
<th>发件人</th>
<th>邮件主题</th>
<th>邮件内容</th>
<tr>
<tr>
<td><input type="checkbox" name="mail" /></td>
<td>张三11</td>
<td>主题:邮件11</td>
<td>内容:邮件11</td>
</tr>
<tr>
<td><input type="checkbox" name="mail" /></td>
<td>张三22</td>
<td>主题:邮件22</td>
<td>内容:邮件22</td>
</tr>
<tr>
<td><input type="checkbox" name="mail" /></td>
<td>张三33</td>
<td>主题:邮件33</td>
<td>内容:邮件33</td>
</tr>
<tr>
<td><input type="checkbox" name="mail" /></td>
<td>张三44</td>
<td>主题:邮件44</td>
<td>内容:邮件44</td>
</tr>
<tr>
<td><input type="checkbox" name="mail" /></td>
<td>张三55</td>
<td>主题:邮件55</td>
<td>内容:邮件55</td>
</tr>
<tr>
<td><input type="checkbox" name="mail" /></td>
<td>张三66</td>
<td>主题:邮件66</td>
<td>内容:邮件66</td>
</tr>
<tr>
<td><input type="checkbox" name="mail" /></td>
<td>张三77</td>
<td>主题:邮件77</td>
<td>内容:邮件77</td>
</tr>
<tr>
<td><input type="checkbox" name="mail" /></td>
<td>张三88</td>
<td>主题:邮件88</td>
<td>内容:邮件88</td>
</tr>
<tr>
<td><input type="checkbox" name="mail" /></td>
<td>张三99</td>
<td>主题:邮件99</td>
<td>内容:邮件99</td>
</tr>
<tr>
<th><input type="checkbox" name="all" onclick="checkAll(1)" />全选</th>
<th colspan=3>
<input type="button" value="全选" onclick="checkByBut(1)" />
<input type="button" value="取消选择" onclick="checkByBut(0)" />
<input type="button" value="反选" onclick="checkByBut(2)" />
<input type="button" value="删除所选邮件" onclick="del()" />
</th>
<tr>
</table>
</body>