JavaScript入门<3>JS外置对象:Window、Document对象与DOM实例详解

一)window对象

1、什么是DHTML?

      1)DHTML是指操作HTML以创造各种动态视觉效果,是一种浏览器端的动态网页技术。
      2)DHTML的功能:
            ①动态改变页面元素。
            ②事件响应机制制作动态折叠的树形结构和菜单。
            ③与用户进行交互等。
      3)DHTML对象模型包括浏览器对象模型和DOM对象模型。

2、DHTML对象模型

将整个窗口均实现了对象化,结构如下:


3、什么是Window对象?它有哪些常用属性?常用子对象?

window对象表示浏览器打开的窗口,也是父对象。

      1)常用属性

            ①name:窗口名称。
            ②opener:打开当前窗口的window对象(引用)。
            ③status:窗口底部状态栏信息。

      2)常用子对象

            ①document:代表给定浏览器窗口中的HTML文档。
            ②history:包含了用户浏览过的URL信息。
            ③location:包含关于当前URL的信息。
            ④navigator:包含Web浏览器的信息。
            ⑤screen:包含关于客户屏幕和渲染能力的信息。
            ⑥event:代表事件状态。

4、Window对象有哪些常用方法?

     1)对话框类

1>alert(str):提示对话框,显示str字符串的内容。

例如:window.alert("aa"); //window.可省

2>confirm(str):确认对话框,像是str字符串的内容,按“确定”返回true,其他操作返回false。

3>prompt(str,value):输入对话框,采用文本框输入信息,str为提示信息,value为初始值,按“确定”返回输入值,其他操作返回undefine,value可省。

<span style="font-size:18px;">function testConfirm() {
		var r = window.confirm("Are you really....");
		alert(r);
		window.prompt("请输入ID:");//因为不能控制它,所以很少用 	
	}</span>

     2)窗口的打开与关闭

1>window.open(url):重复打开。
2>window.open(url,name):采取命名方式,避免重复打开。
3>window.open(url,name,comfig):config设置新窗口外观如高和宽。
4>window.close():关闭窗口。

function testNewWindow(){
	     var config="toolbar=no,location=no,width=300,height=200";
	     window.open("http://www.baidu.com","a",config);		  
              }

     3)周期性定时器

1>setInterval(exp,time):周期性触发代码exp,返回已经启动的定时器。exp:执行语句,time:时间周期,单位为毫秒。
2>clearInterval(tObj):停止启动的定时器。tObj:启动的定时器对象。

     4)一次性定时器

1>setTimeout(exp,time):一次性触发代码exp,返回已经启动的定时器。exp:执行语句,time:时间周期,单位为毫秒。
2>clearTimeout(tObj):停止启动的定时器。tObj:启动的定时器对象。

     5)动态时钟

<html>
<head>
<title>dClock.html</title>
<script type="text/javascript">
	function showTime() {//显式时间
		var t = new Date();//将当前时间显式在一个文本框中
		document.getElementById("txtTime").value = t.toLocaleTimeString();
	}
	var timer;//设置全局变量
	function startClock() {//启动时钟
		timer = window.setInterval(showTime, 1000);//有返回值的。			
	}
	function stopClock() {//停止时钟
		window.clearInterval(timer);
	}
	var timer1;//设置全局变量
	function wait() {//5秒后弹出一个Hello
		timer1 = window.setTimeout("alert('Hello');", 5000);//可以执行合法的文本表达式
	}
</script>
</head>
<body>
	这是动态时钟的测试<br>
	<input type="button" value="显式时间" οnclick="showTime();" />
	<input type="button" value="启动时钟" οnclick="startClock();" />
	<input type="button" value="停止时钟" οnclick="stopClock();" />
	<input type="button" value="5s后弹出一个Hello" οnclick="wait();" />
</body>
</html>
       注意事项:showTime没有括号,代表每隔一定时间让浏览器去找showTime对象并启动一次;showTime()则为立即启动方法。

二)Document对象与DOM

1、什么是Document对象?什么是DOM?

      1)Document对象:每个载入浏览器的HTML文档都会成为Document对象。
            ①通过使用Document对象,可以从脚本中对HTML页面中的所有元素进行访问(操作文档中的任何内容,都过Document)。
            ②Document对象是window对象的一部分,可通过window.document方式对其进行访问。
      2)DOM:Document Object Model,文档对象模型,HTML文档中的所有节点组成了一个文档树(或节点树)。
            ①树起始于文档节点,Document对象是一颗文档树的根。
            ②HTML文档中的每个元素、属性、文本等都代表这树中的一个节点。

2、Document中查找节点的方式有哪几类?

       1)根据元素ID查找节点

1>方法:document.getElementById(idValue)
2>忽略文档的结构,通过指定的ID来返回元素节点。
3>可以查找整个HTML文档中的任何HTML元素。
 注意事项:如果ID值错误,则返回null。

       2)根据层次查找节点

1>遵循文档的层次结构,查找单个节点:parentNode、firstChild、lastChild
2>遵循文档的层次结构,查找多个节点:
            childNodes:以s结尾的都是数组,则有length属性。
3)案例
      eg:根据层次查找节点

<html>
<head>
<title>selectIDl.html</title>
<script type="text/javascript">
	var sObj = document.getElementById("sell");
	alert(sObj.childNodes.length);//7?为何是7?!
	var s1 = sObj.firstChild;
	alert(s1.innerHTML);//undefined?这又为何为未定义?
</script>
</head>
<body>
	<select id="sell">
		<option>a</option>
		<option>b</option>
		<option>c</option>
	</select>
	<!-- 注意按此格式 -->
</body>
</html>
解释:childNodes会找到sell下的所有子节点,除了真正的子节点外,还有空格这种特殊节点,所以长度为7。只有不空格,都写一行结果才为3,如:
<select id="sell"><option>a</option>
<option>b</option>
<option>c</option>
</select>

同理,第一个子节点为空格,firstChild的内容当然也就是undefined了。

       3)根据标签名称查找节点

1>getElementsByTagName("namestr"):在某个节点的所有后代里查找某种类型的元素(根据指定的标签名),并返回所有的元素(返回一个节点列表)。
      ①忽略文档的结构,查找整个HTML文档中的所有元素。
      ②如果标签名错误,则返回长度为0的节点列表。
             注意事项:单词Elements结尾有s,所以为数组。
2>length属性:返回的是一个节点列表,是个数组,因此可用length属性获取元素个数。使用[index]可定位具体的元素。例如:

<body>
	<span>文本</span>
	<h1>
		一周畅销<span>榜</span>
	</h1>
</body>
var spans=document.getElementsByTagName("span"); 
alert(spans.length);//2
alert(spans[1].innerHTML);//榜

3、读取或者修改节点信息有什么规则限制?

主要有三个规则限制:

      规则一:将HTML标签对象化,操作前先明确被对象化的标签都有什么属性。
如:aObj代表一个<a href="">元素</a>,有aObj.href属性,但没有aObj.value和aObj.src
      规则二:innerHTML:设置或获取位于对象起始和结束标签内的内容。
如:aObj.innerHTML可修改<a href="">元素</a>标签中的“元素”两字
       注意事项:<input />单标签无法用innerHTML修改内容。
      规则三:nodeName:得到某个元素节点和属性节点(即可得到标签或属性名称)及其类型位置。xxx.nodeName:当未知节点类型时,使用该属性获得节点的名称,全大写方式。
如:if(xxx.nodeName == "IMG") xxx.src = "http://...";
      注意—节点属性:getAttribute()方法:根据属性名称获取属性的值。
将HTML标签、属性、CSS样式都对象化。

4、如何查找并修改节点?实例演示

      1)修改节点样式

1>style属性:语法:node.style.color; node.style.fontSize
       注意事项:CSS样式中属性名内有“-”的,这里省略,并把后面单词首字母大写!
2>className属性:语法:var Obj=document.getElementById("p1");
      如:Obj.className="样式类名称";//可用于设置不同的样式。

      2)查找并修改节点

1>使用getElectmentById()方法找到节点元素;

2> 修改元素内容

3>修改样式:style属性或者className属性

4>修改属性:html属性

      3)经典案例:

案例1:表单验证

<span style="font-size:18px;"><!DOCTYPE html>
<html>
<head>
<title>validateForm.html</title>
<script type="text/javascript">
	function validName() {//验证用户名
		var name = document.getElementById("txtName").value;//得到录入的用户名
		var r = /^[a-z]{3,5}$/;//验证
		if (r.test(name))//根据验证结果显示不同的样式
			document.getElementById("nameInfo").className = "success";
		else
			document.getElementById("nameInfo").className = "fail";
		return r.test(name);//添加返回										
	}
	function validAge() {//验证年龄
		var age = document.getElementById("txtAge").value;//得到录入的年龄
		var r = /^[0-9]{2}$/;//验证
		if (r.test(age))//根据验证结果显示不同的样式
			document.getElementById("ageInfo").className = "success";
		else
			document.getElementById("ageInfo").className = "fail";
		return r.test(age);//添加返回											
	}
	function validDatas() {//验证所有数据,验证name和age,return true和false
		var r1 = validName();
		var r2 = validAge();
		return r1 && r2
	}
</script>
</head>
<body>
	This is my HTML page.
	<br>
	<form>
		Name:<input type="text" id="txtName" οnblur="validName();" />
		      <span id="nameInfo">3-5个小写字母</span> <br /> 
			
		Age:<input type="text" id="txtAge" οnblur="validAge();" /> 
			 <span id="ageInfo">2位数字</span><br />
		<input type="submit" value="保存" οnclick="return validDatas();" />
	</form>
</body>
</html></span>

       注意事项:οnclick="return validDatas();返回值为true则提交表单,否则取消提交,即为return false时取消某事件。

案例2:读取或者修改节点信息

<span style="font-size:18px;"><!DOCTYPE html>
<html>
<head>
<title>testDoc.html</title>
<script type="text/javascript">
function testDocument(){ var imgObj
	= document.getElementById("img1"); 
	imgObj.src = "ok.png";//修改图片
	//修改段落:字体颜色,背景色,字体大小,段落文本
	 var pObj = document.getElementById("p1");
	pObj.style.color = "red";//注:pObj.style = "color:red";不够对象化
	pObj.style.backgroundColor = "silver"; //注:pObj.style.background-color不认识减号,去掉减号,下个单词首字母大即可。
	pObj.style.fontSize = "25";//单位由浏览器的默认值决定
	pObj.innerHTML = "new text"; //修改某元素的样式:样式复杂时用
	document.getElementById("h2").className = "style1";
	//复杂样式先定义一个样式类
}
</script>
<style type="text/css">
 h2.style1{ border-top:1px solid red;
	        border-right:2px solid blue;
	       } 
h2.style1{}//(定义在内部样式或外部样式都可以),再用className操作,不能用class,被系统用了。
//正常情况是标签中直接写class="style1",但为了实现动态效果而使用className进行操作。
</style>
</head>
<body>
	这是一个读取以及修改节点的测试哦!<br>
	<input type="button" value="读取或修改节点信息" οnclick="testDocument();" />
	<h2 id="h2">h2文本</h2>
	<p id="p1">段落文本</p>
	<img id="img1" src="delete.png" />	
</body>
</html></span>

案例3:购物车

<span style="font-size:18px;"><!DOCTYPE html>
<html>
  <head>
    <title>buy.html</title>
	<script type="text/javascript">
	function add(btnObj){//增加购物的数量
   		var tdObj = btnObj.parentNode;//得到当前按钮所在的td
		for(var i=0;i<tdObj.childNodes.length;i++){//得到td的所有子元素,找到那个文本框
			var childNode = tdObj.childNodes[i];
			if(childNode.nodeName == "INPUT" && childNode.type == "text"){
			var oldData = parseInt(childNode.value);//得到旧数据,操作,并显示
			oldData++;	childNode.value = oldData;
			}
		}
	    calTotal();												
	 }
	function sub(btnObj){//减少购物的数量,代码与增加一样,仅仅将oldDate--即可!	
	 }
	function calTotal(){//计算小计和总计
		var tableObj = document.getElementById("shoppingCart");//得到表格的所有行
		var rows = tableObj.getElementsByTagName("tr");
		var total = 0;	
		for(var i=1;i<rows.length;i++){//循环从第二行开始
			var curRow = rows[i];
			//得到第一格中的价格
			var price = curRow.getElementsByTagName("td")[0].innerHTML;
				//得到第二格中的第二个input的value
			var q = curRow.getElementsByTagName("td")[1].getElementsByTagName("input")[1].value;
			var sum = parseFloat(price) * parseFloat(q);//算完,写入第三格
			curRow.getElementsByTagName("td")[2].innerHTML = sum.toFixed(2);
			total += sum;//总计		
		}
		document.getElementById("spanTotal").innerHTML = total.toFixed(2);//显示	
	 }	
	</script>
  </head> 
  <body>
         购物车付款验证! <br>
    <form>	<table border="1" id="shoppingCart">
	<tr>		<td>价格</td><td>数量</td><td>小计</td>	</tr>
	<tr>		<td>10.00</td>
			<td><input type="button" value="-" οnclick="sub(this);" />
				<input type="text" value="1" />
				<input type="button" value="+" οnclick="add(this);" /></td>
			<td>10.00</td>		</tr>
	<tr>		<td>20.00</td>
			<td><input type="button" value="-" οnclick="sub(this);" />
				<input type="text" value="1" />
				<input type="button" value="+" οnclick="add(this);" /></td>
			<td>20.00</td>		</tr>		</table>		
	总计:<span id="spanTotal">00.00</span>						</form>
  <!--总计不能写到表格中,与前几行格式不一致,取得的数为null或未定义,无法计算-->  
  </body>
</html></span>


5、如何用Document增加新节点?删除节点?

1)步骤:
      第一步:创建一个新元素,document.createElement("elementName");

比如:元素名可为a/input/option等;返回新创建的节点。
      第二步:为新元素设置相关的数据

比如:var newNode=document.createElement("input");
newNode.type="text";

newNode.value="mary";

 newNode.style.color="red";
      第三步:把新节点加入树上(新元素加入文档),作为树上某个节点的子节点存在。
xxx.appendChild(newNode);//追加
xxx.insertBefore(newNode,oldNode);//新节点放在旧节点之前
2)案例
eg:添加新节点

<!DOCTYPE html>
<html>
<head>
<title>addNode.html</title>
<script type="text/javascript">
	function addNewNode() {
			var formObj = document.getElementById("form1");
			var obj = document.createElement("input");//为form添加一个文本框
				obj.value = "mary";
				formObj.appendChild(obj);
			var aObj = document.createElement("a");//form最后添加一个超级连接
				aObj.href = "http://tts6.tarena.com.cn";
				aObj.innerHTML = "cilck me";
				formObj.appendChild(aObj);
			var btnObj = document.createElement("input");//在原有按钮的前面加入一个按钮
				btnObj.type = "button";
				btnObj.value = "new button";
				btnObj.onclick = function() {
					alert("hello");
				};//function方法
		formObj.insertBefore(btnObj, formObj.firstChild);//由于第一个子节点为空白,所以此处oldNode可用firstChild去定位(放在空白前)。							
	}
</script>
</head>
<body>
	它会不断产生新节点的哦!<br>
	<form id="form1">
		<input type="button" value="新节点" οnclick="addNewNode();" />
	</form>
</body>
</html>


(为什么我的截图老被系统吃掉啊,无语!)

6、如何用Document删除节点?

      1)语法:parentNode.removeChild(childNode);
       注意事项:一定是从父节点删除子节点,不能直接删除子节点。
      2)经典案例

案例1:

<span style="font-size:18px;"><!DOCTYPE html>
<html>
<head>
<title>deleteNode1.html</title>
<script type="text/javascript">
	function deleteNode() {
		var delNode = document.getElementById("a1");
		delNode.parentNode.removeChild(delNode);
	}
</script>
</head>
<body>
	节点是可以删除的哦<br>
	<input id="btn1" type="button" value="删除节点" οnclick="deleteNode();" />
	<a id="a1" href="#">link1</a>
</body>
</html></span>

案例2:联动菜单

<span style="font-size:18px;"><!DOCTYPE html>
<html>
<head>
<title>deleteNode.html</title>
<script type="text/javascript">
	//以下为JS代码:声明一个数组类型的全局变量用于存储所有的城市数据 
	var array = new Array();
	array[0] = [ "请选择" ];
	array[1] = [ "海淀", "朝阳", "西城", "东城" ];
	array[2] = [ "石家庄", "邢台", "保定" ];
	function showCities() {//根据省显示城市
		//得到第一个选择框的选中的选项的索引
		var i = document.getElementById("sel1").selectedIndex;
		//先删除选择框中原有的元素
		var sellObj = document.getElementById("sel2");
		//	for(var j=0;j<sellObj.childNodes.length;j++){
		//		sellObj.removeChild(sellObj.childNodes[j]);	
		//	}注意事项:这样操作是删不干净的!
		while (sellObj.childNodes.length > 0) {
			sellObj.removeChild(sellObj.firstChild);
		}
		var cities = array[i];//根据索引找到城市数据
		//循环城市数据,创建option元素,文本写入
		for ( var index = 0; index < cities.length; index++) {
			var newNode = document.createElement("option");
			newNode.innerHTML = cities[index];
			document.getElementById("sel2").appendChild(newNode);
		}
	}
</script>
</head>
<body>
	联动菜单的测试<br>
	<select id="sel1" οnchange="showCities();">
		<option>请选择</option>
		<option>北京</option>
		<option>河北</option>
	</select>
	<select id="sel2">
		<option>请选择</option>
	</select>
</body>
</html></span>

结果有没有被吞掉啊?系统大神!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值