什么是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.不要用//的注释方式,用/**/的方式来代替,在每一个声明句后面加';'
(未完..)