javascript之document对象

一、修改网页元素

当使用document提供的方法和Element的属性得到网页元素之后,就可以对元素的内容进行修改,如下例所示的“全选/全不选”的实现。

例3-17

<html>

<head>

<title>全选</title>

<script type="text/javascript">

//实现全选函数

function choose(val){

//通过name属性值得到所有复选框

var listCH = document.getElementsByName("kc");

//循环修改复选框属性

for(var i=0;i<listCH.length;i++){

//修改复选框的状态

listCH[i].checked=val;

}

} </script>

</head>

<body>

<center>

<form>

<h3>你希望学习的课程</h3>

<a href="javascript:choose(true);">全选</a> /

<a href="javascript:choose(false);">全不选</a>

<hr size="1" />

<div >

<input type="checkbox" name="kc" value="0" />java基础<br>

<input type="checkbox" name="kc" value="1" />HTML + CSS + JavaScript <br>

<input type="checkbox" name="kc" value="2" />java核心<br>

<input type="checkbox" name="kc" value="3" />java web<br>

<input type="checkbox" name="kc" value="4" />SSH<br>

<input type="checkbox" name="kc" value="5" />SqlServer2005<br>

<input type="checkbox" name="kc" value="6" />Oracle10g<br>

</div>

</form>

</center>

</body>

</html>

运行上例,单击【全选】按钮,将看到如图3-21所示的效果。当单击【全不选】按钮的时候,所有复选框的选中都将被去掉,如图3-22所示。

图3-21 全选

图3-22 全不选

二、添加网页元素

添加网页元素主要使用document.createElement()方法和Element.appendChild()方法实现。使用document.createElement()方法用于创建一个元素,新创建的元素是独立的,和HTML文档没有任何关系,所以需要使用Element.appendChild()方法将新创建的网页元素添加到DOM中。如下例所示,在层中动态创建文本框。

例3-18

<html>

<head>

<title>添加网页元素</title>

<script type="text/javascript">

function addTxt(){

//创建一个input元素

var txt = document.createElement("input");

//设置元素为文本框

txt.type="text";

txt.value="新添加的文本框";

//将文本框添加到层中

var div = document.getElementById("disDiv");

div.appendChild(txt);

}

</script>

</head>

<body>

<center>

<div />

</center>

</body>

</html>

运行上例,单击一次按钮,层中的按钮就会减少一个。单击两次按钮之后的效果如图3-24所示。

图3-24 删除网页元素

四、cookie

大家可能知道在document对象中有一个cookie 属性。但是cookie是什么呢?cookie就是所谓的缓存文件,也就是某些Web 站点在您的硬盘上用很小的文本文件存储了一些信息,这些文件就称为cookie。一般来说,cookie是CGI或类似比HTML 高级的文件、程序等创建的,但是JavaScript 也提供了对cookie 的很全面的访问权利。

每个cookie 都是这样的:<cookie名>=<值>。

<cookie名>的限制与JavaScript 的命名限制大同小异,只要你只用字母和数字命名,就完全没有问题了。<值>的要求也是“只能用可以用在URL 编码中的字符”。

每个cookie 都有失效日期,一旦电脑的时钟过了失效日期,这个cookie 就会被删掉。不能直接删掉一个cookie,但是可以用设定失效日期早于现在时刻的方法来间接删掉它。

每个网页或者说每个站点,都有它自己的cookie,这些cookie只能由这个站点下的网页来访问,来自其他站点或同一站点下未经授权的区域的网页,是不能访问的。每一“组”cookie有规定的总大小(大约2KB每“组”),一旦超过最大的总大小,则最早失效的cookie会先被删除,以便让新的cookie“安家”。

现在我们来学习使用document.cookie 属性。

如果直接使用document.cookie 属性,或者说用某种方法(如给变量赋值)来获得document.cookie 的值,就可以知道在现在的文档中有多少个cookie,每个cookie 的名字和它的值。例如,在某文档中添加“document.write(document.cookie)”,结果显示:

name=kevin; email=kevin@kevin.com; lastvisited=index.html

这意味着,文档包含三个cookie:name、email和lastvisited,它们的值分别是kevin、kevin@kevin.com和index.html。可以看到,两个cookie之间是用分号和空格隔开的,于是可以用“cookieString.split('; ')”方法得到每个cookie 分开的一个数组。

先用var cookieString = document.cookie,设定一个cookie 的方法,对document.cookie 赋值。与其他情况下的赋值不同,向document.cookie 赋值不会删除原有的cookie,而只会增添cookie 或更改原有cookie。赋值的格式如下:

document.cookie = 'cookieName=' + escape('cookieValue') + ';expires=' + expirationDateObj.toGMTString();

是不是看得头晕了呢?cookieName 表示cookie 的名称,cookieValue 表示cookie 的值,expirationDateObj 表示存储着失效日期的日期对象名,如果不需要指定失效日期,则不需要第二行。不指定失效日期,则浏览器默认是在关闭浏览器(也就是关闭所有窗口)之后过期。

首先,escape() 方法为什么一定要用?因为cookie 的值的要求是“只能用可以用在URL 编码中的字符”。知道了“escape()”方法是把字符串按URL 编码方法来编码的,那只需要用一个“escape()”方法来处理输出到cookie 的值,用“unescape()”来处理从cookie 接收过来的值就万无一失了。而且这两个方法的最常用途就是处理cookie。其实设定一个cookie 只用“document.cookie = 'cookieName=cookieValue'”这么简单,但是为了避免在cookieValue 中出现URL 里不准出现的字符,还是用一个escape()比较好。

然后,“expires”前面的分号,注意到就行了,是分号而不是其他。

最后,toGMTString() 方法,设定cookie 的失效日期都是用GMT 格式的时间的,其他格式的时间是没有作用的。

下面来实战一下。设定一个“name=rose”的cookie,在三个月后过期。

例3-20

var expires = new Date();

expires.setTime(expires.getTime() + 3 * 30 * 24 * 60 * 60 * 1000);

/* 三个月×一个月当做30天×一天24小时

×一小时60 分×一分60 秒×一秒1000 毫秒*/

document.cookie = 'name=redrose;expires=' + expires.toGMTString();

上面为什么没有用escape() 方法?这是因为知道redrose 是一个合法的URL 编码字符串,也就是说,redrose = escape('redrose')。一般来说,如果设定cookie 时不用escape(),那获取cookie 时也不用unescape()。

下面再编写一个函数,作用是查找指定cookie 的值。

例3-21

function getCookie(cookieName) {

var cookieString = document.cookie;

var start = cookieString.indexOf(cookieName + '=');

// 加上等号的原因是避免在某些cookie 的值里有

// 与cookieName 一样的字符串。

if (start == -1) // 找不到

return null;

start += cookieName.length + 1;

var end = cookieString.indexOf(';', start);

if (end == -1) return unescape(cookieString.substring(start));

return unescape(cookieString.substring(start, end));

}

这个函数用到了字符串对象的一些方法,如果你不记得了,请快去查查。这个函数所有的if 语句都没有带上else,这是因为如果条件成立,程序运行的都是return 语句,在函数里碰上return,就会终止运行,所以不加else 也没问题。该函数在找到cookie 时,就会返回cookie 的值,否则返回“null”。

现在要删除刚才设定的“name=redrose”cookie。

var expires = new Date();

expires.setTime(expires.getTime() - 1);

document.cookie = 'name=redrose;expires=' + expires.toGMTString();

可以看到,只需要把失效日期改成比现在日期早一点(这里是早1 毫秒),再用同样的方法设定cookie,就可以删掉cookie 了。