什么是AHAH?
AHAH:(Asychronous HTML and HTTP)
簡(jiǎn)單來(lái)說(shuō),AHAH是一種利用JavaScript動(dòng)態(tài)更新web頁(yè)面的技術(shù).他通過XMLHTTPRequest來(lái)獲得動(dòng)態(tài)的html,填充到 web頁(yè)面中。
和AJAX的關(guān)系?
AHAH被認(rèn)為是一種比AJAX(Asynchronous JavaScript and XML)更簡(jiǎn)單的web開發(fā)方式,嚴(yán)格意義上來(lái)說(shuō)AHAH是AJAX的一個(gè)子集,因?yàn)?X)HTML本身及時(shí)一個(gè)特殊形式的XML,但是最為子集的AHAH卻有特殊的和有用的特性:
1.無(wú)需定義XML schemas可以使設(shè)計(jì)時(shí)間大幅減少
2.使用已有的HTML頁(yè)面從而避免必須提供特殊的Web服務(wù)
3.所有的數(shù)據(jù)通過瀏覽器可識(shí)別的HTML傳輸,從而可以很容易的調(diào)試和測(cè)試
4.HTML直接包含在頁(yè)面的DOM對(duì)象中,無(wú)需解析
5.HTML設(shè)計(jì)者可以使用CSS來(lái)格式化顯示,無(wú)需程序員使用XSLT轉(zhuǎn)換
6.所有的處理都在服務(wù)器端完成,客戶端不需要編寫任何程序
實(shí)事上,任何內(nèi)容的最終都是要轉(zhuǎn)化成瀏覽器可識(shí)別結(jié)果,展現(xiàn)在瀏覽器上。很難想象出轉(zhuǎn)化成自定義的XML格式比HTML有什么優(yōu)點(diǎn)
參考ahah.js 和 jah.js
Send AHAH Request
1 function ahah(url,target) {
2 // native XMLHttpRequest object
3 document.getElementById(target).innerHTML = 'sending
';
4 if (window.XMLHttpRequest) {
5 req = new XMLHttpRequest();
6 req.onreadystatechange = function() {ahahDone(target);};
7 req.open("GET", url, true);
8 req.send(null);
9 // IE/Windows ActiveX version
10 } else if (window.ActiveXObject) {
11 req = new ActiveXObject("Microsoft.XMLHTTP");
12 if (req) {
13 req.onreadystatechange = function() {ahahDone(target);};
14 req.open("GET", url, true);
15 req.send();
16 }
17 }
18 } Receive AHAH Request
1 function ahahDone(target) {
2 // only if req is "loaded"
3 if (req.readyState == 4) {
4 // only if "OK"
5 if (req.status == 200 || req.status == 304) {
6 results = req.responseText;
7 document.getElementById(target).innerHTML = results;
8 } else {
9 document.getElementById(target).innerHTML="ahah error:\n" +
10 req.statusText;
11 }
12 }
13 }
Executing Javascript
由于瀏覽器在插入HTML的時(shí)候并不會(huì)執(zhí)行<script>標(biāo)簽中的代碼,所以你可以利用下面的方法來(lái)解決 document.getElementById(target):
1 var bSaf = (navigator.userAgent.indexOf('Safari') != -1);
2 var bOpera = (navigator.userAgent.indexOf('Opera') != -1);
3 var bMoz = (navigator.appName == 'Netscape');
4 function execJS(node) {
5 var st = node.getElementsByTagName('SCRIPT');
6 var strExec;
7 for(var i=0;i<st.length; i++) {
8 if (bSaf) {
9 strExec = st[i].innerHTML;
10 }
11 else if (bOpera) {
12 strExec = st[i].text;
13 }
14 else if (bMoz) {
15 strExec = st[i].textContent;
16 }
17 else {
18 strExec = st[i].text;
19 }
20 try {
21 eval(strExec);
22 } catch(e) {
23 alert(e);
24 }
25 }
26 }
27
注意:
1.由于IE返回的tag標(biāo)志都是大寫,所以你必須搜索SCRIPT而不是script.在firefox中也保留大寫的形式.
2.不要用//的注釋方式,用/**/的方式來(lái)代替,在每一個(gè)聲明句后面加';'
(未完..)