什么是AHAH?
AHAH:(Asychronous HTML and HTTP)
簡單來說,AHAH是一種利用JavaScript動態更新web頁面的技術.他通過XMLHTTPRequest來獲得動態的html,填充到 web頁面中。
和AJAX的關系?
AHAH被認為是一種比AJAX(Asynchronous JavaScript and XML)更簡單的web開發方式,嚴格意義上來說AHAH是AJAX的一個子集,因為(X)HTML本身及時一個特殊形式的XML,但是最為子集的AHAH卻有特殊的和有用的特性:
1.無需定義XML schemas可以使設計時間大幅減少
2.使用已有的HTML頁面從而避免必須提供特殊的Web服務
3.所有的數據通過瀏覽器可識別的HTML傳輸,從而可以很容易的調試和測試
4.HTML直接包含在頁面的DOM對象中,無需解析
5.HTML設計者可以使用CSS來格式化顯示,無需程序員使用XSLT轉換
6.所有的處理都在服務器端完成,客戶端不需要編寫任何程序
實事上,任何內容的最終都是要轉化成瀏覽器可識別結果,展現在瀏覽器上。很難想象出轉化成自定義的XML格式比HTML有什么優點
參考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的時候并不會執行<script>標簽中的代碼,所以你可以利用下面的方法來解決 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標志都是大寫,所以你必須搜索SCRIPT而不是script.在firefox中也保留大寫的形式.
2.不要用//的注釋方式,用/**/的方式來代替,在每一個聲明句后面加';'
(未完..)