prototype.js ajax.request,prototype.js之ajax.request学习笔记(一)

这二天用prototype.js中的ajax.request做了些东西,闲时看了下源码,体会如下:

在用AJAX部分前,有如下一些函数得了解一下:

Class变量

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

var

Class

=

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif  create:

function

()

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

return

function

()

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

this

.initialize.apply(

this

, arguments);

ecedf933ec37d714bd4c2545da43add2.png    }

ecedf933ec37d714bd4c2545da43add2.png  }

8f1ba5b45633e9678d1db480c16cae3f.png}

initialize相当于构造器,和java的构造器一样,可以自定义为带参数性质的。prototype中很多对象都是用它来创建的,ajax也不例外。

Try.these() 方法

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

var

Try

=

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif  these:

function

()

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

var

returnValue;

d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

for

(

var

i

=

0

; i

<

arguments.length; i

++

)

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

var

lambda

=

arguments[i];

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

try

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png        returnValue

=

lambda();

d18c02628675d0a2c816449d98bda930.png

break

;

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif      }

catch

(e)

9b8a8a44dd1c74ae49c20a7cd451974e.png

{}

ecedf933ec37d714bd4c2545da43add2.png    }

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png

return

returnValue;

ecedf933ec37d714bd4c2545da43add2.png  }

8f1ba5b45633e9678d1db480c16cae3f.png}

它使得实现当你想调用不同的方法直到其中的一个成功正常的这种需求变得非常容易, 他把一系列的方法作为参数并且按顺序的一个一个的执行这些方法直到其中的一个成功执行,返回成功执行的那个方法的返回值。

ajax就是通过它得到一个可以跨borswer的xmlhttp的:

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

var

Ajax

=

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif  getTransport:

function

()

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

return

Try.these(

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

function

()

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

return

new

ActiveXObject('Msxml2.XMLHTTP')}

,

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

function

()

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

return

new

ActiveXObject('Microsoft.XMLHTTP')}

,

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

function

()

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

return

new

XMLHttpRequest()}

d18c02628675d0a2c816449d98bda930.png    )

||

false

;

ecedf933ec37d714bd4c2545da43add2.png  }

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png  activeRequestCount:

0

8f1ba5b45633e9678d1db480c16cae3f.png}

Object.extend方法:

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

Object.extend

=

function

(destination, source)

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

for

(property

in

source)

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png    destination[property]

=

source[property];

ecedf933ec37d714bd4c2545da43add2.png  }

d18c02628675d0a2c816449d98bda930.png

return

destination;

8f1ba5b45633e9678d1db480c16cae3f.png}

顾名思义,可正扩展了一个对象属性列表。这样说可能不太明白,结合Ajax再下就清楚了,如下,

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

Ajax.Base.prototype

=

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif  setOptions:

function

(options)

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif

this

.options

=

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png      method:       'post',

d18c02628675d0a2c816449d98bda930.png      asynchronous:

true

,

d18c02628675d0a2c816449d98bda930.png      parameters:   ''

ecedf933ec37d714bd4c2545da43add2.png    }

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif    Object.extend(

this

.options, options

||

9b8a8a44dd1c74ae49c20a7cd451974e.png

{}

);

ecedf933ec37d714bd4c2545da43add2.png  }

,

d18c02628675d0a2c816449d98bda930.png  

9b8a8a44dd1c74ae49c20a7cd451974e.png 

9b8a8a44dd1c74ae49c20a7cd451974e.png

8f1ba5b45633e9678d1db480c16cae3f.png}

可以看到在prototype中用ajax的时候,它的options默认有三个,默认值如上所示。这里可以通过以下方式来改变其默值(Ajax.Request的用法,呆会儿再看):

4f1150b881333f12a311ae9ef34da474.png

var

pars

=

'method

=

update

&

mbid

=

917

';

4f1150b881333f12a311ae9ef34da474.png

var

my

=

new

Ajax.Request(

4f1150b881333f12a311ae9ef34da474.png uri, 

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png  method: 'post',

d18c02628675d0a2c816449d98bda930.png  parameters: pars,

d18c02628675d0a2c816449d98bda930.png  asynchronous:

false

,

8f1ba5b45633e9678d1db480c16cae3f.png }

);

4f1150b881333f12a311ae9ef34da474.png}

这时有个问题可能不太好处理,假如想增加其它参数,怎么知道我所增加的参数是否符合prototype呢?确实!比如我想通过send方法传一段数据到后台,该用什么参数呢?在prototype中有如下代码:

4f1150b881333f12a311ae9ef34da474.png

var

body

=

this

.options.postBody

?

this

.options.postBody : parameters;

4f1150b881333f12a311ae9ef34da474.png

this

.transport.send(

this

.options.method

==

'post'

?

body :

null

);

可以看到应该是postBody,对于prototype中的参数以及其所代表的意义我想还是得通过源文件一个个的找。作者并没有初始一个集合(废话,不然也不要Object.extend方法了)。我觉得这个地方有待改进... ...

在send时方法一定要用post才能生效,这个时候parameters就会失效了,源码如下:

4f1150b881333f12a311ae9ef34da474.png

if

(

this

.options.method

==

'get'

&&

parameters.length

>

0

)

4f1150b881333f12a311ae9ef34da474.png

this

.url

+=

(

this

.url.match(

/

\

?/

)

?

'

&

' : '

?

')

+

parameters;

所以假如后台一定要一个parameter的话,比如若用到Struts的LookupDispatchAction就很可能要一个method参数。这时应该直接放到uri中去,最后要注意的一点就是用post的时候,一定要将响应头设置成Content-type==application/x-www-form-urlencoded. 好在prototype已经考虑到了这点:

4f1150b881333f12a311ae9ef34da474.png

this

.setRequestHeaders();

//

其具体代码可以看源文件

4f1150b881333f12a311ae9ef34da474.png

var

body

=

this

.options.postBody

?

this

.options.postBody : parameters;

4f1150b881333f12a311ae9ef34da474.png

this

.transport.send(

this

.options.method

==

'post'

?

body :

null

);

在这儿我说一下我在使用ajax过程中遇到乱码的解决方法:

从C到S头端时,在S端接到的是乱码解决分析过程。首先要明白AJAX内部是以utf-8来编码传输数据的。我们在页面所看到的数据都是按照我们自己预定的字符集解码所得到的。OK,现在假设我们在S端收到了来自C端的DATA为乱码,在C端(不管你的WEB页面是用什么编码方式)AJAX在其传输中把所传输的数据解码成UTF-8格式,到了S端后,我可能对所有请求方式都过滤编码,比如有如下设置:

4f1150b881333f12a311ae9ef34da474.png

<

filter

>

4f1150b881333f12a311ae9ef34da474.png

<

filter-name

>

encodingFilter

filter-name

>

4f1150b881333f12a311ae9ef34da474.png

<

filter-class

>

4f1150b881333f12a311ae9ef34da474.png   com.CharacterEncodingFilter

4f1150b881333f12a311ae9ef34da474.png

filter-class

>

4f1150b881333f12a311ae9ef34da474.png

<

init-param

>

4f1150b881333f12a311ae9ef34da474.png

<

param-name

>

encoding

param-name

>

4f1150b881333f12a311ae9ef34da474.png

<

param-value

>

GBK

param-value

>

4f1150b881333f12a311ae9ef34da474.png

init-param

>

4f1150b881333f12a311ae9ef34da474.png  

9b8a8a44dd1c74ae49c20a7cd451974e.png

4f1150b881333f12a311ae9ef34da474.png

filter

>

所以我们在S端看到的是将以UTF-8编码过的数据再以GBK解码后所得到的数据,这样乱码就出来了。所以解决也很简单,交其重新以自己的方式编码就OK了

new String(str.getBytes("gbk"),"utf-8");

同样的道理,假如在C端碰到的是乱码,那么在S端返回数据前将数据以UTF-8的格式传输

src.getBytes("UTF-8")

ajax.request中对事件的响应:

首先我们得在请求初始化中加入响应状态与自定义函数:

4f1150b881333f12a311ae9ef34da474.png

var

my

=

new

Ajax.Request(

4f1150b881333f12a311ae9ef34da474.png   url, 

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png    method: 'get',

d18c02628675d0a2c816449d98bda930.png    parameters: pars,

d18c02628675d0a2c816449d98bda930.png    asynchronous:

true

,

d18c02628675d0a2c816449d98bda930.png    onComplete: showResponse

8f1ba5b45633e9678d1db480c16cae3f.png   }

);

它初始化了一个ajax事件的集合

4f1150b881333f12a311ae9ef34da474.png

Ajax.Request.Events

=

4f1150b881333f12a311ae9ef34da474.png  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];

这五个状态正好对应五个readystate,ajax的五个readystate分别如下:

0 (未初始化) 对象已建立,但是尚未初始化(尚未调用open方法)

1 (初始化) 对象已建立,尚未调用send方法

2 (发送数据) send方法已调用,但是当前的状态及http头未知

3 (数据传送中) 已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误,

4 (完成) 数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据

然后根据status(点这儿可以下载查看ajax参考资料,查看其所有属性)来触发指定事件,触发代码:

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

onStateChange:

function

()

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

var

readyState

=

this

.transport.readyState;

d18c02628675d0a2c816449d98bda930.png

if

(readyState

!=

1

)

d18c02628675d0a2c816449d98bda930.png

this

.respondToReadyState(

this

.transport.readyState);

8f1ba5b45633e9678d1db480c16cae3f.png  }

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif respondToReadyState:

function

(readyState)

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

var

event

=

Ajax.Request.Events[readyState];

d18c02628675d0a2c816449d98bda930.png

9b8a8a44dd1c74ae49c20a7cd451974e.png

9b8a8a44dd1c74ae49c20a7cd451974e.png

再次可以看到正好事件集合与readyState正好对应来调用,而通过以下来调用WEB自定义函数showResponse()

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif

try

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png     

d18c02628675d0a2c816449d98bda930.png      (

this

.options['on'

+

event]

||

Prototype.emptyFunction)(transport, json);

d18c02628675d0a2c816449d98bda930.png      Ajax.Responders.dispatch('on'

+

event,

this

, transport, json);

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif    }

catch

(e)

9b8a8a44dd1c74ae49c20a7cd451974e.png

{

d18c02628675d0a2c816449d98bda930.png

this

.dispatchException(e);

8f1ba5b45633e9678d1db480c16cae3f.png    }

未完,待续...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值