1. 程式人生 > >《JavaScript語言精粹》—— 讀書總結

《JavaScript語言精粹》—— 讀書總結

點選有驚喜

之前一直都是用封裝好的Ajax,所以一直很好奇它是如何使用和實現的。這裡正好就進行一下學習,下面是Ajax的一個時間圖。

設定觸發條件

  這裡模擬一個使用場景,就是在使用者登陸時,非同步的對使用者名稱以及密碼進行驗證。所以使用onBlur()觸發,onBlur函式在輸入框焦點遺失時,就會觸發。

複製程式碼
 1     <form name="loginForm">
 2         <table>
 3             <tr>
 4                 <td>使用者名稱:<input 
type="text" name="username" onBlur="checkUsername()"></td> 5 </tr> 6 <tr> 7 <td><div id="usernameDiv"></div></td> 8 </tr> 9 <tr> 10 <td>密 碼:<input type="password"
name="password" onBlur="checkPassword()"></td> 11 </tr> 12 <tr> 13 <td><div id="passwordDiv"></div></td> 14 </tr> 15 </table> 16 </form>
複製程式碼

建立Ajax的物件

  由於Ajax並不是一個統一的標準,因此各個瀏覽器有自己的建立方式,因此在建立時,需要進行瀏覽器的驗證,使用如下的驗證方法即可。

1 if(window.XMLHttpRequest){
2             req = new XMLHttpRequest();
3         }else if(window.ActiveXObject){
4             req = new ActiveXObject("Microsoft.XMLHTTP");
5         }

open() onreadystatechante() send()

3.1 open(),這個函式有三個引數,第一個是http的傳送方式,常見的有GET和POST,我們這裡使用GET,來傳送引數;第二個引數是一個url,這個url第一個作用是與後臺的servlet進行匹配,第二個作用是傳送前臺的資料到後臺;第三個引數是個bool值,如果為true標識用非同步的方式傳送請求。

req.open("GET",url+"?username="+document.loginForm.username.value,true);

3.2 onreadystatechange 指定回撥函式,當資料返回時,使用該函式進行處理。我們的處理函式是自己定義的usernameCallback

req.onreadystatechange = usernameCallback;

3.3 send函式用來發送建立好的請求。由於前面的引數已經新增到url後面,因此這裡直接使用null作為引數就行了。

req.send(null);

  自己定義的usernameCallback函式,用於把返回的字串使用DOM方式寫入指定的div中。

  在函式返回時,可以使用之前建立好的req物件,呼叫它的readystate 以及 status屬性,4表示XMLHttpRequest物件響應正常結束。200表示HTTP請求獲得正確的響應。

  只有這兩個條件都滿足,才表明非同步請求請求成功。

複製程式碼
function usernameCallback(){
        if(req.readyState == 4){
            if(req.status == 200){
                var str = req.responseText;
                if(str.split("!")[0] == "Success"){
                    document.getElementById("usernameDiv").className = "black";
                }else{
                    document.getElementById("usernameDiv").className = "red";
                }
                document.getElementById("usernameDiv").innerHTML = str;
            }else{
                alert("username failed!");
            }
        }else{
            
        }
    }
複製程式碼

通過url與後臺的servlet關聯

複製程式碼
<?xml version="1.0" encoding="GBK"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <servlet>
      <servlet-name>checkUsername</servlet-name>
    <servlet-class>usernameServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>checkUsername</servlet-name>
      <url-pattern>/checkUsername</url-pattern>
  </servlet-mapping>
  
  <servlet>
      <servlet-name>checkPassword</servlet-name>
    <servlet-class>passwordServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>checkPassword</servlet-name>
    <url-pattern>/checkPassword</url-pattern>
  </servlet-mapping>
</web-app>
複製程式碼

簡單反饋

複製程式碼
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/xml;charset=UTF-8");
        response.setHeader("Cache-Control", "no-cache");
        
        String username = request.getParameter("username");
//        System.out.println("username"+username);
        String str = "";
        
        if("xingoo".equals(username)){
            str += "Success!" + username;
        }else{
            str += "failed!" + username;
        }
        
        response.getWriter().write(str);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doGet(request,response);
    
    }
複製程式碼

另一個驗證的servlet採用同樣的方式,這裡就不再贅述了。下面會貼出所有的程式碼。

原始碼暴露

Login.html

複製程式碼
 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <meta charset="UTF-8">
 5 <title>Insert title here</title>
 6 <style type="text/css">
 7      .red {
 8          color:red;
 9          font-size: 20;
10      }
11      .black {
12          color: black;
13          font-size: 20;
14      }
15 </style>
16 <script language="javascript">
17     function checkUsername(){
18         var url = "checkUsername";
19         if(window.XMLHttpRequest){
20             req = new XMLHttpRequest();
21         }else if(window.ActiveXObject){
22             req = new ActiveXObject("Microsoft.XMLHTTP");
23         }
24         if(req){
25             req.open("GET",url+"?username="+document.loginForm.username.value,true);
26             req.onreadystatechange = usernameCallback;
27             req.send(null);
28         }
29     }
30     function checkPassword(){
31         var url = "checkPassword";
32         if(window.XMLHttpRequest){
33             req = new XMLHttpRequest();
34         }else if(window.ActiveXObject){
35             req = new ActiveXObject("Microsoft.XMLHTTP");
36         }
37         if(req){
38             req.open("GET",url+"?password="+document.loginForm.password.value,true);
39             req.onreadystatechange = passwordCallback;
40             req.send(null);
41         }
42     }
43     function usernameCallback(){
44         if(req.readyState == 4){
45             if(req.status == 200){
46                 var str = req.responseText;
47                 if(str.split("!")[0] == "Success"){
48                     document.getElementById("usernameDiv").className = "black";
49                 }else{
50                     document.getElementById("usernameDiv").className = "red";
51                 }
52                 document.getElementById("usernameDiv").innerHTML = str;
53             }else{
54                 alert("username failed!");
55             }
56         }else{
57             
58         }
59     }
60     function passwordCallback(){
61         if(req.readyState == 4){
62             if(req.status == 200){
63                 var str = req.responseText;
64                 if(str.split("!")[0] == "Success"){
65                     document.getElementById("passwordDiv").className = "black";
66                 }else{
67                     document.getElementById("passwordDiv").className = "red";
68                 }
69                 document.getElementById("passwordDiv").innerHTML = str;
70             }else{
71                 alert("password failed!");
72             }
73         }else{
74             
75         }
76     }
77 </script>
78 </head>
79 <body>
80     <form name="loginForm">
81         <table>
82             <tr>
83                 <td>使用者名稱:<input type="text" name="username" onBlur="checkUsername()"></td>
84             </tr>
85             <tr>
86                 <td><div id="usernameDiv"></div></td>
87             </tr>
88             <tr>
89                 <td>密 碼:<input type="password" name="password" onBlur="checkPassword()"></td>
90             </tr>
91             <tr>
92                 <td><div id="passwordDiv"></div></td>
93             </tr>
94         </table>
95     </form>
96 </body>
97 </
            
           

相關推薦

JavaScript語言精粹》—— 讀書總結

點選有驚喜 之前一直都是用封裝好的Ajax,所以一直很好奇它是如何使用和實現的。這裡正好就進行一下學習,下面是Ajax的一個時間圖。 設定觸發條件   這裡模擬一個使用場景,就是在使用者登陸時,非同步的對使用者名稱以及密碼進行驗證。所以使用onBlur(

JavaScript語言精粹讀書筆記——給類型增加方法一節的疑問

讀書 ceiling lac 方法 formal ger 公式 num turn 最近,在學習《JavaScript語言精粹》這本書,發現譯者雖然有很好地翻譯文章,卻沒有對文中有疑問的地方進行改正或加以註釋。我接觸JavaScript只有一年左右,可能無法很好的理解這門語

JavaScript語言精粹讀書筆記

表達 star turn ray 檢索 obj 就是 第四章 遞歸 第三章 對象 檢索 var obj = {a: 1, b:2, c:3} obj[a] // obj.a // 檢索結果是undefined 時用 || 或 && 避免錯誤 obj[

JavaScript語言精粹_第四章

前綴 原型對象 高度 單例 write on() 整體 方法調用 通過 4.1 函數對象   在JavaScript中,函數就是對象。對象是“名/值”對的集合並擁有一個連到原型對象的隱藏鏈接。對象字面量產生的對象連接到Object.prototype。函數對象連接到Func

JavaScript語言精粹_第五章

.proto 5.5 閱讀 特征 數據 事件處理 parent struct json 5.1 偽類   它不讓對象直接從其他對象繼承,反而插入了一個多余的間接層,從而使構造器函數產生對象。   JavaScript中,當一個函數對象被創建時,Function構造器產生的函

JavaScript語言精粹_第九章

錯誤 難度 應該 生命周期 周期 挑戰 我們 另一個 特性   在軟件的產品生命周期中,通常他們都會被修改,把一個正確的程序轉化為另一個同樣正確但風格不同的程序,是一個極具挑戰性的過程。   JavaScript包含大量脆弱的或有問題的特性,它們會妨礙我們寫出優秀的程序。顯

JavaScript語言精粹_雞肋

對象 位運算符 操作 工具 運行 語句 一個 流程 結果 ==   JavaScript有兩組相等運算符:===,==,!==,!=,前面一組比較類型和數值,後面一組只比較數值。 with語句   JavaScript提供了一個with語句,本意是想用來快捷地訪問對象的屬性

JavaScript語言精粹pdf

介紹 第5章 如何 好的 lin 級聯 維度 作者 閉包 內容簡介 · · · · · · 本書通過對JavaScript語言的分析,甄別出好的和壞的特性,從而提取出相對這門語言的整體而言具有更好的可靠性、可讀性和可維護性的JavaScript的子集,以

JavaScript語言精粹-毒瘤、糟粕(應對)

毒瘤 不使用全域性變數 使用塊級作用域,不var return與返回值要位於同一行,否則當自動插入分號後會返回undefined 當物件的屬性名與js保留字相同時,無法使用點語法,使用括號表示法 js字元是16位的,Unicode將一對字元視為一個單一的字元,而js

Js的四種呼叫方式和this繫結物件——《JavaScript語言精粹

JavaScript一共有四種呼叫模式:方法呼叫模式、函式呼叫模式、構造器呼叫模式和apply呼叫模式。 方法呼叫模式: 當一個函式被儲存為物件的一個屬性時,我們稱之為一個方法。當一個方法被呼叫時,this被繫結到該物件。 var myObject = { value: 0,

JavaScript語言精粹》筆記(內附《JavaScript語言精粹》百度雲下載連結)

章節:3.4 引用 【P22(頁碼)】 知識點:物件通過引用來傳遞,它們永遠不會被傳遞 var a_obj={a:1}; var b_obj=a_obj;//b_obj是a_obj的引用 b_obj.a=2; console.log(a_obj.

JavaScript語言精粹》第二章-語法 簡單筆記

註釋 JavaScript提供兩種註釋: /* */包圍的塊註釋及//開頭的行註釋。 註釋應該被優先用來提高程式的可讀性,註釋要精確地描述程式碼,沒有用的註釋比沒有註釋更糟糕。 /* */塊註釋對於被註釋的程式碼塊是不安全的, (當包裹正則表示式時會導致語法錯誤)。 建議避免使用。 識別符號 J

JavaScript語言精粹》學習筆記——4.函式

前言 函式用於指定物件的行為,是JavaScript的基礎單元。所謂程式設計,就是將一組需求分解為一組函式和資料結構的功能。 1、函式物件 JavaScript中的函式就是物件。每個函式在建立時會附加兩個隱藏的屬性:函式的上下文和實現函式呼叫的程式碼。 函式可以像其他的值一

JavaScript語言精粹》--第5章:繼承

/* 當一個函式物件被建立時,Function構造器產生的函式物件將會執行類似下面的程式碼: */ this.prototype = { constructor: this }; //------------------------------------------

JavaScript語言精粹》--第4章:函式

/* 函式物件 JS中的函式就是物件,函式物件連線到Function.prototype,而Function.prototype物件本身連線到Object.prototype 每個函式在建立時會附加兩個隱藏屬性: 函式物件數的上下文 實現函式行為的程式碼

JavaScript語言精粹》--第6章:陣列

/* JS沒有像其他語言陣列一樣的資料結構,它提供了一種擁有一些類陣列特性的物件 陣列字面量: JS允許陣列包含任意混合型別的值 */ var someArray = [ 1, "alpha", true, { name: "obj" }, func

JavaScript語言精粹之物件篇

1.物件字面量 用來建立新物件值,位置不限,包含多個“名值”對 var empty_object = {}; var stooge = { "first-name" : "zhang", "last-name" : "fei" } 屬性名稱

js語言精粹讀書筆記

全書貫穿一個method方法定義新方法: Function.prototype.method = function(name, func) { if (!this.prototype[name]) { this.prototyp

JavaScript語言精粹》學習筆記——附錄B.糟粕

作者的意思是儘量棄之不用的部分。 1、== == 和 != 運算子只有在兩個運算時型別一致時,才能做出正確判斷,如果兩個運算數是不同型別,會強制轉換值的型別,有時會得到正確的結果,有時不會,因此永遠不要使用這個運算子,始終使用 === 和 !== 運算子,可以減少錯誤。 2

javascript語言精粹陣列篇之Array的方法注意事項

本文並沒有詳細列出Array方法詳解,本文側重點在於使用Array程式設計時候要注意的問題。1.Array.concat var o = {name:"Gavin"}; var a1 = [1,2,3]; var a2 = [6,o]; var arr1 = a1.concat(a2); a1[0] = 0