??xml version="1.0" encoding="utf-8" standalone="yes"?>
2. <body onselectstart="return false"> 取消选取、防止复?/p>
3. onpaste="return false" 不准_脓
4. oncopy="return false;" oncut="return false;" 防止复制
5. <link rel="Shortcut Icon" href="favicon.ico"> IE地址栏前换成自己的图?/p>
6. <link rel="Bookmark" href="favicon.ico"> 可以在收藏夹中显C出你的图标
7. <input style="ime-mode:disabled"> 关闭输入?/p>
8. 永远都会带着框架
<script language="JavaScript"><!--
if (window == top)top.location.href = "frames.htm"; //frames.htm为框架网?br />
// --></script>
9. 防止被hframe
<SCRIPT LANGUAGE=JAVASCRIPT><!--
if (top.location != self.location)top.location=self.location;
// --></SCRIPT>
10. |页不能被另存?br />
<noscript><*** src="/*.html>";</***></noscript>
11. <input type=button value="/查看|页源代?
onclick="window.location = "view-source:"+ "http://www.pconline.com.cn"">
12.删除时确?br />
<a href=""javascript :if(confirm("实要删除吗?"))location="boos.asp?&areyou=删除&page=1"">删除</a>
13. 取得控g的绝对位|?br />
//Javascript
<script language="Javascript">
function getIE(e){
var t=e.offsetTop;
var l=e.offsetLeft;
while(e=e.offsetParent){
t+=e.offsetTop;
l+=e.offsetLeft;
}
alert("top="+t+"/nleft="+l);
}
</script>
//VBScript
<script language="VBScript"><!--
function getIE()
dim t,l,a,b
set a=document.all.img1
t=document.all.img1.offsetTop
l=document.all.img1.offsetLeft
while a.tagName<>"BODY"
set a = a.offsetParent
t=t+a.offsetTop
l=l+a.offsetLeft
wend
msgbox "top="&t&chr(13)&"left="&l,64,"得到控g的位|?
end function
--></script>
14. 光标是停在文本框文字的最?br />
<script language="javascript">
function cc()
{
var e = event.srcElement;
var r =e.createTextRange();
r.moveStart("character",e.value.length);
r.collapse(true);
r.select();
}
</script>
<input type=text name=text1 value="123" onfocus="cc()">
15. 判断上一늚来源
javascript :
document.referrer
16. 最化、最大化、关闭窗?br />
<object id=hh1 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
<param name="Command" value="Minimize"></object>
<object id=hh2 classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">
<param name="Command" value="Maximize"></object>
<OBJECT id=hh3 classid="clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11">
<PARAM NAME="Command" value="/Close"></OBJECT>
<input type=button value="/最化 onclick=hh1.Click()>
<input type=button value="/blog/最大化 onclick=hh2.Click()>
<input type=button value=关闭 onclick=hh3.Click()>
本例适用于IE
17.屏蔽功能键Shift,Alt,Ctrl
<script>
function look(){
if(event.shiftKey)
alert("止按Shift?"); //可以换成ALT CTRL
}
document.onkeydown=look;
</script>
18. |页不会被缓?br />
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
或?lt;META HTTP-EQUIV="expires" CONTENT="0">
19.怎样让表单没有凹凸感Q?br />
<input type=text style="""border:1 solid #000000">
?br />
<input type=text style="border-left:none; border-right:none; border-top:none; border-bottom:
1 solid #000000"></textarea>
20.<div><span>&<layer>的区别?
<div>(division)用来定义大段的页面元素,会生{?
<span>用来定义同一行内的元素,?lt;div>的唯一区别是不产生转行
<layer>是ns的标讎ͼie不支持,相当?lt;div>
21.让弹出窗口L在最上面:
<body onblur="this.focus();">
22.不要滚动?
让竖条没?
<body style="overflow:scroll;overflow-y:hidden">
</body>
让横条没?
<body style="overflow:scroll;overflow-x:hidden">
</body>
两个都去掉?更简单了
<body scroll="no">
</body>
23.怎样L囄链接点击后,囄周围的虚U?
<a href="#" onFocus="this.blur()"><img src="/logo.jpg" border=0></a>
24.电子邮g处理提交表单
<form name="form1" method="post" action=mailto:****@***.com
enctype="text/plain">
<input type=submit>
</form>
25.在打开的子H口h父窗口的代码里如何写Q?br />
window.opener.location.reload()
26.如何讑֮打开面的大?br />
<body onload="top.resizeTo(300,200);">
打开面的位|?lt;body onload="top.moveBy(300,200);">
27.在页面中如何加入不是满铺的背景图?拉动面时背景图不动
<STYLE>
body
{background-image:url(/logo.gif); background-repeat:no-repeat;
background-position:center;background-attachment: fixed}
</STYLE>
28. 查一D字W串是否全由数字l成
<script language="Javascript"><!--
function checkNum(str){return str.match(//D/)==null}
alert(checkNum("1232142141"))
alert(checkNum("123214214a1"))
// --></script>
29. 获得一个窗口的大小
document.body.clientWidth; document.body.clientHeight
30. 怎么判断是否是字W?br />
if (/[^/x00-/xff]/g.test(s)) alert("含有汉字");
else alert("全是字符");
31.TEXTAREA自适应文字行数的多?br />
<textarea rows=1 name=s1 cols=27 onpropertychange
="this.style.posHeight=this.scrollHeight">
</textarea>
32. 日期减去天数{于W二个日?br />
<script language=Javascript>
function cc(dd,dadd)
{
//可以加上错误处理
var a = new Date(dd)
a = a.valueOf()
a = a - dadd * 24 * 60 * 60 * 1000
a = new Date(a)
alert(a.getFullYear() + "q? + (a.getMonth() + 1) + "? + a.getDate() + "?)
}
cc("12/23/2002",2)
</script>
33. 选择了哪一个Radio
<HTML><script language="vbscript">
function checkme()
for each ob in radio1
if ob.checked then
window.alert ob.value
next
end function
</script><BODY>
<INPUT name="radio1" type="radio" value="/style" checked>Style
<INPUT name="radio1" type="radio" value="/blog/barcode">Barcode
<INPUT type="button" value="check" onclick="checkme()">
</BODY></HTML>
34.脚本怸出错
<SCRIPT LANGUAGE="JavaScript">
<!-- Hide
function killErrors() {
return true;
}
window.onerror = killErrors;
// -->
</SCRIPT>
35.ENTER键可以让光标Ud下一个输入框
<input onkeydown="if(event.keyCode==13)event.keyCode=9">
36. 某个网站的链接速度Q?br />
把如下代码加?lt;body>区域?
<script language=Javascript>
tim=1
setInterval("tim++",100)
b=1
var autourl=new Array()
autourl[1]=1000){this.resized=true;this.style.width=1000;}" align=absMiddle border=0>www.njcatv.net"
autourl[2]="javacool.3322.net"
autourl[3]=1000){this.resized=true;this.style.width=1000;}" align=absMiddle border=0>www.sina.com.cn"
autourl[4]="www.nuaa.edu.cn"
autourl[5]=1000){this.resized=true;this.style.width=1000;}" align=absMiddle border=0>www.cctv.com"
function butt(){
***("<form name=autof>")
for(var i=1;i<autourl.length;i++)
***("<input type=text name=txt"+i+" size=10 value="/试?#8230;…> =?lt;input type=text
name=url"+i+" size=40> =?lt;input type=button value="/blog/GO
onclick=window.open(this.form.url"+i+".value)><br>")
***("<input type=submit value=h></form>")
}
butt()
function auto(url){
document.forms[0]["url"+b].value=url
if(tim>200)
{document.forms[0]["txt"+b].value="/链接时"}
else
{document.forms[0]["txt"+b].value="/blog/旉"+tim/10+"U?}
b++
}
function run(){for(var i=1;i<autourl.length;i++)***("<img src=http://"+autourl+"/"+Math.random()+" width=1 height=1
onerror=auto("http://"+autourl+"")>")}
run()</script>
37. 各种样式的光?br />
auto Q标准光?br />
default Q标准箭?br />
hand Q手形光?br />
wait Q等待光?br />
text QI形光?br />
vertical-text Q水qI形光?br />
no-drop Q不可拖动光?br />
not-allowed Q无效光?br />
help Q?帮助光标
all-scroll Q三角方向标
move Q移动标
crosshair Q十字标
e-resize
n-resize
nw-resize
w-resize
s-resize
se-resize
sw-resize
38.面q入和退出的Ҏ
q入面<meta http-equiv="Page-Enter" content="revealTrans(duration=x, transition=y)">
推出面<meta http-equiv="Page-Exit" content="revealTrans(duration=x, transition=y)">
q个是页面被载入和调出时的一些特效。duration表示Ҏ的持l时_以秒为单位。transition表示使用哪种ҎQ取gؓ1-23:
0 矩Ş~小
1 矩Ş扩大
2 圆Ş~小
3 圆Ş扩大
4 下到上刷?
5 上到下刷?br />
6 左到叛_?
7 叛_左刷?
8 竖百叶窗
9 横百叶窗
10 错位横百叶窗
11 错位竖百叶窗
12 Ҏ?
13 左右C间刷?
14 中间到左叛_?br />
15 中间C?br />
16 上下C?
17 右下到左?br />
18 右上到左?
19 左上到右?
20 左下到右?br />
21 横条
22 竖条
23 以上22U随机选择一U?/p>
39.在规定时间内跌{
<META http-equiv=V="REFRESH" content="5;URL=http://www.51js.com">
40.|页是否被检?br />
<meta name="ROBOTS" content="属性?>
其中属性值有以下一?
属性gؓ"all": 文g被索,且页上链接可被查询;
属性gؓ"none": 文g不被索,而且不查询页上的链接Q?br />
属性gؓ"index": 文g被索;
属性gؓ"follow": 查询上的链接;
属性gؓ"noindex": 文g不检索,但可被查询链接;
属性gؓ"nofollow": 文g不被索,但可查询上的链接?/p>
41、email地址的分?br />
把如下代码加?lt;body>区域?br />
<a href="mailto:webmaster@sina.com">webmaster@sina.com</a>
42、流动边框效果的表格
把如下代码加?lt;body>区域?br />
<SCRIPT>
l=Array(6,7,8,9,'a','b','b','c','d','e','f')
Nx=5;Ny=35
t="<table border=0 cellspacing=0 cellpadding=0 height="+((Nx+2)*16)+"><tr>"
for(x=Nx;x<Nx+Ny;x++)
t+="<td width=16 id=a_mo"+x+"> </td>"
t+="</tr><tr><td width=10 id=a_mo"+(Nx-1)+"> </td><td colspan="+(Ny-2)+" rowspan="+(Nx)+"> </td><td width=16 id=a_mo"+(Nx+Ny)+"></td></tr>"
for(x=2;x<=Nx;x++)
t+="<tr><td width=16 id=a_mo"+(Nx-x)+"> </td><td width=16 id=a_mo"+(Ny+Nx+x-1)+"> </td></tr>"
t+="<tr>"
for(x=Ny;x>0;x--)
t+="<td width=16 id=a_mo"+(x+Nx*2+Ny-1)+"> </td>"
***(t+"</tr></table>")
var N=Nx*2+Ny*2
function f1(y){
for(i=0;i<N;i++){
c=(i+y)%20;if(c>10)c=20-c
document.all["a_mo"+(i)].bgColor=""""#0000"+l[c]+l[c]+"'"}
y++
setTimeout('f1('+y+')','1')}
f1(1)
</SCRIPT>
43、JavaScript主页弹出H口技?br />
H口中间弹出
<script>
window.open("http://www.cctv.com","","width=400,height=240,top="+(screen.availHeight-240)/2+",left="+(screen.availWidth-400)/2);
</script>
============
<html>
<head>
<script language="LiveScript">
function WinOpen() {
msg=open("","DisplayWindow","toolbar=no,directories=no,menubar=no");
msg.***("<HEAD><TITLE>?|?</TITLE></HEAD>");
msg.***("<CENTER><H1>???</H1><h2>q??lt;B>JavaScript</B>所 开 ??H?</h2></CENTER>");
}
</script>
</head>
<body>
<form>
<input type="button" name="Button1" value="Push me" onclick="WinOpen()">
</form>
</body>
</html>
==============
一、在下面的代码中Q你只要单击打开一个窗口,卛_链接到赛q网。而当你想关闭Ӟ只要单击一下即可关闭刚才打开的窗口?br />
代码如下Q?
<SCRIPT language="JavaScript">
<Q?-
function openclk() {
another=open('1000){this.resized=true;this.style.width=1000;}" align=absMiddle border=0>http://www.ccidnet.com'Q?NewWindow');
}
function closeclk() {
another.close();
}
//-->
</SCRIPT>
<FORM>
<INPUT TYPE="BUTTON" NAME="open" value="/打开一个窗? onClick="openclk()">
<BR>
<INPUT TYPE="BUTTON" NAME="close" value="/blog/关闭q个H口" onClick="closeclk()">
</FORM>
二、上面的代码也太静了Qؓ何不来点动感呢?如果能给面来个降落效果那该多好啊!
代码如下Q?
<script>
function drop(n) {
if(self.moveBy){
self.moveBy (0Q?900);
for(i = n; i > 0; i--){
self.moveBy(0Q?);
}
for(j = 8; j > 0; j--){
self.moveBy(0Qj);
self.moveBy(jQ?);
self.moveBy(0Q?j);
self.moveBy(-jQ?);
}
}
}
</script>
<body onLoad="drop(300)">
三、讨厌很多网站L按照默认H口打开Q如果你能随心所Ʋ控制打开的窗口那该多好?
代码如下:
<SCRIPT LANGUAGE="JavaScript">
<Q?- Begin
function popupPage(lQ?tQ?wQ?h) {
var windowprops = "location=noQscrollbars=noQmenubars=noQtoolbars=noQresizable=yes" +
"Qleft=" + l + "Qtop=" + t + "Qwidth=" + w + "Qheight=" + h;
var URL = "http://www.80cn.com";
popup = window.open(URLQ?MenuPopup"Qwindowprops);
}
// End -->
</script>
<table>
<tr>
<td>
<form name=popupform>
<pre>
打开面的参?lt;br>
d左边的距? <input type=text name=left size=2 maxlength=4> pixels
d双的距? <input type=text name=top size=2 maxlength=4> pixels
H口的宽? <input type=text name=width size=2 maxlength=4> pixels
H口的高? <input type=text name=height size=2 maxlength=4> pixels
</pre>
<center>
<input type=button value="打开q个H口Q? onClick="popupPage(this.form.left.valueQ?this.form.top.valueQ?this.form.width.valueQ?br />
this.form.height.value)">
</center>
</form>
</td>
</tr>
</table>你只要在相对应的对话框中输入一个数值即可,要打开的页面的H口控制得很好?
44、页面的打开Ud
把如下代码加?lt;body>区域?br />
<SCRIPT LANGUAGE="JavaScript">
<!-- Begin
for (t = 2; t > 0; t--) {
for (x = 20; x > 0; x--) {
for (y = 10; y > 0; y--) {
parent.moveBy(0,-x);
}
}
for (x = 20; x > 0; x--) {
for (y = 10; y > 0; y--) {
parent.moveBy(0,x);
}
}
for (x = 20; x > 0; x--) {
for (y = 10; y > 0; y--) {
parent.moveBy(x,0);
}
}
for (x = 20; x > 0; x--) {
for (y = 10; y > 0; y--) {
parent.moveBy(-x,0);
}
}
}
//-->
// End -->
</script>
45、显CZ人客L机器的日期和旉
<script language="LiveScript">
<!-- Hiding
today = new Date()
***("????是: ",today.getHours(),":",today.getMinutes())
***("<br>????为: ", today.getMonth()+1,"/",today.getDate(),"/",today.getYear());
// end hiding contents -->
</script>
46、自动的Z每次产生最後修改的日期了:
<html>
<body>
This is a simple HTML- page.
<br>
Last changes:
<script language="LiveScript">
<!-- hide script from old browsers
***(document.lastModified)
// end hiding contents -->
</script>
</body>
</html>
47、不能ؓI和邮g地址的约束:
<html>
<head>
<script language="JavaScript">
<!-- Hide
function test1(form) {
if (form.text1.value == "")
alert("???????西, ????一 ?!")
else {
alert("?"+form.text1.value+"! ??????!");
}
}
function test2(form) {
if (form.text2.value == "" ||
form.text2.value.indexOf('@', 0) == -1)
alert("q??????e-mail address! ????一 ?!");
else alert("??????!");
}
// -->
</script>
</head>
<body>
<form name="first">
Enter your name:<br>
<input type="text" name="text1">
<input type="button" name="button1" value="???? onClick="test1(this.form)">
<P>
Enter your e-mail address:<br>
<input type="text" name="text2">
<input type="button" name="button2" value="???? onClick="test2(this.form)">
</body>
48、跑马灯
<html>
<head>
<script language="JavaScript">
<!-- Hide
var scrtxt="怎麽?! 很酷?! 您也可以试试."+"Here goes your message the visitors to your
page will "+"look at for hours in pure fascination...";
var lentxt=scrtxt.length;
var width=100;
var pos=1-width;
function scroll() {
pos++;
var scroller="";
if (pos==lentxt) {
pos=1-width;
}
if (pos<0) {
for (var i=1; i<=Math.abs(pos); i++) {
scroller=scroller+" ";}
scroller=scroller+scrtxt.substring(0,width-i+1);
}
else {
scroller=scroller+scrtxt.substring(pos,width+pos);
}
window.status = scroller;
setTimeout("scroll()",150);
}
//-->
</script>
</head>
<body onLoad="scroll();return true;">
q里可显C您的网?!
</body>
</html>
49、在|页中用按钮来控制前,后页和主늚昄?br />
<html>
<body>
<FORM NAME="buttonbar">
<INPUT TYPE="button" VALUE="Back" onClick="history.back()">
<INPUT TYPE="button" VALUE="JS- Home" onClick="location='script.html'">
<INPUT TYPE="button" VALUE="Next" onCLick="history.forward()">
</FORM>
</body>
</html>
50、查看某|址的源代码
把如下代码加?lt;body>区域?br />
<SCRIPT>
function add()
{
var ress=document.forms[0].luxiaoqing.value
window.location="view-source:"+ress;
}
</SCRIPT>
输入要查看源代码的URL地址:
<FORM><input type="text" name="luxiaoqing" size=40 value="http://"></FORM>
<FORM><br>
<INPUT type="button" value="查看源代? onClick=add()>
</FORM>
51、title昄日期
把如下代码加?lt;body>区域?
<script language="JavaScript1.2">
<!--hide
var isnMonth = new
Array("1?,"2?,"3?,"4?,"5?,"6?,"7?,"8?,"9?,"10?,"11?,"12?);
var isnDay = new
Array("星期?,"星期一","星期?,"星期?,"星期?,"星期?,"星期?,"星期?);
today = new Date () ;
Year=today.getYear();
Date=today.getDate();
if (document.all)
document.title="今天? "+Year+"q?+isnMonth[today.getMonth()]+Date+"?+isnDay[today.getDay()]
//--hide-->
</script>
52、显C所有链?br />
把如下代码加?lt;body>区域?br />
<script language="JavaScript1.2">
<!--
function extractlinks(){
var links=document.all.tags("A")
var total=links.length
var win2=window.open("","","menubar,scrollbars,toolbar")
win2.***("<font size='2'>一共有"+total+"个连?lt;/font><br>")
for (i=0;i<total;i++){
win2.***("<font size='2'>"+links[i].outerHTML+"</font><br>")
}
}
//-->
</script>
<input type="button" onClick="extractlinks()" value="昄所有的q接">
53、回车键换行
把如下代码加?lt;body>区域?br />
<script type="text/javascript">
function handleEnter (field, event) {
var keyCode = event.keyCode ? event.keyCode : event.which ?
event.which : event.charCode;
if (keyCode == 13) {
var i;
for (i = 0; i < field.form.elements.length; i++)
if (field == field.form.elements[i])
break;
i = (i + 1) % field.form.elements.length;
field.form.elements[i].focus();
return false;
}
else
return true;
}
</script>
<form>
<input type="text" onkeypress="return handleEnter(this, event)"><br>
<input type="text" onkeypress="return handleEnter(this, event)"><br>
<textarea>回R换行
54、确认后提交
把如下代码加?lt;body>区域?br />
<SCRIPT LANGUAGE="JavaScript">
<!--
function msg(){
if (confirm("你确认要提交嘛!"))
document.lnman.submit()
}
//-->
</SCRIPT>
<form name="lnman" method="post" action="">
<p>
<input type="text" name="textfield" value="认后提?>
</p>
<p>
<input type="button" name="Submit" value="提交" onclick="msg();">
</p>
</form>
55、改变表格的内容
把如下代码加?lt;body>区域?br />
<script ***script>
var arr=new Array()
arr[0]="一一一一一";
arr[1]="二二二二?;
arr[2]="三三三三?;
</script>
<select onchange="zz.cells[this.selectedIndex].innerHTML=arr[this.selectedIndex]">
<option value=a>改变W一?lt;/option>
<option value=a>改变W二?lt;/option>
<option value=a>改变W三?lt;/option>
</select>
<table id=zz border=1>
<tr height=20>
<td width=150>W一?lt;/td>
<td width=150>W二?lt;/td>
<td width=150>W三?lt;/td>
</tr>
</table>
function func1(…){…}
var func2=function(…){…};
var func3=function func4(…){…};
var func5=new Function();
q些都是声明函数的正语法。它们和其他语言中常见的函数或之前介l的函数定义方式有着很大的区别。那么在JavaScript中ؓ什么能q么写?它所遵@的语法是什么呢Q下面将介绍q些内容?/p>
认识函数对象QFunction ObjectQ?/p>
可以用function关键字定义一个函敎ͼqؓ每个函数指定一个函数名Q通过函数名来q行调用。在JavaScript解释执行Ӟ函数都是被维护ؓ一个对象,q就是要介绍的函数对象(Function ObjectQ?/p>
函数对象与其他用h定义的对象有着本质的区别,q一cd象被UC为内部对象,例如日期对象QDateQ、数l对象(ArrayQ、字W串对象QStringQ都属于内部对象。这些内|对象的构造器是由JavaScript本n所定义的:通过执行new Array()q样的语句返回一个对象,JavaScript内部有一套机制来初始化返回的对象Q而不是由用户来指定对象的构造方式?/p>
在JavaScript中,函数对象对应的类型是FunctionQ正如数l对象对应的cd是ArrayQ日期对象对应的cd是Date一P可以通过new Function()来创Z个函数对象,也可以通过function关键字来创徏一个对象。ؓ了便于理解,我们比较函数对象的创建和数组对象的创建。先看数l对象:下面两行代码都是创徏一个数l对象myArrayQ?/p>
var myArray=[];
//{h?br>var myArray=new Array();
同样Q下面的两段代码也都是创Z个函数myFunctionQ?br>function myFunction(a,b){
return a+b;
}
//{h?br>var myFunction=new Function("a","b","return a+b");
通过和构造数l对象语句的比较Q可以清楚的看到函数对象本质Q前面介l的函数声明是上qC码的W一U方式,而在解释器内部,当遇到这U语法时Q就会自动构造一个Function对象Q将函数作ؓ一个内部的对象来存储和q行。从q里也可以看刎ͼ一个函数对象名Uͼ函数变量Q和一个普通变量名U具有同L规范Q都可以通过变量名来引用q个变量Q但是函数变量名后面可以跟上括号和参数列表来q行函数调用?/p>
用new Function()的Ş式来创徏一个函C常见Q因Z个函C通常会有多条语句Q如果将它们以一个字W串的Ş式作为参C递,代码的可L差。下面介l一下其使用语法Q?/p>
var funcName=new Function(p1,p2,,pn,body);
参数的类型都是字W串Qp1到pn表示所创徏函数的参数名U列表,body表示所创徏函数的函C语句QfuncName是所创徏函数的名U。可以不指定M参数创徏一个空函数Q不指定funcName创徏一个无名函敎ͼ当然那样的函数没有Q何意义?/p>
需要注意的是,p1到pn是参数名U的列表Q即p1不仅能代表一个参敎ͼ它也可以是一个逗号隔开的参数列表,例如下面的定义是{h的:
new Function("a", "b", "c", "return a+b+c")
new Function("a, b, c", "return a+b+c")
new Function("a,b", "c", "return a+b+c")
JavaScript引入Functioncdq提供new Function()q样的语法是因ؓ函数对象d属性和Ҏ必d助于Functionq个cd?br>函数的本质是一个内部对象,由JavaScript解释器决定其q行方式。通过上述代码创徏的函敎ͼ在程序中可以使用函数名进行调用。本节开头列出的函数定义问题也得C解释。注意可直接在函数声明后面加上括号就表示创徏完成后立卌行函数调用,例如Q?/p>
var i=function (a,b){
return a+b;
}(1,2);
alert(i);
q段代码会显C变量i的值等?。i是表C回的|而不是创建的函数Q因为括?#8220;(”比等?#8220;=”有更高的优先U。这L代码可能q不常用Q但当用h在很长的代码D中q行模块化设计或者想避免命名冲突Q这是一个不错的解决办法?/p>
需要注意的是,管下面两种创徏函数的方法是{h的:
function funcName(){
//函数?br>}
//{h?br>var funcName=function(){
//函数?br>}
但前面一U方式创建的是有名函敎ͼ而后面是创徏了一个无名函敎ͼ只是让一个变量指向了q个无名函数。在使用上仅有一点区别,是Q对于有名函敎ͼ它可以出现在调用之后再定义;而对于无名函敎ͼ它必L在调用之前就已经定义。例如:
Qscript language="JavaScript" type="text/javascript"Q?br>Q?--
func();
var func=function(){
alert(1)
}
//--Q?br>Q?scriptQ?br> q段语句生func未定义的错误Q而:
Qscript language="JavaScript" type="text/javascript"Q?br>Q?--
func();
function func(){
alert(1)
}
//--Q?br>Q?scriptQ?br> 则能够正执行,下面的语句也能正执行:
Qscript language="JavaScript" type="text/javascript"Q?br>Q?--
func();
var someFunc=function func(){
alert(1)
}
//--Q?br>Q?scriptQ?/p>
由此可见Q尽JavaScript是一门解释型的语aQ但它会在函数调用时Q检查整个代码中是否存在相应的函数定义,q个函数名只有是通过function funcName()形式定义的才会有效,而不能是匿名函数?/p>
函数对象和其他内部对象的关系
除了函数对象Q还有很多内部对象,比如QObject、Array、Date、RegExp、Math、Error。这些名U实际上表示一个类型,可以通过new操作W返回一个对象。然而函数对象和其他对象不同Q当用typeof得到一个函数对象的cdӞ它仍然会q回字符?#8220;function”Q而typeof一个数l对象或其他的对象时Q它会返回字W串“object”。下面的代码CZ了typeof不同cd的情况:
alert(typeof(Function)));
alert(typeof(new Function()));
alert(typeof(Array));
alert(typeof(Object));
alert(typeof(new Array()));
alert(typeof(new Date()));
alert(typeof(new Object()));
q行q段代码可以发现Q前?条语句都会显C?#8220;function”Q而后?条语句则昄“object”Q可见new一个function实际上是q回一个函数。这与其他的对象有很大的不同。其他的cdArray、Object{都会通过new操作W返回一个普通对象。尽函数本w也是一个对象,但它与普通的对象q是有区别的Q因为它同时也是对象构造器Q也是_可以new一个函数来q回一个对象,q在前面已经介绍。所有typeofq回“function”的对象都是函数对象。也U这L对象为构造器QconstructorQ,因而,所有的构造器都是对象Q但不是所有的对象都是构造器?/p>
既然函数本n也是一个对象,它们的类型是functionQ联惛_C++、Java{面向对象语a的类定义Q可以猜到Functioncd的作用所在,那就是可以给函数对象本n定义一些方法和属性,借助于函数的prototype对象Q可以很方便C改和扩充Functioncd的定义,例如下面扩展了函数类型FunctionQؓ其增加了method1ҎQ作用是弹出对话框显C?function"Q?/p>
Function.prototype.method1=function(){
alert("function");
}
function func1(a,b,c){
return a+b+c;
}
func1.method1();
func1.method1.method1();
注意最后一个语句:func1.method1.mehotd1()Q它调用了method1q个函数对象的method1Ҏ。虽然看上去有点ҎhQ但仔细观察一下语法还是很明确的:q是一个递归的定义。因为method1本n也是一个函敎ͼ所以它同样h函数对象的属性和ҎQ所有对Functioncd的方法扩充都hq样的递归性质?/p>
Function是所有函数对象的基础Q而Object则是所有对象(包括函数对象Q的基础。在JavaScript中,M一个对象都是Object的实例,因此Q可以修改Objectq个cd来让所有的对象h一些通用的属性和ҎQ修改Objectcd是通过prototype来完成的Q?/p>
Object.prototype.getType=function(){
return typeof(this);
}
var array1=new Array();
function func1(a,b){
return a+b;
}
alert(array1.getType());
alert(func1.getType());
上面的代码ؓ所有的对象d了getTypeҎQ作用是q回该对象的cd。两条alert语句分别会显C?#8220;object”?#8220;function”?/p>
函C为参C?/p>
在前面已l介l了函数对象本质Q每个函数都被表CZؓ一个特D的对象Q可以方便的其赋值给一个变量,再通过q个变量名进行函数调用。作Z个变量,它可以以参数的Ş式传递给另一个函敎ͼq在前面介绍JavaScript事g处理机制中已l看到过q样的用法,例如下面的程序将func1作ؓ参数传递给func2Q?/p>
function func1(theFunc){
theFunc();
}
function func2(){
alert("ok");
}
func1(func2);
在最后一条语句中Qfunc2作ؓ一个对象传递给了func1的Ş参theFuncQ再由func1内部q行theFunc的调用。事实上Q将函数作ؓ参数传递,或者是函数赋值给其他变量是所有事件机制的基础?/p>
例如Q如果需要在面载入时进行一些初始化工作Q可以先定义一个init的初始化函数Q再通过window.onload=init;语句其l定到页面蝲入完成的事g。这里的init是一个函数对象,它可以加入window的onload事g列表?/p> 传递给函数的隐含参敎ͼarguments
当进行函数调用时Q除了指定的参数外,q创Z个隐含的对象——arguments。arguments是一个类似数l但不是数组的对象,说它cM是因为它h数组一L讉K性质Q可以用arguments[index]q样的语法取|拥有数组长度属性length。arguments对象存储的是实际传递给函数的参敎ͼ而不局限于函数声明所定义的参数列表,例如Q?/p>
function func(a,b){
alert(a);
alert(b);
for(var i=0;iQarguments.length;i++){
alert(arguments[i]);
}
}
func(1,2,3);
代码q行时会依次昄Q?Q?Q?Q?Q?。因此,在定义函数的时候,即不指定参数列表,仍然可以通过arguments引用到所获得的参敎ͼq给~程带来了很大的灉|性。arguments对象的另一个属性是calleeQ它表示对函数对象本w的引用Q这有利于实现无名函数的递归或者保证函数的装性,例如使用递归来计?到n的自然数之和Q?/p>
var sum=function(n){
if(1==n)return 1;
else return n+sum(n-1);
}
alert(sum(100));
其中函数内部包含了对sum自n的调用,然而对于JavaScript来说Q函数名仅仅是一个变量名Q在函数内部调用sum即相当于调用一个全局变量Q不能很好的体现出是调用自nQ所以用arguments.callee属性会是一个较好的办法Q?/p>
var sum=function(n){
if(1==n)return 1;
else return n+arguments.callee(n-1);
}
alert(sum(100));
callee属性ƈ不是arguments不同于数l对象的惟一特征Q下面的代码说明了arguments不是由Arraycd创徏Q?/p>
Array.prototype.p1=1;
alert(new Array().p1);
function func(){
alert(arguments.p1);
}
func();
q行代码可以发现Q第一个alert语句昄?Q即表示数组对象拥有属性p1Q而func调用则显CZؓ“undefined”Q即p1不是arguments的属性,由此可见Qargumentsq不是一个数l对象?
函数的apply、callҎ和length属?/p>
JavaScript为函数对象定义了两个ҎQapply和callQ它们的作用都是函数绑定到另外一个对象上去运行,两者仅在定义参数的方式有所区别Q?/p>
Function.prototype.apply(thisArg,argArray);
Function.prototype.call(thisArg[,arg1[,arg2…]]);
从函数原型可以看刎ͼW一个参数都被取名ؓthisArgQ即所有函数内部的this指针都会被赋gؓthisArgQ这实C函C为另外一个对象的Ҏq行的目的。两个方法除了thisArg参数Q都是ؓFunction对象传递的参数。下面的代码说明了apply和callҎ的工作方式:
//定义一个函数func1Q具有属性p和方法A
function func1(){
this.p="func1-";
this.A=function(arg){
alert(this.p+arg);
}
}
//定义一个函数func2Q具有属性p和方法B
function func2(){
this.p="func2-";
this.B=function(arg){
alert(this.p+arg);
}
}
var obj1=new func1();
var obj2=new func2();
obj1.A("byA"); //昄func1-byA
obj2.B("byB"); //昄func2-byB
obj1.A.apply(obj2,["byA"]); //昄func2-byAQ其中[“byA”]是仅有一个元素的数组Q下?br>obj2.B.apply(obj1,["byB"]); //昄func1-byB
obj1.A.call(obj2,"byA"); //昄func2-byA
obj2.B.call(obj1,"byB"); //昄func1-byB
可以看出Qobj1的方法A被绑定到obj2q行后,整个函数A的运行环境就转移Cobj2Q即this指针指向了obj2。同样obj2的函数B也可以绑定到obj1对象去运行。代码的最?行显CZapply和call函数参数形式的区别?/p>
与arguments的length属性不同,函数对象q有一个属性lengthQ它表示函数定义时所指定参数的个敎ͼ而非调用时实际传递的参数个数。例如下面的代码显C?Q?/p>
function sum(a,b){
return a+b;
}
alert(sum.length);
深入认识JavaScript中的this指针
this指针是面向对象程序设计中的一w要概念,它表C当前运行的对象。在实现对象的方法时Q可以用this指针来获得该对象自n的引用?/p>
和其他面向对象的语言不同QJavaScript中的this指针是一个动态的变量Q一个方法内的this指针q不是始l指向定义该Ҏ的对象的Q在上一节讲函数的apply和callҎ时已l有q这L例子。ؓ了方便理解,再来看下面的例子Q?/p>
Qscript language="JavaScript" type="text/javascript"Q?br>Q?--
//创徏两个I对?br>var obj1=new Object();
var obj2=new Object();
//l两个对象都d属性pQƈ分别{于1?
obj1.p=1;
obj2.p=2;
//lobj1dҎQ用于显Cp的?br>obj1.getP=function(){
alert(this.p); //表面上this指针指向的是obj1
}
//调用obj1的getPҎ
obj1.getP();
//使obj2的getPҎ{于obj1的getPҎ
obj2.getP=obj1.getP;
//调用obj2的getPҎ
obj2.getP();
//--Q?br>Q?scriptQ?br> 从代码的执行l果看,分别弹出对话框显C??。由此可见,getP函数仅定义了一ơ,在不同的场合q行Q显CZ不同的运行结果,q是有this指针的变化所军_的。在obj1的getPҎ中,this指向了obj1对象Q而在obj2的getPҎ中,this指向了obj2对象Qƈ通过this指针引用C两个对象都具有的属性p?/p>
由此可见QJavaScript中的this指针是一个动态变化的变量Q它表明了当前运行该函数的对象。由this指针的性质Q也可以更好的理解JavaScript中对象的本质Q一个对象就是由一个或多个属性(ҎQ组成的集合。每个集合元素不是仅能属于一个集合,而是可以动态的属于多个集合。这P一个方法(集合元素Q由谁调用,this指针指向谁。实际上Q前面介l的applyҎ和callҎ都是通过强制改变this指针的值来实现的,使this指针指向参数所指定的对象,从而达到将一个对象的Ҏ作ؓ另一个对象的Ҏq行?/p>
每个对象集合的元素(卛_性或ҎQ也是一个独立的部分Q全局函数和作Z个对象方法定义的函数之间没有M区别Q因为可以把全局函数和变量看作ؓwindow对象的方法和属性。也可以使用new操作W来操作一个对象的Ҏ来返回一个对象,q样一个对象的Ҏ也就可以定义为类的Ş式,其中的this指针则会指向新创建的对象。在后面可以看到Q这时对象名可以起到一个命名空间的作用Q这是用JavaScriptq行面向对象E序设计的一个技巧。例如:
var namespace1=new Object();
namespace1.class1=function(){
//初始化对象的代码
}
var obj1=new namespace1.class1();
q里可以把namespace1看成一个命名空间?/p>
׃对象属性(ҎQ的动态变化特性,一个对象的两个属性(ҎQ之间的互相引用Q必要通过this指针Q而其他语a中,this关键字是可以省略的。如上面的例子中Q?/p>
obj1.getP=function(){
alert(this.p); //表面上this指针指向的是obj1
}
q里的this关键字是不可省略的,即不能写成alert(p)的Ş式。这得getP函数d用上下文环境中的p变量Q而不是obj1的属性?
说明Q该文ؓ?/span>JavaScript高E序设计》第16章学习笔记?/span>
?/span>Web目中,要实现客L与服务端的交互,可通过cookie、隐藏框架?/span>HTTPh?/span>LiveConnecth和智?/span>HTTPh{方式实玎ͼ
一Q?span> cookie
cookie是第一?/span>JavaScript可以利用的客L-服务端之间的交互手段。浏览器向服务器发送请求时Qؓq个服务器存储的cookie会与其他信息一起发送到服务器。这使得JavaScript可以在客L讄一?/span>cookieQ之后服务器端就能够d它了?/span>
1Q?span> cookie的成?/span>
名称——每一?/span>cookie׃个唯一的名UC表。这个名U可以包含字母、数字和下划Uѝ不区分大小写?/span>
值——保存在cookie中的字符串倹{这个值在存储之前必须?/span>encodeURIComponent()对其q行~码Q以免丢失数据或占用?/span>cookie。名U和值加h的字节数不能过4095字节Q也是4KB?/span>
域——处于安全考虑Q网站不能访问其他域创徏?/span>cookie。创?/span>cookie后,域的信息会作?/span>cookie的一部分存储h。不q,虽然q不常见Q还是可以覆盖这个设|以允许另一个网站访问这?/span>cookie的?/span>
路径——另一?/span>cookie的安全特性,路径限制了对Web服务器上的特定目录的讉K。例如,可指?/span>cookie只能?/span>http://www.wrox.com/books中访问?/span>
失效日期——确?/span>cookie何时删除。默认情况下Q关闭浏览器Ӟ卛_cookie删除Q不q可以自p|删除时间。这个值是?/span>GMT格式的日期(可以使用Date对象?/span>toGMTString()ҎQ,用于制定应该删除cookie的准时间。如果设|的日期是当前日期以前的旉Q则cookie被立d除?/span>
安全标志——用于表C?/span>cookie是否只能从安全网站(使用SSL?/span>https协议的网站)中访问。可以将q个D?/span>true以加Z护,q而确?/span>cookie不被其他|站讉K?/span>
2Q?span> 其他安全限制
iQ每个域最多只能只能在一台用L机器上存?/span>20?/span>cookieQ?/span>
iiQ每?/span>cookie的d怸能超q?/span>4096字节Q?/span>
iiiQ一台用L机器上的cookieL不能过30个?/span>
3Q?span> JavaScript中的cookie
下面来看一个设|?/span>cookie的函敎ͼ如下所C:
setCookie()函数只有前两个参数是必须的,函数的调用方法如下:
setCookie(“name”, “阿蜜?/span>”);
setCookie(“book”, “JavaScript高E序设计”, new Date(Date.parse(“Jan 1,
setCookie(“message”, “hello”, new Date(Date.parse(“Jan 1,
下面的函数是一个根?/span>cookie的名U获?/span>cookie的方法,代码如下Q?/span>
调用该方法可以获取指定名U的cookieQ调用D例如下:
var sName = getCookie(“name”);
下面我们再编写一个删?/span>cookie的函敎ͼ只需失效时间设ȝ一个时间即可,代码如下Q?/span>
function deleteCookie(sName, sPath, sDomain) {
setCookie(sName, “”, new Date(0), sPath, sDomain);
}
4. 服务器端?/span>cookie
1Q?/span>JSP
Jsp提供了非常简单的处理cookie的接口,request对象会在执行JSP时自动初始化Q有一个返回一?/span>Cookie对象数组的方?/span>getCookies()Ҏ。每?/span>Cookie对象都具?/span>getName()?/span>getPath(), getDomain(),getSecure()Q?/span>getMaxAge(){方法,下面我们q看一个获?/span>Cookie的方法:
public static Cookie getCookie(HttpServletRequest request, String name) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (int i = 0; i<cookies.length; i++) {
if (cookies[i].getName().equals(name)) {
return cookies[i];
}
}
}
}
下面让我们再来看看怎么hZ?/span>cookieQ?/span>
Cookie nameCookie = new Cookie(“name”, “Amigo”);
nameCookie.setDomain(“http://www.wrox.com”);
nameCookie.setPath(“/books”);
response.addCookie(nameCookie);
要删?/span>cookieQ可用如下方法:
Cookie cookieToDelete = getCookie(“name”);
cookieToDelete.setMaxAge(0);
response.addCookie(cookieToDelete);
2Q?/span>ASP.NET
略?/span>
3Q?/span>PHP
略?/span>
二. 隐藏框架
Ҏ是创徏一个可?/span>JavaScript与服务器q行通信?/span>0像素高的框架。这U通信方式要求两部分内容:用于处理客户端通信?/span>JavaScript对象和在服务端处理通信的特D页面?/span>Eg.
<html>
<head>
<title>隐藏框架的例?/span></title>
</head>
<frameset rows=”*,
<frame src=”test1.html” nam=”mainFrame” />
<frame src=”hidden.html” nam=”hiddenFrame” />
</frameset>
</html>
在第一个框架中Q定义了两个函数Q一个用于向服务器发送请求,另一个用于处理响应。发送请求的函数如下Q?/span>
function getServerInfo() {
parent.frames[“hiddenFrame”].location.href = “hiddenFrameCom.html”;
}
处理回应的函?/span>handleResponse()的代码如下:
function handleResponse(sResponseTextt) {
alert(“服务器返回: ” + sResponseTextt);
}
处理隐藏h的页面必输Z个普通的HTML面Q其中有?/span><textarea/>元素Q包含返回的元素。?/span><textarea/>可以方便的处理多行数据,q个面必须在主框架中调?/span>handleResponse()函数。实例代码如下:
<html>
<head>
<title>隐藏框架的例?/span></title>
<script type=”text/javascript”>
window.onload = function() {
parent.frames[0].handleResponse(
document.forms[“formResponse”].result.value);
};
</script>
</head>
<body>
<form name=”formResponse”>
<textarea name=”result”>传送回的数?/span></textarea>
</form>
</body>
</html>
三. HTTPh
现在很多览器都可以直接?/span>JavaScript中初始化HTTPhq获取结果,完全不用隐藏框架和其他取巧的技巧?/span>
q个令h振奋的新功能的核心是Q微软创建的XML HTTPh的对象。这个对象是?/span>MSXML一起出现的Q直到最q它的能力才被完全挖掘?/span>XML HTTPh实质上是d了额外的用于发送和接收XML代码的功能的普通的HTTPh?/span>
要在IE中重新创?/span>XML HTTPh对象Q还是要使用ActiveXObjectQ如下所C:
var oRequest = new ActiveXObject(“Microsoft.XMLHTTP”);
下面让我们看一个创?/span>XML HTTP的方法:
function createXMLHTTP() {
var arrSignatures = [“MSXML2.XMLHTT
“MSXML2.XMLHTT
“Microsoft.XMLHTTP”];
for (var i=0; i< arrSignatures.length; i++) {
try {
var oRequest = new ActiveXObject(arrSignatures[i]);
return oRequest;
} catch (oError) {
//ignore
}
}
throw new Error(“你的机器上没有安?/span>MSXML!”);
}
创徏?/span>HTTPh后,可用open()Ҏ来指定要发送的hQ该Ҏ的参数描q如下:
W一个参敎ͼ值可?#8220;get”?#8220;post”Q或其他受服务器支持?/span>HTTPҎQ?/span>
W二个参敎ͼh?/span>URLQ?/span>
W三个参敎ͼ表示h是否以异步方式发送的布尔倹{?/span>
Eg. oRequest.open(“get”, “example.txt”, false);
打开后,可用send()Ҏ请求发送出去,该方法需带一个参敎ͼ该参数可?/span>nullQ?/span>
eg. oRequest.send(null);
下面让我们来看一个比较完整的例子Q?/span>
var oRequest = createXMLHTTP();
oRequest.open(“get”, “example.txt”, false);
oRequest.send(null);
alert(“状态:” + oRequest.status + “(” + oRequest.statusText + “)”);
alert(“回应的文本信息:” + oRequest.responseText);
该例获取服务器端的一个纯文本文gQ然后显C此内容?/span>
如果发送异步请求,必须使用onreadystatechange事g处理函数Qƈ?/span>readyStateҎ是否等?/span>4Q与XML DOM一P。让我们来看一个例子:
var oRequest = createXMLHTTP();
oRequest.open(“get”, “example.txt”, true);
oRequest.onreadystatechange = function() {
if (oRequest.readyState == 4) {
alert(“状态:” + oRequest.status + “(” + oRequest.statusText + “)”);
alert(“回应的文本信息:” + oRequest.responseText);
}
}
oRequest.send(null);
1. 使用HTTP头部
XML HTTPh对象提供了获?/span>HTTP头部和设|它们的ҎQ?/span>
l getAllResponseHeaders()Q返回包含所有响应的HTTP首部信息的字W串Q?/span>
l getResponseHeader()Q获取指定的某个头部Q参Cؓ获取的首部的名称Q?/span>eg. var sValue = oRequest.getResponseHeader(“Server”);
l setResponseHeader()Q设|?/span>XML HTTPh的首部信息,eg. oRequest. setResponseHeader(“myheader”, “阿蜜?/span>”).
2. 实现的赋值品
MozillaW一个复制了XML HTTP实现Q创Z名ؓXMLHTTPRequest?/span>JavaScriptQ行为完全与微Y的版本相同,Opera(7.6)?/span>SafariQ?/span>1.2Q也复制?/span>Mozilla的实玎ͼ创徏了自qXMLHTTPRequest对象?/span>
3. q行GETh
Web上最常见的请求类型就?/span>GEThQ下面让我们来看一?/span>GETh的例子,代码如下所C:
首先Zd参数的方便性,让我们增加一个添加参数的ҎQ然后ؓh构徏一?/span>URL,代码如下所C:
function addURLParam(url, sParamName, sParamValue) {
url += (url.indexOf(“?”) == -1 ? “?” : “&”);
url += encodeURIComponent(sParamName) + “=” + encodeURIComponent(sParamValue);
return url;
}
var url = “http://m.tkk7.com/amigoxie”;
url = addURLParam(url, “gender”, “?/span>”);
url = addURLParam(url, “age”, “
oRequest.open(“get”, url, false);
4. q行POSTh
POSTh用于在表单中输入数据后的提交q程Q因?/span>POST可以?/span>GET方式发送更多数据(最?/span>2GBQ。让我们来可看一个例子:
function addPostParam(sParams, sParamName, sParamValue) {
if (sParams.length > 0) {
sParams += “&”;
}
return sParams + encodeURIComponent(sParamName) + “=” + encodeURIComponent(sParamValue);
}
Var sParams = “”;
sParams = addPostParam(sParams, “gender”, “?/span>”);
sParams = addPostParam(sParams, “age”, “
oRequest.open(“open”, “test.jsp”, false);
oRequest.send(sParams);
四. LiveConnecth
LiveConnect?/span>Netscape Navigator引入Q一般可以让JavaScript?/span>JavacdC互的能力。用户必d?/span>JRE,q且q需在浏览器中启?/span>Java?/span>
1. q行GETh
使用Live ConnectӞ必须提供cȝ完整名称Q才能初始化一?/span>Java对象。创?/span>URL后,可以打开一个输入流q用读取器来读取数据。最好的Ҏ是创Z?/span>InputStreamReaderQ然后再Z它创Z?/span>BufferReaderQ实例代码如下:
function httpGet(url) {
var ourl = new java.net.URL(url);
var oStream = ourl.openStream();
var oReader = new java.io.BufferedReader(new java.io.InputStreamReader(oStream));
var oResponseText = “”;
var sLine = oReader.readLine();
while (sLine != null) {
oResponseText += sLine + “\n”;
sLine = oReader.readLine();
}
oReader.close();
return oResponseText;
}
注意Q与XML HTTPh对象不通,LiveConnect要求输入完整的请求的URLQ从http://开始,因ؓQ这?/span>Java对象没有M解释相对URL的上下文?/span>
2. q行POSTh
因ؓPOSTh可看作是双向的,所以必M?/span>setDoInput()?/span>setDoOutput()Ҏ连接设成接受输入和输出。另外,q接不应该用Q何缓存数据,所以要调用setUseCaches(false)。与XML HTTPh对象一Pq必ȝsetRequestProperty()Ҏ?#8220;Content-Type”讄为相应的倹{代码如下:
function httpPost(url, sParams) {
var ourl = new java.net.URL(url);
var oConnection = ourl.openConnection();
oConnection.setDoInput(true);
oConnection.setDoOutput(true);
oConnection.setUseCaches(false);
oConnection.setRequestProperty(“Content-Type”,
“application/x-www-form-urlencoded”);
var output = new java.io.DataOutputStream(oConnection.getOutputStream());
output.writeBytes(sParams);
output.flush();
output.close();
var sLine = “”, sResponseText = “”;
var input = new java.io.DataInputStream(oConnection.getInputStream());
sLine = input.readLine();
while (sLine != null) {
sResponseText += sLine + “\n”;
sLine = input.readLine();
}
input.close();
return oResponseText;
}
五. HTTPh
对于两种完全不同?/span>HTTPhҎQ有一pd通用的函C对开发很有帮助?/span>
1. get()Ҏ
该方法用于对指定?/span>URLq行一?/span>GETh。该Ҏ有两个参敎ͼ发送请求的URL和一个回调函数。回调函数在很多~程语言中是用于在请求结束时通知开发者的。整合后的通用?/span>get()Ҏ代码如下Q?/span>
var bXmlHttpSupport = (typeof XMLHttpRequest == “object” || window.ActiveXObject);
Http.get = function (url, fnCallback) {
if (bXmlHttpSupport) {
var oRequest = new XMLHttpRequest();
oRequest.open(“get”, url, true);
oRequest.onreadystatechange = function() {
if (oRequest.readyState == 4) {
fnCallback(oRequest.responseText);
}
}
oRequest.send(null);
} else if (navigator.javaEnabled() && typeof java != “undefined”
&& type java.net != “undefined”) {
setTimeout(function() {
fnCallback(httpGet(url));
}, 10);
} else {
alert(“你的览器不支持HTTPh!”);
}
}
2. post()Ҏ
除了需要三个参敎ͼURL、参数字W串和回调函敎ͼ外,post()ҎcM?/span>get()Ҏ。代码如下:
var bXmlHttpSupport = (typeof XMLHttpRequest == “object” || window.ActiveXObject);
Http.post = function(url, sParams, fnCallback) {
if (bXmlHttpSupport) {
var oRequest = new XMLHttpRequest();
oRequest.open(“post”, url, true);
oRequest.setRequestHeader(“Content-Type”,
“application/x-www-form-urlencoded”);
oRequest.onreadysatechange = function() {
if (oRequest.readyState == 4) {
fnCallback(oRequest.responseText);
}
}
} else if ((navigator.javaEnabled() && typeof java != “undefined”
&& type java.net != “undefined”) {
setTimeout(function() {
fnCallback(httpPost(url, sParams));
}, 10);
} else {
alert(“你的览器不支持HTTPh!”);
}
}
注意Q用这个方法必L供完整的URL.
一Q?span>
错误分类1Q?span>
语法错误也称析错误,发生在传l编E语a的编译时Q在JavaScript中发生在解释Ӟq些错误是由代码中的意外字符直接引v的,然后׃能直接编?/span>/解释Q?/span>egQ在一行代码因~少xP产生了语法错误。发生语法错误时Q就不能l箋执行代码。在JavaScript中,只有在同一个线E中的代码会受语法错误的影响。在其他U程中的代码和其他外部引用的文g中的代码Q如果不依赖于包含错误的代码Q则可以l箋执行?/span>
2Q?span> q行旉?/span>
也称为异常(exceptionQ在~译?/span>/解释器后Q。此Ӟ问题q不出在代码的语法上Q而是Q尝试完成的一个操作,在某些情况下是非法的?/span>eg.
window.openMyFile();
因不存在openMyFile()ҎQ浏览器会返回一个异常。异常只影响发生的线E,其他JavaScriptU程卛_l箋正常的执行?/span>
二. 处理错误
1. onerror事g处理函数
它是W一个用来协?/span>JavaScript处理错误的机制。页面上出现异常Ӟerror事g便在window对象上触发?/span>Eg.
在上qC码中Q在面载入时尝试调用不存在的函敎ͼ此时会引发一个异常。弹?#8220;发生错误”的错误信息。但是,览器的错误信息也显C出来了Q如何在览器上隐藏它呢Q只需onerrorҎq回一?/span>true卛_?/span>
1Q?span> 取出错误信息
onerror处理函数提供了三U信息来定错误切的性质Q?/span>
iQ错误信息——对于给定错误,览器会昄同样的信息;
iiQURL——在哪个文g中发生了错误Q?/span>
行号——给?/span>URL中发生错误的行号?/span>
讉KҎ见如下例子:
2Q?span> 囑փ载入错误
window对象q唯一支持onerror事g处理函数的对象,它对囑փ对象也提供支持。当一个图像由于文件不存在{原因未能成功蝲入时Q?/span>error事g便在q个囑փ上触发。让我们来看一个例子:
<img src=”amigo.jpg” onerror=”alert(‘载入囄时发生错?/span>’)”/>
上例直接?/span>HTML中分?/span>onerror事g处理函数。当然也可以通过脚本来分配事件处理函敎ͼ在设|图像的srcҎ前Q必ȝ待页面完全蝲入,代码如下Q?/span>
注意Q与window对象?/span>onerror事g处理函数不同Q?/span>image?/span>onerror事gM的额外信息的参数?/span>
3Q?span> 处理语法错误
onerrorq能处理语法错误。但有一点必L意,事g处理函数必须是页面中W一个出现的代码Q因为如果语法错误出现在讄事g处理函数之前出现Q事件处理函数就没有用了?/span>
注意Q语法错误会完全停止代码的执行?/span>
说明Q?/span>onerror事g处理函数的主要的问题是,它是BOM的一部分Q所以,没有M标准能控制它的行为。因此,不同的浏览器使用q个事g处理错误的方式有明显的不同,egQ在IE中发?/span>error事gӞ正常的代码会l箋执行Q所有的变量和数据都保留下来Qƈ可通过onerror事g处理函数讉K。在Mozilla中,正常的代码执行都会结束,同时所有的错误发生之前的变量和数据都被销毁?/span>
2. try…catch语句
ECMPScriptW三版,引入?/span>try…catch语句?/span>Eg.
?/span>Java不同Q?/span>ECMAScript标准?/span>try…catch语句中只能有一?/span>catch语句Q因?/span>JavaScript是弱cd的语aQ没办法指明catch子句中异常的特定cd。不错误是什么类型,都由同一?/span>catch语句处理。但Mozilla对其q行了扩展,可加多个catch语句Q不推荐q样使用?/span>
finally用于包含无论是否有异常发生都要执行的代码Q这对关闭打开的链接和释放资源很有用?/span>
1Q?span> 嵌套try…catch语句
用来处理catch子句中的错误问题Q让我们来看一个例子,代码如下Q?/span>
2Q?span> Error对象
发生错误ӞJavaScript有个Error基类用于抛出。它有两个特性:
iQname——表C错误类型的字符?/span>
iiQmessage——实际的错误信息?/span>
Error对象?/span>name对应于它的类Q可以是如下g一Q?/span>
EvalErrorQ错误发生在eval()函数中;
RangeErrorQ数字D?/span>JavaScript可表C的范围Q?/span>
ReferenceErrorQ用了非法的引用;
SyntaxErrorQ在eval()函数调用中发生了语法错误Q其他的愈发错误由浏览器报告Q无法通过try…catch处理Q?/span>
TypeErrorQ变量的cd不是预期所需的;
URIErrorQ在encodeURI?/span>decodeURI函数发生了错误?/span>
3Q?span> 判断错误cd
可采取如下两U方法来判断错误cdQ第一U根据异常的name属性判断,如下Q?/span>
W二中采?/span>instanceof操作W,代码如下Q?/span>
4Q?span> 抛出异常?/span>throw语句
?/span>ECMAScriptW三版引入,用于有目的的抛出异常Q抛出的错误对象可ؓ字符丌Ӏ数字、布值或实际的对象,也可以抛?/span>Error对象Q其构造函数只有一个函敎ͼ即错误信息)?/span>eg1. throw new Error(“错误产生Q?/span>”);
eg2.
function addTwoNumber(a, b) {
if (arguments.length < 2) {
throw new Error("需要传入两个数?/span>!");
}
}