Ajax 这么火红,当然 YUI 是一定有支援 Ajax 功能的啦,而且还支援用 Flash Crossdomain 的方式跨网域,不过跨网域一定要在对方的伺服器上,加上 crossdomain.xml ,并写上允许的网域才行,所以还是有限制的,不要异想天开喔,这是安全性因素,不太可能会被修改的(跨网域备注)。
绑Ajax事件
第一步当然是要知道,我们必需载入的 YUI library (io-base),YUI().use("io-base",function(){}); ,接下来先开始设定 Ajax Event的 function ,下列的设定中,第一个参数值,代表 YUI 定义的处理内容,第二个参数值,代表处理的 function ,第三个参数值,就是传入 YUI 自已,第四个参数值代表额外传给处理 function的变数。
- Y.on('io:start', beforeSend, Y, { start: ['arguments','argu2']}); 雷同 JQuery 的 beforeSend : 在抓取页面的之前,指定预先要执行的工作,如显示 Loading 图片。
- Y.on('io:failure', failure, Y, { start: ['foo','bar']}); : 如果抓取网页失败后,要执行的 function。
- Y.on('io:complete', success, Y, ['lorem', 'ipsum']); : 雷同 JQuery 的 success ,成功抓取到的网页后,要执行的 function
- YUI IO Example
使用 config 的方式
Ajax的使用方式,也可以像 JQuery一样,全部写在 config里就好了,这样写程式就干净多,也好懂很多。
- var conf={
- method: 'POST',
- data: 'key=value&key2=value',
- headers: {
- 'Content-Type': 'application/json',
- },
- on:{
- complete:function(id,res){
- var data = res.responseText; // Response data.
- Y.one('.result').setContent(data);
- },
- start:function(o){
- Y.one('.result').setContent("loading");
- },
- failure:function(o){
- alert("fail");
- }
- }
- }
- var url="xxx.html";
- Y.io(url, conf);
- YUI IO conf Exampled
JQuery Ajax
讲完 YUI Ajax 的用法,现在轮到 JQuery 罗,jQuery 只有一种写法,就是用 config 的方式, 注意Jquery 也是不能跨网域的喔
type:"get",url:"xxx.html", //抓取的网页连结
data:"submit=true" , //传送的参数
beforeSend:function(){ //资料传输中处理
},
success:function(res_text){ //回应处理
alert("response="+res_text);
}
});
纯 Javascript Ajax
看完 YUI 简单的用法,现在就来复习一下传统 Javascript 怎么实作 Ajax 的功能吧,实现的方式会比较麻烦一点,主要的原因是 IE ,Firefox 写法不太一样, IE 是使用 ActiveXObject的物件去实现 Ajax ,而 Firefox 可以使用 XMLHttpRequest 来完成
下面的 Ajax makeRequest :这是一个传送 request 的范例 ,并指定接收 response 的function为 alertContents。
- function makeRequest(url) {
- http_request = false;
- if (window.XMLHttpRequest) { // Mozilla, Safari,...
- http_request = new XMLHttpRequest();
- if (http_request.overrideMimeType) {
- http_request.overrideMimeType('text/xml');
- }
- } else if (window.ActiveXObject) { // IE
- try {
- http_request = new ActiveXObject("Msxml2.XMLHTTP");
- } catch (e) {
- try {
- http_request = new ActiveXObject("Microsoft.XMLHTTP");
- } catch (e) {}
- }
- }
- if (!http_request) {
- alert('Giving up :( Cannot create an XMLHTTP instance');
- return false;
- }
- http_request.onreadystatechange =alertContents;
- http_request.open('GET',url, true);
- http_request.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
- http_request.send(null);
- }
接收 Response的function要判断 TCP 传输的状态,readyStatus : 1 代表 initial , 2 是传输入, 3 是接收资料中, 4 是资料接收完成,判断完 readyStatus 后,还要再判断另一个 status ,这是 HTTP 的 Status: 200代表成功抓取到网页, status的意思可以参考[Http Status] 。
- function alertContents() {
- if (http_request.readyState == 4) {
- if (http_request.status == 0 || http_request.status == 200) {
- document.getElementById('result').innerHTML=http_request.responseText;
- } else {
- alert('There was a problem with the request.');
- }
- }else{
- }
- }
跨网域备注
所谓的跨网域就是说 A 网站使用 AJAX 功能,试图去 B 网站撷取资料回来,这个行为会构成安全性上的漏洞,辟如说,假设你今天已经登入 Yahoo 拍卖网站,接著又去 Hack 网站看了一篇文章,接著 Hack 网站自动执行了一个 AJAX, 到 Yahoo 拍卖购买了一件商品,因为是透过你的 Browser 去执行,所以 Cookie 会自动带给 Yahoo 拍卖,於是就完成了交易,当然这个行为是不允许的,所以 Browser 会阻止跨网域的行为。