Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5102583
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类:

2007-12-02 15:26:24

前几天试了下XAJAX,这对于JS不好的PHPER来说,确实是个福音。但它对PHP和HTMLclass="t_tag">代码分离支持得不好。于是昨天又找了prototype这个纯JS框架,用prototype写了一个AJAX测试class="t_tag">代码。因为我想用POST方法发送一段JSON,所以要先将JSON转化为字符串形式再POST,于是又去网上DOWN了一个json.js,用它的toJSONString()方法来转换。

代码写好后,在IE里测试,一切正常,可是FF下死活没有反应,而且错误控制台也不显示错误。这下就郁闷了,本来采用prototype.js来写AJAX是因为它的跨浏览器特性,可现在连FF都没法通过,谈何跨浏览器?

然后又去网上找基于prototype的ajax实例代码,运行也都没有问题,FF下也正常。这就更奇怪了,为什么我写的就不行呢?无意中在GOOGLE里看到一句"prototype.js和json.js一起用会有冲突,只表现在FF下,IE里正常",原来如此!

后来又继续看到,其实prototype.js 1.51的版本中,已经有了toJSON()和evalJSON()这两个方法,那我还要json.js干嘛?

去掉包含json.js的代码,然后再在FF下测试,一切正常了。

构建一个基于prototype的ajax操作实例:

1.包含prototype.js文件:
 

<script type="text/javascript" src="../jsframework/prototype.js"></script>

2.写一个函数,用来响应元素的onclick事件,其中包含ajax操作:

 


function Ajax_test()
{
var form_obj=$('form_test');
var pars=form_obj.serialize(); //得到表单中的值序列化后的字符串,如果加入参数true,则序列化成json字符串。

var url='ajax_test.php'; //定义在后台处理ajax响应的文件。

//创建一个ajax响应

var myajax=new Ajax.Request(url,{
  method: 'post', //用POST方式来发送数据。网上关于用GET方法的例子多得是,用POST的却没几个。

  contentType: 'application/x-www-form-urlencoded',
  asynchronous: true, //是否异步

  encoding: 'UTF-8',
  parameters: pars, //需要传递的参数,即要发送到服务端的数据。

  requestHeaders: {Accept:'application/json'}, //通知浏览器要传递的是JSON数据。

  onSuccess: update_page //用来处理返回数据的函数。

  });
}

3.写一个函数,用来处理返回的数据,以及更新当前的页面:

 

function update_page(req)
{
var json=req.responseText.evalJSON(true); //用evalJSON()方法把服务端传过来的字符串转化成JSON数据对象。

var doc_obj=$('show_result');
var str='';
str+="姓名:"+json.username+"
"
;
str+="年龄:"+json.age+"
"
;
str+="性别:"+json.sex+"
"
;
str+="工作:"+json.job;
doc_obj.innerHTML=str;
}

4.关键HTML:

 

<div id="show_result" style="background:orange;border:1px solid red;width:300px;height:400px;"></div>
<form id="formtest" action="" method="post">
<p><span>输入姓名:</span><input type="text" name="username" id="input1" /></p>
<p><span>输入年龄:</span><input type="text" name="age" id="input2" /></p>
<p><span>输入性别:</span><input type="text" name="sex" id="input3" /></p>
<p><span>输入工作:</span><input type="text" name="job" id="input4" /></p>
</form>
<button onclick=\"Ajax_test();\">提交</button>

5.服务端的PHP代码:

 


<?php
$arr=$_POST;
$myjson=json_encode($arr); //将数组编码成json字符串,然后输出

echo $myjson;
?>


整个过程保持服务端与客户端的编码一致,否则有可能造成乱码。而且曾经的浏览器缓存问题,在测试过程中,不管是用GET还是POST,都好像没有发现。

如果使用application/x-www-form-urlencoded,传输时会自动按照名称/值对编码的,这就说明了,可以使用一个JS对象,或者一个哈希数组来传值。因此,上面的Ajax_test()可以改成:

 

function Ajax_test () {
    var url='ajax_test.php';

    var pars=new Object();
    //分别取各表单控件的值,存到对象pars的属性中

    pars.username=$F('input1');
    pars.age=$F('input2');
    pars.sex=$F('input3');
    pars.job=$('input4').getValue(); //与$F('input4')等同


    var myajax=new Ajax.Request(url,{
                       method: 'post',
                       parameters: pars, //pars这时其实是个对象

                       contentType: 'application/x-www-form-urlencoded',
                       // contentType: 'text/plain',

                       requestHeaders: {Accept: 'application/json'},
                       onSuccess: operate
                       });
}

另外,prototype还提供了toJSON和evalJSON方法,对JSON来说,确实是很方便了,也就不需要再用json.js了。还有toQueryString方法:

 

 

<script type="text/javascript">
var o=new Object();
o.name='orange';
o.age=100;
o.job='计算机';
var jsonstr=Object.toJSON(o);//将对像格式化成JOSN字符串

alert(jsonstr); //{"name": "orange", "age": 100, "job": "计算机"}

var json=jsonstr.evalJSON(); //将字符串转化为json对象

alert(json.name); //orange

var hash=$H(o); //将对象转化成哈希数组

alert(hash.toQueryString()); //name=orange&age=100&job=%E8%AE%A1%E7%AE%97%E6%9C%BA

</script>

阅读(2628) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~