******** 向伺服器送出 request ********

送出 request 的 function 內處理事件觸發後要操作的事項,
例如取出表單(form)的資料,或者什麼資料也不用取,
處理完之後,就要向 Web Server 發出請求。
接下來可以進行以下二個動作,先後順序不拘:

  1. request.open(String method,String target,boolean isAsynchronous);

    第一引數(String): 決定這個請求的 method 為何。
    一般實作品中較可靠的 method 為 GETPOSTHEAD
    但其他瀏覽器也可能實作支援上述以外的 method,如 PUT 等。
    第二引數(String): 決定要送給哪一支程式處理。按照一般的慣例,
    如果以斜線(/)開頭,則表示相對於 domain name 的位置,
    例如網站名稱為 www.mydomain.com,則「/php/getform.php」
    完整路徑會是 http://www.mydomain.com/php/getform.php
    不過這視 Web Server 的設定而定;
    (也有可能是相對於使用者家目錄)
    如果不是以斜線開頭,則是相對於本檔案的路徑
    例如「../includes/getform.php」
    表示交給本檔案上一層目錄下的 includes 目錄下的 getform.php 處理。
    路徑的處理依照 Web Server 的設定而不同。
    第三引數(boolean): 決定此 request 處理方式是要非同步或同步。
    非同步則設定為 true同步則設定為 false
  2. request.onreadystatechange=

    如同 Javascript 的事件觸發器(prefix-on),此屬性也是指定事件發生時要怎麼處理。
    這裡是設定 readyState 狀態改變時要怎麼處理。
    request 從執行 open 指定目標處理檔之後到送出資料、等待 Web Server 處理,
    直到接收 Web Server 的 response 等等,其 readyState 都會變化,
    這裡的重點在於交代 request 當收到 Web Server 的 response 時要怎麼處理。

    此處可以直接加上一個 function,
    例如 request.onreadystatechange=function(){ … },
    或者指定給某一個 function name,而 function name 不能帶有任何的參數
    例如 request.onreadystatechange=updatePage;

    如果想傳遞參數給 onreadystatechange 所要執行的 function,
    可以透過指定 onreadystatechange=function(){…} 的方式,
    在 function 本體中呼叫另一個 function,內部的 function 就可以給定參數了,
    例如 request.onreadystatechange=function(){ updatePage(request); }

上述兩項都指定完成之後,如果 open() 使用 POST method,必須再指定送出的資料類型,
Web Server 才了解如何處理收到的資料:

request.setRequestHeader(String name,String value);

第一引數(String): 標頭的名稱。通常只要指定 Content-Type 標頭就可以了。
第二引數(String): 標頭的值。例如指定 Content-Type 的值為名值對
application/x-www-form-urlencoded

當上述一切都設定完成之後,就可以送出 request 給 Web Server 了

request.send(Object data);

如果是以 GET 方式傳出 request,則是將資料附加在 url 後方(成 query string),
所以這邊可以用 request.send(null); 送出;
有的瀏覽器不接受無引數的 send(),因此如果不傳資料,最好加上 null
如果以 POST 方式傳出 request,則將資料傳入 send 當引數。