Ajax教學文件
壹、PHP與javascript比較
項目 | PHP | javascript | 備註 | ||||
---|---|---|---|---|---|---|---|
一、基本表示法 | |||||||
包裹 | <SCRIPT language='php'>…</SCRIPT>或 <?…?>或<?php…?> | <SCRIPT language='javascript'>…</SCRIPT>或 <SCRIPT type='text/javascript'>…</SCRIPT> | |||||
二、敘述 | |||||||
概述 | 以敘述為基本操作單位,敘述由「資料」「算符」「;」共同構成。
| ||||||
基本說明 | 「;」代表 敘述結束 | ||||||
換行不等於「;」 | 敘述未加「;」換行等於「;」 | ||||||
多個敘述可以寫在同一行 | |||||||
/*…*/。不可以巢狀。 | 多行註解 | ||||||
//或# | // | 單行註解 | |||||
@ | 錯誤抑制 | ||||||
全形空白解譯為半形空白 | 晚期瀏覽器版本 | ||||||
三、資料型態 | |||||||
純量 | 數值 | 實字 | 某某 (十進位) 0某某(八進位) 0x某某(十六進位) 某某e某某(科學記號) | javascript 型別 | |||
型態 | 分整數(integer)、浮點數(float) | 只有number一種型別 | number | ||||
字串 | 實字 | 引號包住字串 | string | PHP還多了自訂引號 | |||
跳脫字元 | 「"」中除「\'」外「\」是跳脫字元,「'」中除「\'」外「\」是字 | 「"」「'」中「\」都是跳脫字元 | |||||
\n、\r、\t、\\、\"、\'、\一到三位數字(以8進位指定字元)、\x一到二位數字(以16進位指定字元) | |||||||
\$、\s(空白) | \b(倒退)、\f(欄位)、\u一到四位(以16進位unicode指定字元) | ||||||
註標索引 | 代表第幾個字元 | ||||||
布林 | 實字 | 真:true、非0;假:false、0、null | boolean | ||||
複合 | 陣列 | 實字 | array() | [],但字串索引無法用實字表達 | object | ||
索引 | 可用字串索引及註標索引,可多維 | ||||||
元素數 | count(陣列名) | 陣列名.length | |||||
物件 | 實字 | 無實字 | {屬性名:屬性值,屬性名:屬性值,…物件:{物件值}…} | ||||
特殊 | NULL | 實字 | null | ||||
資源 | 有 | 無 | |||||
函式 | 實字 | 非資料,無實字 | function(…){…} | function | |||
自動生成物件 | 不會 | 將實字派入常數或變數,該常數或變數不需要new,自動獲得相關原生類別的諸屬性與諸方法 | |||||
四、常數、變數 | |||||||
常數 | 宣告 | define("常數名",常數值); | 只可用純量 | const 常數名=常數值; | 所有資料型態皆可 | ||
錯誤 | 對常數派值(=…)或重宣告都會發生錯誤 | 重派值(=…),值不變但也不發生錯誤,但重宣告一個既有常數會發生錯誤 | |||||
變數 | 變數名 | 大小寫不同。 | 建議用camelCasing 命名規則 | ||||
可用中文,中文視為字母、數字之組合 | 不可用中文 | ||||||
以「$」開頭,「$」之後可以用字母、_ | 第一個字必須是英文字母 | ||||||
開頭之後可以用數字、字母、_。 | |||||||
範圍 | 用var宣告,物件是變數的一種,函式內宣告或派初值者為區域變數,函式外宣告或派初值者為全域變數 | ||||||
函式內外皆未宣告,卻在函式內派初值者,IE視為區域變數,Firefox視為全域變數 | |||||||
宣告 | 一次宣告多個變數:var 變數=值,變數=值… | ||||||
限制 | 函式不能當變數 | 函式可以當變數 | |||||
刪除變數 | unset(變數們); | delete 變數; | |||||
保留字 | 待查 | if、else、for、while、var | |||||
五、運算 | |||||||
算符 | 指派(=),加(+),減(-),乘(*),除(/),餘數(%),二元算符(+=,-=,*=,/=,%=,&=,^=,|=,<<=,>>=),遞增遞減(++,--),比較(<,>,==,===,<=,>=,!=,<>),邏輯(true,非0,false,0,||,&&,!),位元(&,|,^,~,<<,>>),三元算符(?:),宣告變數(var),造物件(new) | ||||||
屬性及方法(->),字串連接(.),自訂引號(<<<),參考算符(&),抑制錯誤算符(@),執行作業系統命令(`…`) | 屬性及方法(.),字串連接(+),位元無號右移(>>>) | ||||||
六、敘述區塊 | |||||||
概述 | 以{}包住一群敘述,分號加在大括號中每一敘述 | ||||||
控制敘述 | exit; | 程式段落標籤: | |||||
break(跳到迴圈的下一道敘述),continue(跳過迴圈中以後的部分,跳到迴圈頭) | 可跳至段落標籤 | ||||||
迴圈 | while(條件){合條件時做的事} do{…}while(條件) for(設初值;條件;設下一值){…} | ||||||
foreach($陣列 as 用變數1代表元素的鍵=>用變數2代表元素的值){使用前面的變數製作敘述;} while($xxx=each($陣列)){$xxx[0]或$xxx['key']代表每個元素的鍵,$xxx[1]或$xxx['value']代表每個元素的值} | for(變數 in 物件){物件的每個屬性或方法做一次,變數名代表屬性或方法, 物件名[變數名]代表其值,方法的值是「function 方法名(){[native code]}」 | javascript中陣列是物件 | |||||
條件 | if(條件一){做一}else{做其他} switch(變數){case 值一:做一;break;case 值二:做二;break;case 值三:做三;break;…default:做其他;break;} | ||||||
elseif | else if | ||||||
例外 | try{敘述或用throw強制產錯誤碼}catch{依錯誤碼做動作}finall{無論有無錯誤都執行} | ||||||
七、函式 | |||||||
函式表示法 | function 函式名(諸引數){…return 傳回值;…} | ||||||
函式參數 的預設值 | function 函式名(引數=預設值){……} | function 函式名(諸引數){在裡面設預設值}
function 函式名(a){if(typeof a=='undefined'){a=預設值;…}} 或 function 函式名(a){a=a || 預設值;…} | |||||
資料表示法 (敘述集合) | $變數乙=create_function(諸引數字串,諸敘述列字串);
變數乙的型別是字串,echo 變數乙;得「lambda_1」 $變數乙(諸引數)得回其諸敘述列的傳回值。 | var 函式變數乙=function(引數){…};此為敘述所以最後還要加「;」
一、執行並回傳:var 甲=乙(實體參數);先執行乙函式,傳回值代入甲。 二、匿名函式(參照):
| |||||
八、類別與物件 | |||||||
類別 | class 類別名{諸屬性;諸方法;} | function 類別名(引數){this.屬性=運算式;} | |||||
物件 | 屬性不加(),方法加() | ||||||
new 類別名; | new 類別名(); with(物件名){敘述省略物件名} | ||||||
原生類別 | String、Number、Boolean、Array、Math、Date、Function | 由語言提供屬性方法 | |||||
自訂類別 | 由使用者定義類別,由類別生方法 | 由程式提供屬性方法 | |||||
寄主物件 | window(瀏覽器)、document(文件)方法 | 由環境提供屬性方法 | |||||
DOM物件:所有角括號所括的標籤都是
document是html的父節點 document.getElementById(id) 取回單一標籤 document.getElementsByTagName(某種標籤) 取回同類標籤所成陣列,每一元素為一標籤 document.getElementsByName(name屬性值) 取回name屬性相同的標籤成陣列,每一元素為一標籤 標籤物件.getAttribute(屬性名) 取屬性值 標籤物件.setAttribute(屬性名,屬性值) 設屬性值 標籤物件.parentNode 取回父節點標籤所包的區域 標籤物件.childNodes 取回諸子節點的集合陣列 標籤物件.attributes 取回諸屬性節點的集合陣列 firstChild即childNodes[0],lastChild即childNodes最後一個元素 節點物件.nodeValue 節點值 例:alert(document.getElementsByTagName('h1')[0].firstChild.nodeValue); document.createElement(某種標籤) 造標籤 document.createTextNode("文字串") 將文字串製備為文字節點 標籤元素.appendChild("製備好的文字節點") 在標籤中塞入文字 標籤元素.removeChild("節點變數") 刪除節點 | |||||||
九、事件 | |||||||
概述 | 事件處理器本質是變數(屬性),而其值放入函式,值的資料型別必須為「function」 事件處理器均以on開頭 | ||||||
表示法 | 標籤中:<標籤 事件處理器='指令'> 程式中:物件名.事件處理器=處理函式 | ||||||
使用者觸發 | 事件 | 事件處理器 | |||||
onmouseover | onmouseover | ||||||
submit | onsubmit | ||||||
瀏覽器觸發 | 載入完畢 | onload | |||||
伺服器觸發 | 請求進度改變 | onreadystatechange |
貳、window子類別 XMLHttpRequest()
一、始用版本
瀏覽器 | 類別 |
---|---|
IE 5,6 | ActiveX |
IE 7 | XMLHttpRequest |
Mozilla 1.0 | |
NN6 | |
Apple Safari 1.2 | |
Opera 8 | |
Opera Mini |
二、方法與屬性
方法/屬性 | 說明 |
---|---|
abort() | 中止請求 |
getAllResponseHeaders() | 傳回全部回應表頭 |
getResponseHeaders('某表頭名稱') | 傳回指定回應表頭名稱之值 |
open(請求類別,url[,是否非同步,帳號,密碼]) | 初始化請求 |
send(後送資料) | 執行請求 |
setRequestHeader(名稱,值) | 設定請求檔頭名稱及值 |
onreadystatechange | 請求進度改變事件處理器 |
readyState | 請求進度 |
responseText | 伺服器回應文字 |
responseXML | 伺服器回應XML格式文字 |
status | 回應狀態代碼,如200 |
statusText | 回應狀態訊息,如OK |
三、後送資料
四、回傳資料
(一)XML
(二)JSON:物件實字(object literal)
(三)HTML
五、範例講解
六、傳統請求與非同步請求並存
七、文件內容與流程
(一)文件內容圖示
PHP檔┬─HTML部─┬javascript程式┬事件驅動敘述區塊→非同步請求→執行另一個PHP並將輸出送回客戶端提出請求的瀏覽頁 └PHP程式部 └HTML標記 └<script>…javascript敘述<script>
(二)全流程
八、瀏覽器之間的差異
參、迅速上手
NO | 重點 | |||
---|---|---|---|---|
1-2 | 開發環境列表 | |||
1-3 | 觸發程式組與回應程式組關係圖 | |||
2-1 | 用DOM將回應字串(.php內放js code)塞回觸發程式的<SCRIPT>…</SCRIPT> | 兩程式 | 表單 | jj1.php簡化載入js |
2-2 | 回應是<? echo 字串 ?>,塞回觸發程式的指定div | 兩程式 | 連結 | jj1.php改用表單按鈕 |
2-3 | 回應是.txt文字檔,塞回觸發程式的指定div | 兩程式 | 連結 | demo.html是最基本的XMLHttpRequest範例解說。 |
2-4 | 回應是input的值,塞回觸發程式的指定div | 一程式 | 表單 | |
2-5 | 連結→觸發js→改變CSS→換文件底色 | 一程式 | 連結 | |
2-6 | js程式範例,漸漸變色 | 一程式 | 連結 | |
2-7 | PHPecho連結內放js code,使js code內含PHP變數 | 一程式 | 連結 | 常用於顯隱子選單 |
2-8 | 同上,但echo 不同連結,指定塞到不同的div | 一程式 | 連結 | 塞的東西不能含角括號 |
2-9 | 用PHP的urlencode函式處理角括號 | 一程式 | 連結 | |
3-1 | 用GET非同步請求,將回應塞到指定的div | 二程式 | 連結 | |
3-2 | 用GET非同步請求,將回應塞到指定的div | 二程式 | 表單 | |
3-3 | 用POST非同步請求,將回應塞到指定的div | 二程式 | 表單 | |
3-3 | 用POST非同步請求,將回應塞到指定的div | 二程式 | 表單 | |
3-4 | GET、POST非同步請求函式示範 | 二程式 | 連結 | |
3-5 | 產生link的類別與方法 | 二程式 | 連結 | |
3-6 | 回應文字是js code,如何令其執行 | 二程式 | 連結 | |
3-7 | 用連結觸發查MySQL,將回應塞到指定的div | 二程式 | 連結 | jj1.php:套函式hippo_ajax.js的XMLHttpRequest範例解說。 |
3-8 | 用連結觸發查MSSQL,將回應塞到指定的div | 二程式 | 連結 | |
3-9 | 多重非同步呼叫 | 程式 | 連結 | |
3-10 | 用onkeyup觸發將input的值後送去檢查有無此帳號 | 二程式 | 表單 | |
3-11 | 用onkeyup觸發將input的值後送去檢查有無此帳號 | 二程式 | 表單 | |
3-12 | 用js的SetTimeout('敘述',微秒)每隔幾微秒反覆執行敘述。動態效果百分之八九十靠此法 | 二程式 | 連結 | |
3-13 | 由目前到指定日期的秒差,換算成年月日時分秒 | 二程式 | 連結 | |
3-14 | 送不同的變數給回應程式,回應不同字串塞到指定的div | 二程式 | 連結 | |
3-15 | 同上,將回應分為每頁5筆,並產成各頁的連結。SimplePager類別顯示一頁 | 二程式 | 連結 | |
3-15 | 同上,用MSSQL,其沒有limit指令 | 二程式 | 連結 | |
4-1 | 用Loading、Loaded、Interactive代表readyState的1,2,3階段 | 二程式 | 連結 | |
4-2 | 用loading.gif代表readyState的前三階段,第4階段判斷是否OK,有錯丟訊息 | 二程式 | 連結 | |
4-3 | 用microtime()產生微秒,計算sleep(秒數)前後的秒數差 | 二程式 | 連結 | |
4-4 | 簡易上傳,以add_upload_box()方法,觸發後台copy()函式及訊息 | 二程式 | 表單 | demo1.php是最簡示範,demo2.php加上傳提示,demoTest.php觀察非同步請求各階段之伺服器回應,demo3.php以非同步請求處理上傳提示,demoR.php共用的回應程式 |
4-5 | 續上,指定上傳資料夾,並產生上傳檔的下載連結,只是輸出時多做一個 tag a。 | 二程式 | 表單 | |
4-6 | 讀寫檔,hippo_ajax_form.php放表單物件,javascript用sendFormData後送表單;回應時以hippo_writefile類別寫入檔案,並產生連結 | 二程式 | 表單 | |
4-7 | 文字行事曆,回應:在文字檔中加一行工作,列出文字檔各行,產生各行的刪除連結 | 二程式 | 表單 | |
4-8 | 解析上傳檔(各欄起迄位置固定)(在classes夾中),並格式化輸出 | 二程式 | 表單 | |
4-9 | 判斷上傳檔副檔名,管控上傳檔種類 | 二程式 | 表單 | |
4-10 | 連FTP(ftp_connet),回應之php以@ftp_login,視回應的真假分別echo訊息 | 二程式 | 表單 | |
4-11 | 上傳檔壓成rar,附Rar.exe、UnRAR.exe兩支程式,回應程式檢查上傳檔10秒,找到用exec(rar 參數 上傳檔)執行壓縮,並造rar檔下載連結 | 二程式 | 表單 | |
4-12 | 上傳檔即時縮圖,其檔名同上傳圖檔,classes夾中放Thumbnail類別,其buildThumb方法使用php繪圖函式imagepng,imagejpeg繪製縮圖。new Thumbnail→loadData方法→buildThumb方法 | 二程式 | 表單 | |
4-13 | 續上,上傳圖檔後,列出上傳資料夾中所有檔案的清單。用dir(路徑及目錄名)產生一物件,兩屬性,三方法。用read()方法一一取出檔案條目,用close()方法繳還資源代碼。 | 二程式 | 表單 | |
4-14 | 續上,可清空資料夾。先用dir(上傳目錄),再用@unlink(檔名)一一刪除。 | 二程式 | 表單 | |
4-15 | 續上,上傳諸縮圖合成一swf檔。在hippo_pic2flash利用PHP的swfMovie類別,再用hippo_show_flash_sp2類別秀出來。但PHP中swfMovie是實驗性的,隨時可能被取消。 | 二程式 | 表單 | |
4-16 | 連FTP建遠端資料夾。用ftp_mkdir(代碼,目錄名)。 | 二程式 | 表單 | |
4-17 | 用hippo_fetch_moblog類別中的res屬性,每10分鐘自動擷取 blog | 二程式 | 表單 | |
4-18 | 用hippo_writefile類別中的write及close方法,為上傳檔案內容加上行號。 | 二程式 | 表單 | |
4-19 | 用hippo_ftp類別中的init_link方法連線,再用mk_dir造資料夾,再用upload方法上傳檔案。 | 二程式 | 表單 | |
5-1 | 用 onclick 後送表單資料,回應放 div 。 | 二程式 | 表單 | |
5-2 | 用 onkeyup 捕捉輸入值,回應放 div 。 | 二程式 | 表單 | |
5-3 | 續上,兩個 input 各用 onkeyup 捕捉輸入值,回應送不同的 div 。 | 二程式 | 表單 | |
5-4 | 用 onkeyup 捕捉輸入值,送伺服器用php的eregi(正規表示式,輸入值)檢查mail,建議改用非即時檢查以減輕伺服器負擔。 | 二程式 | 表單 | |
5-5 | 同上,驗證身份證字號,用 hippo_ajax_sn_valid_func.php 中的 isValidID 函式。 | 二程式 | 表單 | |
5-6 | 同上,用 eregi(正規表示式,輸入值) 驗證手機號碼。 | 二程式 | 表單 | |
5-7 | 同上,用 split('[-]', 電話),拆兩段,再用 eregi 檢查前後兩段 | 二程式 | 表單 | |
5-8 | 同上,用 isURLValid 函式驗證 url 。 | 二程式 | 表單 | |
5-9 | 示範 <input type=button onclick=sendFormData(…) > 和 <a href=javascript:getData(…) > | 二程式 | 兩者 | |
6-1 | 伺服器用 $_POST[] 取表單值,供 sql 指令用。 | 二程式 | 表單 | |
6-2 | *同上,hippo_sql_query類別支援MySQL,PosgresSQL,MSSQL。其hippo_sql_query方法會叫用DBvar.php,其中會依 $connection_method 的種類調整變數,以分別適應不同資料庫。 | 二程式 | 表單 | |
6-3 | 先用 onkeyup 捕捉輸入值送後台檢查,通過後前台後送(button)才可用。 | 二程式 | 表單 | |
6-4 | 6-3的詳解。用div包<input type=button disabled=disabled onclick=sendFormData(…) > 先用 onkeyup 捕捉輸入值送後台檢查,通過後,前台的後送再解開disabled。 | 二程式 | 表單 | |
6-5 | select用$ar陣列放諸選項(值同提示),hippo_ajax_form類別中的add_select_list方法再依$ar陣列造option,遇onchange就去檢查選項。 | 二程式 | 表單 | |
6-6 | checkbox用$ar陣列放諸選項,用[名稱][0],[名稱][1],[名稱][2]…去命諸核取方塊的名稱,達到複選的功能。 | 二程式 | 表單 | |
6-7 | radio用$ar陣列放諸選項,用[名稱][0],[名稱][1],[名稱][2]…去命諸按鈕的名稱。 | 二程式 | 表單 | |
6-8 | 改自6-6,只是複選變成我同意的核取方塊,$ar陣列只有一元素。 | 二程式 | 表單 | |
6-9 | textarea,填入資料後,才允許後送。 | 二程式 | 表單 | |
6-3至6-9均由hippo_ajax_form.js中的checkFormInput()執行onkeyup的檢查。 |
肆、HTTP協定
伍、DOM實做
一、節點:(node)
種類 | 種類 | 作用 | 子輩 | nodeName | nodeValue | nodeType |
---|---|---|---|---|---|---|
文件節點 | Document | HTML之上的根節點 | 有子輩 | #document | null | 9 |
元素節點 | Element | 網頁的骨架 | 有子輩 | 標籤名 | null | 1 |
屬性節點 | Attribute | 描述元素 | 無子輩 | 屬性名 | 屬性值 | 2 |
文字節點 | Text | 網頁的內容 | 無子輩 | #text | 元素與元素之間的字 | 3 |
註解節點 | Comment | <!--… --> | 無子輩 | #comment | 註解內容… | 8 |
二、操作:
陸、javascript補充
參考 JavaScript 本質。
一、Shell
可無用戶端(瀏覽器)的環境執行,如 mozilla 的Rhino Shell。
二、資料型態
三、變數
四、型態轉換
五、運算子
六、物件
for(var prop in obj) { print(prop); print(typeof prop); }
var obj = {}; obj['x'] = 10; 回應10 obj.x; 回應10 obj['x']; 回應10
七、陣列
var obj = { '0' : 100, '1' : 200, '2' : 300, length : 3 }; for(var i = 0; i < obj.length; i++) { print(obj[i]); } 回應 100 200 300
var array = [100, 200, 300]; array.forEach(function(element) { print(element); }); 回應 100 200 300forEach是Array所提供的方法,可以指定函式,陣列中每個元素會作為引數傳入函式。
八、函式
function foo(lalala){ if('undefined' == typeof(lalala)){ lalala ="default"; } }