JS高级内容

来源:互联网 发布:淘宝韩版春秋女装 编辑:程序博客网 时间:2024/06/06 04:35
  1. 1、  浏览器类型  
  2. 下面的脚本会根据访问者的浏览器类型显示不同的警告。  
  3. <html>  
  4.   
  5. <head>  
  6.   
  7. <script type="text/javascript">  
  8. function detectBrowser()  
  9. {  
  10. var browser=navigator.appName  
  11. var b_version=navigator.appVersion  
  12. var version=parseFloat(b_version)  
  13.   
  14. if ((browser=="Netscape"||browser=="Microsoft Internet Explorer")  
  15. && (version>=4))  
  16.   {alert("Your browser is good enough!")}  
  17. else  
  18.   {alert("It's time to upgrade your browser!")}  
  19.   }  
  20. </script>  
  21.   
  22. </head>  
  23.   
  24. <body onload="detectBrowser()">  
  25. </body>  
  26.   
  27. </html>  
  28.   
  29.   
  30.   
  31. 2、  cookies  
  32. cookie 用来识别用户。  
  33. 实例  
  34. 创建一个欢迎 cookie  
  35. 利用用户在提示框中输入的数据创建一个 JavaScript Cookie,当该用户再次访问该页面时,根据 cookie 中的信息发出欢迎信息。  
  36. <html>  
  37. <head>  
  38. <script type="text/javascript">  
  39. function getCookie(c_name)  
  40. {  
  41. if (document.cookie.length>0)  
  42. {   
  43. c_start=document.cookie.indexOf(c_name + "=")  
  44. if (c_start!=-1)  
  45. {   
  46. c_start=c_start + c_name.length+1   
  47. c_end=document.cookie.indexOf(";",c_start)  
  48. if (c_end==-1) c_end=document.cookie.length  
  49. return unescape(document.cookie.substring(c_start,c_end))  
  50. }   
  51. }  
  52. return ""  
  53. }  
  54.   
  55. function setCookie(c_name,value,expiredays)  
  56. {  
  57. var exdate=new Date()  
  58. exdate.setDate(exdate.getDate()+expiredays)  
  59. document.cookie=c_name+ "=" +escape(value)+  
  60. ((expiredays==null) ? "" : "; expires="+exdate.toGMTString())  
  61. }  
  62.   
  63. function checkCookie()  
  64. {  
  65. username=getCookie('username')  
  66. if (username!=null && username!="")  
  67.   {alert('Welcome again '+username+'!')}  
  68. else   
  69.   {  
  70.   username=prompt('Please enter your name:',"")  
  71.   if (username!=null && username!="")  
  72.     {  
  73.     setCookie('username',username,365)  
  74.     }  
  75.   }  
  76. }  
  77. </script>  
  78. </head>  
  79. <body onLoad="checkCookie()">  
  80. </body>  
  81. </html>  
  82.   
  83.   
  84.   
  85. 什么是cookie?  
  86. cookie 是存储于访问者的计算机中的变量。每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。你可以使用 JavaScript 来创建和取回 cookie 的值。  
  87. 有关cookie的例子:  
  88. 名字 cookie  
  89. 当访问者首次访问页面时,他或她也许会填写他/她们的名字。名字会存储于 cookie 中。当访问者再次访问网站时,他们会收到类似 "Welcome John Doe!" 的欢迎词。而名字则是从 cookie 中取回的。  
  90. 密码 cookie  
  91. 当访问者首次访问页面时,他或她也许会填写他/她们的密码。密码也可被存储于 cookie 中。当他们再次访问网站时,密码就会从 cookie 中取回。  
  92. 日期 cookie  
  93. 当访问者首次访问你的网站时,当前的日期可存储于 cookie 中。当他们再次访问网站时,他们会收到类似这样的一条消息:"Your last visit was on Tuesday August 11, 2005!"。日期也是从 cookie 中取回的。  
  94. 创建和存储 cookie  
  95. 在这个例子中我们要创建一个存储访问者名字的 cookie。当访问者首次访问网站时,他们会被要求填写姓名。名字会存储于 cookie 中。当访问者再次访问网站时,他们就会收到欢迎词。  
  96. 首先,我们会创建一个可在 cookie 变量中存储访问者姓名的函数:  
  97. function setCookie(c_name,value,expiredays)  
  98. {  
  99. var exdate=new Date()  
  100. exdate.setDate(exdate.getDate()+expiredays)  
  101. document.cookie=c_name+ "=" +escape(value)+  
  102. ((expiredays==null) ? "" : ";expires="+exdate.toGMTString())  
  103. }  
  104. 上面这个函数中的参数存有 cookie 的名称、值以及过期天数。  
  105. 在上面的函数中,我们首先将天数转换为有效的日期,然后,我们将 cookie 名称、值及其过期日期存入 document.cookie 对象。  
  106. 之后,我们要创建另一个函数来检查是否已设置 cookie:  
  107. function getCookie(c_name)  
  108. {  
  109. if (document.cookie.length>0)  
  110.   {  
  111.   c_start=document.cookie.indexOf(c_name + "=")  
  112.   if (c_start!=-1)  
  113.     {   
  114.     c_start=c_start + c_name.length+1   
  115.     c_end=document.cookie.indexOf(";",c_start)  
  116.     if (c_end==-1) c_end=document.cookie.length  
  117.     return unescape(document.cookie.substring(c_start,c_end))  
  118.     }   
  119.   }  
  120. return ""  
  121. }  
  122. 上面的函数首先会检查 document.cookie 对象中是否存有 cookie。假如 document.cookie 对象存有某些 cookie,那么会继续检查我们指定的 cookie 是否已储存。如果找到了我们要的 cookie,就返回值,否则返回空字符串。  
  123. 最后,我们要创建一个函数,这个函数的作用是:如果 cookie 已设置,则显示欢迎词,否则显示提示框来要求用户输入名字。  
  124. function checkCookie()  
  125. {  
  126. username=getCookie('username')  
  127. if (username!=null && username!="")  
  128.   {alert('Welcome again '+username+'!')}  
  129. else   
  130.   {  
  131.   username=prompt('Please enter your name:',"")  
  132.   if (username!=null && username!="")  
  133.     {  
  134.     setCookie('username',username,365)  
  135.     }  
  136.   }  
  137. }  
  138. 3、JavaScript 表单验证  
  139. JavaScript 可用来在数据被送往服务器前对 HTML 表单中的这些输入数据进行验证。  
  140. JavaScript 表单验证  
  141. JavaScript 可用来在数据被送往服务器前对 HTML 表单中的这些输入数据进行验证。  
  142. 被 JavaScript 验证的这些典型的表单数据有:  
  143. •   用户是否已填写表单中的必填项目?  
  144. •   用户输入的邮件地址是否合法?  
  145. •   用户是否已输入合法的日期?  
  146. •   用户是否在数据域 (numeric field) 中输入了文本?  
  147. 必填(或必选)项目  
  148. 下面的函数用来检查用户是否已填写表单中的必填(或必选)项目。假如必填或必选项为空,那么警告框会弹出,并且函数的返回值为 false,否则函数的返回值则为 true(意味着数据没有问题):  
  149. function validate_required(field,alerttxt)  
  150. {  
  151. with (field)  
  152. {  
  153. if (value==null||value=="")  
  154.   {alert(alerttxt);return false}  
  155. else {return true}  
  156. }  
  157. }  
  158. 下面是连同 HTML 表单的代码:  
  159. <html>  
  160. <head>  
  161. <script type="text/javascript">  
  162.   
  163. function validate_required(field,alerttxt)  
  164. {  
  165. with (field)  
  166.   {  
  167.   if (value==null||value=="")  
  168.     {alert(alerttxt);return false}  
  169.   else {return true}  
  170.   }  
  171. }  
  172.   
  173. function validate_form(thisform)  
  174. {  
  175. with (thisform)  
  176.   {  
  177.   if (validate_required(email,"Email must be filled out!")==false)  
  178.     {email.focus();return false}  
  179.   }  
  180. }  
  181. </script>  
  182. </head>  
  183.   
  184. <body>  
  185. <form action="submitpage.htm" onsubmit="return validate_form(this)" method="post">  
  186. Email: <input type="text" name="email" size="30">  
  187. <input type="submit" value="Submit">   
  188. </form>  
  189. </body>  
  190.   
  191. </html>  
  192. E-mail 验证  
  193. 下面的函数检查输入的数据是否符合电子邮件地址的基本语法。  
  194. 意思就是说,输入的数据必须包含 @ 符号和点号(.)。同时,@ 不可以是邮件地址的首字符,并且 @ 之后需有至少一个点号:  
  195. function validate_email(field,alerttxt)  
  196. {  
  197. with (field)  
  198. {  
  199. apos=value.indexOf("@")  
  200. dotpos=value.lastIndexOf(".")  
  201. if (apos<1||dotpos-apos<2)   
  202.   {alert(alerttxt);return false}  
  203. else {return true}  
  204. }  
  205. }  
  206. 下面是连同 HTML 表单的完整代码:  
  207. <html>  
  208. <head>  
  209. <script type="text/javascript">  
  210. function validate_email(field,alerttxt)  
  211. {  
  212. with (field)  
  213. {  
  214. apos=value.indexOf("@")  
  215. dotpos=value.lastIndexOf(".")  
  216. if (apos<1||dotpos-apos<2)   
  217.   {alert(alerttxt);return false}  
  218. else {return true}  
  219. }  
  220. }  
  221.   
  222. function validate_form(thisform)  
  223. {  
  224. with (thisform)  
  225. {  
  226. if (validate_email(email,"Not a valid e-mail address!")==false)  
  227.   {email.focus();return false}  
  228. }  
  229. }  
  230. </script>  
  231. </head>  
  232.   
  233. <body>  
  234. <form action="submitpage.htm"onsubmit="return validate_form(this);" method="post">  
  235. Email: <input type="text" name="email" size="30">  
  236. <input type="submit" value="Submit">   
  237. </form>  
  238. </body>  
  239.   
  240. </html>  
  241. JavaScript 动画  
  242. 我们可以使用 JavaScript 来创建动态的图像。实例  
  243. 按钮动画  
  244. 利用两个不同的事件来驱动两个相应的函数,来切换两张对应的图片以创造出动画效果。  
  245. <html>  
  246. <head>  
  247. <script type="text/javascript">  
  248. function mouseOver()  
  249. {  
  250. document.b1.src ="/i/eg_mouse.jpg"  
  251. }  
  252. function mouseOut()  
  253. {  
  254. document.b1.src ="/i/eg_mouse2.jpg"  
  255. }  
  256. </script>  
  257. </head>  
  258.   
  259. <body>  
  260. <a href="/index.html" target="_blank">  
  261. <img border="0" alt="Visit W3School!" src="/i/eg_mouse2.jpg" name="b1"  onmouseover="mouseOver()" onmouseout="mouseOut()" /></a>  
  262. </body>  
  263. </html>  
  264.   
  265. HTML 代码  
  266. 这是 HTML 代码:  
  267. <a href="http://www.w3school.com.cn" target="_blank">  
  268. <img border="0" alt="Visit W3School!"  
  269. src="/i/eg_mouse2.jpg" name="b1"  
  270. onmouseOver="mouseOver()"  
  271. onmouseOut="mouseOut()" />  
  272. </a>  
  273. 注意:我们已为图像添加了 name 属性,这样 JavaScript 就能找到它了。  
  274. onMouseOver 事件的作用是告知浏览器:一旦鼠标悬浮于图像之上,浏览器就会执行某个函数,这个函数会把这副图像替换为另一幅。  
  275. onMouseOut 事件的作用是告知浏览器:一旦鼠标离开图像,浏览器就要执行另一个函数,这个函数会重新插入原来的那幅图像。  
  276. <html>  
  277. <head>  
  278. <script type="text/javascript">  
  279. function writeText(txt)  
  280. {  
  281. document.getElementById("desc").innerHTML=txt  
  282. }  
  283. </script>  
  284. </head>  
  285.   
  286. <body>  
  287. <img src="/i/eg_planets.jpg" border="0" usemap="#planetmap" alt="Planets" />  
  288.   
  289. <map name="planetmap" id="planetmap">  
  290.   
  291. <area shape="circle" coords="180,139,14"  
  292. onMouseOver="writeText('直到 20 世纪 60 年代,金星一直被认为是地球的孪生姐妹,因为金星是离我们最近的行星,同时还由于两者拥有很多共同的特征。')"  
  293. href ="/example/html/venus.html" target ="_blank" alt="Venus" />  
  294.   
  295. <area shape="circle" coords="129,161,10"  
  296. onMouseOver="writeText('从地球上是很难研究水星的,这是由于它和太阳的距离总是很近。')"  
  297. href ="/example/html/mercur.html" target ="_blank" alt="Mercury" />  
  298.   
  299. <area shape="rect" coords="0,0,110,260"  
  300. onMouseOver="writeText('太阳和类似木星这样的气态行星是到目前为止太阳系中最大的物体。')"  
  301. href ="/example/html/sun.html" target ="_blank" alt="Sun" />  
  302.   
  303. </map>  
  304.   
  305. <p id="desc"></p>  
  306.   
  307. </body>  
  308. </html>  
  309. JavaScript 计时  
  310. 通过使用 JavaScript,我们有能力做到在一个设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行。我们称之为计时事件。JavaScript 计时事件  
  311. 通过使用 JavaScript,我们有能力作到在一个设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行。我们称之为计时事件。  
  312. 在 JavaScritp 中使用计时事件是很容易的,两个关键方法是:  
  313. setTimeout()  
  314. 未来的某时执行代码  
  315. clearTimeout()  
  316. 取消setTimeout()  
  317. setTimeout()  
  318. 语法  
  319. var t=setTimeout("javascript语句",毫秒)  
  320. setTimeout() 方法会返回某个值。在上面的语句中,值被储存在名为 t 的变量中。假如你希望取消这个 setTimeout(),你可以使用这个变量名来指定它。  
  321. setTimeout() 的第一个参数是含有 JavaScript 语句的字符串。这个语句可能诸如 "alert('5 seconds!')",或者对函数的调用,诸如 alertMsg()"。  
  322. 第二个参数指示从当前起多少毫秒后执行第一个参数。  
  323. 提示:1000 毫秒等于一秒。  
  324. 带有停止按钮的无穷循环中的计时事件  
  325. 在本例中,点击计数按钮后根据用户输入的数值开始倒计时,点击停止按钮停止计时  
  326. <html>  
  327. <head>  
  328. <script type="text/javascript">  
  329. var c=0  
  330. var t  
  331. function timedCount()  
  332. {  
  333. document.getElementById('txt').value=c  
  334. c=c+1  
  335. t=setTimeout("timedCount()",1000)  
  336. }  
  337.   
  338. function stopCount()  
  339. {  
  340. clearTimeout(t)  
  341. }  
  342. </script>  
  343. </head>  
  344.   
  345. <body>  
  346.   
  347. <form>  
  348. <input type="button" value="开始计时!" onClick="timedCount()">  
  349. <input type="text" id="txt">  
  350. <input type="button" value="停止计时!" onClick="stopCount()">  
  351. </form>  
  352.   
  353. <p>请点击上面的“开始计时”按钮来启动计时器。输入框会一直进行计时,从 0 开始。点击“停止计时”按钮可以终止计时。</p>  
  354.   
  355. </body>  
  356.   
  357. </html>     
  358. 创建你自己的 JavaScript 对象  
  359. <html>  
  360. <body>  
  361.   
  362. <script type="text/javascript">  
  363.   
  364. function person(firstname,lastname,age,eyecolor)  
  365. {  
  366. this.firstname=firstname  
  367. this.lastname=lastname  
  368. this.age=age  
  369. this.eyecolor=eyecolor  
  370. }  
  371.   
  372. myFather=new person("John","Adams",35,"black")  
  373.   
  374. document.write(myFather.firstname + " 的年龄是 " + myFather.age + " 岁。")  
  375.   
  376. </script>  
  377.   
  378. </body>  
  379. </html> 
、  与Java 不同的还有变量可以存放不同类型的值

2、 变量声明不是必须的,在用到的地方使用就可以

3、  5 种原始类型(primitivetype),即Undefined、Null、Boolean、Number和 String。

4、arguments 对象

  arguments 对象

在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们。

例如,在函数 sayHi() 中,第一个参数是 message。用 arguments[0] 也可以访问这个值,即第一个参数的值(第一个参数位于位置 0,第二个参数位于位置 1,依此类推)。

因此,无需明确命名参数,就可以重写函数:

function sayHi() {
  if (arguments[0] == "bye") {
    return;
  }
 
  alert(arguments[0]);
}

检测参数个数

还可以用 arguments 对象检测函数的参数个数,引用属性arguments.length 即可。

下面的代码将输出每次调用函数使用的参数个数:

function howManyArgs() {
  alert(arguments.length);
}
 
howManyArgs("string", 45);
howManyArgs();
howManyArgs(12);

上面这段代码将依次显示 "2"、"0"和 "1"。

注释:与其他程序设计语言不同,ECMAScript 不会验证传递给函数的参数个数是否等于函数定义的参数个数。开发者定义的函数都可以接受任意个数的参数(根据 Netscape 的文档,最多可接受 25 个),而不会引发任何错误。任何遗漏的参数都会以 undefined 传递给函数,多余的函数将忽略。

模拟函数重载

用 arguments 对象判断传递给函数的参数个数,即可模拟函数重载:

function doAdd() {
  if(arguments.length == 1) {
    alert(arguments[0] + 5);
  } else if(arguments.length == 2) {
    alert(arguments[0] + arguments[1]);
  }
}
 
doAdd(10);       //输出 "15"
doAdd(40, 20);   //输出 "60"

当只有一个参数时,doAdd() 函数给参数加 5。如果有两个参数,则会把两个参数相加,返回它们的和。所以,doAdd(10) 输出的是 "15",而 doAdd(40,20) 输出的是 "60"。

虽然不如重载那么好,不过已足以避开 ECMAScript 的这种限制。

4、闭包,指的是词法表示包括不被计算的变量的函数,也就是说,函数可以使用函数之外定义的变量。

简单的闭包实例

在 ECMAScript 中使用全局变量是一个简单的闭包实例。请思考下面这段代码:

var sMessage = "hello world";
 
function sayHelloWorld() {
  alert(sMessage);
}
 
sayHelloWorld();

5、使用预定义对象只是面向对象语言的能力的一部分,它真正强大之处在于能够创建自己专用的类和对象。

ECMAScript 拥有很多创建对象或类的方法。

工厂方式

原始的方式

因为对象的属性可以在对象创建后动态定义,所有许多开发者都在 JavaScript 最初引入时编写类似下面的代码:

var oCar = new Object;
oCar.color = "blue";
oCar.doors = 4;
oCar.mpg = 25;
oCar.showColor = function() {
  alert(this.color);
};

TIY

在上面的代码中,创建对象 car。然后给它设置几个属性:它的颜色是蓝色,有四个门,每加仑油可以跑 25 英里。最后一个属性实际上是指向函数的指针,意味着该属性是个方法。执行这段代码后,就可以使用对象 car。

不过这里有一个问题,就是可能需要创建多个 car 的实例。

解决方案:工厂方式

要解决该问题,开发者创造了能创建并返回特定类型的对象的工厂函数(factory function)。

例如,函数 createCar() 可用于封装前面列出的创建 car 对象的操作:

function createCar() {
  var oTempCar = new Object;
  oTempCar.color = "blue";
  oTempCar.doors = 4;
  oTempCar.mpg = 25;
  oTempCar.showColor = function() {
    alert(this.color);
  };
  return oTempCar;
}
 
var oCar1 = createCar();
var oCar2 = createCar();

TIY

在这里,第一个例子中的所有代码都包含在 createCar() 函数中。此外,还有一行额外的代码,返回 car 对象(oTempCar)作为函数值。调用此函数,将创建新对象,并赋予它所有必要的属性,复制出一个我们在前面说明过的 car 对象。因此,通过这种方法,我们可以很容易地创建 car 对象的两个版本(oCar1 和 oCar2),它们的属性完全一样。

为函数传递参数

我们还可以修改 createCar() 函数,给它传递各个属性的默认值,而不是简单地赋予属性默认值:

function createCar(sColor,iDoors,iMpg) {
  var oTempCar = new Object;
  oTempCar.color = sColor;
  oTempCar.doors = iDoors;
  oTempCar.mpg = iMpg;
  oTempCar.showColor = function() {
    alert(this.color);
  };
  return oTempCar;
}
 
var oCar1 = createCar("red",4,23);
var oCar2 = createCar("blue",3,25);
 
oCar1.showColor();                 //输出 "red"
oCar2.showColor();                 //输出 "blue"

TIY

给 createCar() 函数加上参数,即可为要创建的 car 对象的 color、doors 和 mpg 属性赋值。这使两个对象具有相同的属性,却有不同的属性值。

在工厂函数外定义对象的方法

虽然 ECMAScript 越来越正式化,但创建对象的方法却被置之不理,且其规范化至今还遭人反对。一部分是语义上的原因(它看起来不像使用带有构造函数 new 运算符那么正规),一部分是功能上的原因。功能原因在于用这种方式必须创建对象的方法。前面的例子中,每次调用函数 createCar(),都要创建新函数 showColor(),意味着每个对象都有自己的 showColor()版本。而事实上,每个对象都共享同一个函数。

有些开发者在工厂函数外定义对象的方法,然后通过属性指向该方法,从而避免这个问题:

function showColor() {
  alert(this.color);
}
 
function createCar(sColor,iDoors,iMpg) {
  var oTempCar = new Object;
  oTempCar.color = sColor;
  oTempCar.doors = iDoors;
  oTempCar.mpg = iMpg;
  oTempCar.showColor = showColor;
  return oTempCar;
}
 
var oCar1 = createCar("red",4,23);
var oCar2 = createCar("blue",3,25);
 
oCar1.showColor();                 //输出 "red"
oCar2.showColor();                 //输出 "blue"

TIY

在上面这段重写的代码中,在函数 createCar() 之前定义了函数 showColor()。在 createCar()内部,赋予对象一个指向已经存在的 showColor() 函数的指针。从功能上讲,这样解决了重复创建函数对象的问题;但是从语义上讲,该函数不太像是对象的方法。


原创粉丝点击