Ajax与Prototype

上一篇 / 下一篇  2008-07-08 16:56:32 / 个人分类:.NET

常用函数

2.2.1 $()函数

DOM提供了document.getElementById方法,可以根据传入的页面元素的id返回相应的元素对象。$()函数是document.getElementById函数的一个简化写法,它比DOM中的方法功能更加强大,比如$()函数可以接受多个参数,返回满足条件的Array对象。在Prototype中$()函数的实现代码如例2-1所示。

Y(nsMK YEG|5m6n/Q0

例2-1 $()函数51Testing软件测试网 [!sj@_$F

function $() {51Testing软件测试网%f)WT lX

var results = [], element;51Testing软件测试网)x'Ep,M-VN EI2[

for (var i = 0; i < arguments.length; i++) { // 可以传入多个参数51Testing软件测试网ZC0z&~/Z.g(f8X'L

    element = arguments[i];51Testing软件测试网8Q\i1X9yYT!a A y h.E

    

5KA9s*~ @6I9D3Dl:j0

     // 如果参数的类型是字符串

d.?2` T*VmyV/~0

    if (typeof element == 'string')51Testing软件测试网avS2f*P)U

      element = document.getElementById(element);51Testing软件测试网h!AQ1BX0wK;k&F~

   

/Vp7S(}#| ~ x0

    results.push(Element.extend(element)); // 将得到的对象加入results数组

@^ e$qK.E x1[ ?)I0

}51Testing软件测试网/v_,K-q4C4B$R3P B^(o:t

// 如果只返回一个对象,直接返回该对象,如果返回了多个对象,则返回包含所有这些对象的数组51Testing软件测试网e%FnfO?Q

return results.length < 2 ? results[0] : results;

0O1b6cu |_#Ax0

}51Testing软件测试网te3cB5EK mp

从例2-1中可以看到,当$()只有1个输入参数时,它和document.getElementById是等效的,而当$()拥有多个输入参数时,其返回值是一个Array对象,这个数组包含了所有符合条件的对象。例2-2中分别用1个和多个参数调用了$()方法,注意示例中的黑体字。51Testing软件测试网Ezg/FV7eG

例2-2 $()函数应用示例51Testing软件测试网UuL H_b5D

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"51Testing软件测试网,g ?Dz.l6MF

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

G-Q*}&SgZ0

<html>

L9B2OED7N4o`!x0

    <head>

Z;L9R g[E0

        <title>chapter 3</title>

(t"c5J+X&ZNRf:Y0

        <scrīpt type="text/javascrīpt" language="javascrīpt"

|,`$Q xB*\0

        src="prototype.js" ></scrīpt>51Testing软件测试网 _#sX`e,Jhu

        <scrīpt type="text/javascrīpt" language="javascrīpt">51Testing软件测试网2y h8S'~pe

        function test1() {51Testing软件测试网Om.Z0nO I

           var div = $("div1"); //单个参数51Testing软件测试网#a8Nv+\H s fNv'F

            alert(div.innerHTML); // 输出div1的HTML文本

.N&E}2c2cPm*\0

        }51Testing软件测试网 V9Dj\si/e~*Q*JF

       

7H;^7iUr0

        function test2() {51Testing软件测试网V2xfU Q0ex

           var divs = $("div1", "div2"); //多个参数51Testing软件测试网k^%n]Jw$q?^*L+v

            for (var i = 0; i < divs.length; i++) {51Testing软件测试网+s#{1H h o[4Jhh

                alert(divs[i].innerHTML); // 依次输出div1、div2的HTML文本51Testing软件测试网G)T'?T YU_1D;f_7v

            }51Testing软件测试网NgK?nm!jRW

        }51Testing软件测试网d:p%OU M{S

        </scrīpt>

t"_S$b9U mo8R0

    </head>

E \6m_-k#EN;xK:x0

    <body>

3x,W&nl ?0

    <div id="div1">

CB2s5B_0`l}0

        div151Testing软件测试网2\u`{\0e8| n

    </div>51Testing软件测试网;@~ u#g0w$N

    <div id="div2">

wPo1Ql8I-x0

        div251Testing软件测试网;B[c-o,DX;p/w

    </div>51Testing软件测试网~ wr\0aD&S3sx

    <input type="button" value="click1" ōnclick="test1()" />

&j3n+Cq/\yC0

    <input type="button" value="click2" ōnclick="test2()" />

-_;t%a:S)Bfw0

    </body>51Testing软件测试网e&cA$Gm!{ f k4va

</html>

@R0h)L\%z8U4BO0

2.2.2 $A()函数

$A()函数可以将一个可枚举的对象转换为一个Array对象,它和Array.from()是等效的。例2-3是Prototype中$A()函数的实现代码。

Kg3iO'T D,Ii0

例2-3 $A()函数51Testing软件测试网4D3\S,Guih

var $A = Array.from = function(iterable) {

;Y v eXf~` Y0

if (!iterable) return [];// 如果iterable对象不存在,返回空数组

"]Xs!j-pT0

if (iterable.toArray) { // 如果iterable有toArray方法,返回iterable.toArray()51Testing软件测试网yW _#ds+Kx8W

    return iterable.toArray();51Testing软件测试网;s'B oQ~^_

} else {51Testing软件测试网3FgD)LT

    var results = [];51Testing软件测试网#T[ L r!m5R-p7DR

    for (var i = 0; i < iterable.length; i++)51Testing软件测试网'I2c1X#M'Sf5@0V

      results.push(iterable[i]);51Testing软件测试网$R/H`eW/NtD

    return results;//返回对象数组51Testing软件测试网L Fejc @2A2L

}

'r v.O?*w`0

}51Testing软件测试网.u.U+`^)A3]5d

可以看到,$A()函数是通过两种方式返回Array对象的。第一种方式是如果传入的对象已经实现了toArray方法,那么则直接调用其toArray方法;第二种方式是通过循环的方式返回对象的数组。使用第二种方式的前提是传入的对象具有length属性,并且可以通过序号索引其内部的所有对象。例2-4是$A()函数的应用示例,注意示例中的黑体字。51Testing软件测试网 Y1K Vw6[#U

例2-4 $A()函数应用示例

5T"Z&[oL4m;nw7T0

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

'^+Ar#A-kt0l C/L!T \0

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Iyo&@#PJg8K4|:u8O0

<html>

9h8^6A"?.c Q/S:jU7o0

<head>

2X6`4})\@`y0

    <title>chapter 3</title>51Testing软件测试网EnP&f~I5P|[*XO

    <scrīpt language="javascrīpt" src="prototype.js"

lH } TTe0

    type="text/javascrīpt"></scrīpt>

l ~GKcY'u0

    <scrīpt language="javascrīpt" type="text/javascrīpt">

FO7e*tp-k;TP1{ D0

    function showOptions() {

0G{/NuX8W.V0

        //获取所有option对象的集合

6R.a,f`8^0v]$b*Y0

       var someNodeList = $("lstFramework").getElementsByTagName("option");51Testing软件测试网4vMtr3x@'p6H

        //通过$A方法把option对象的集合转换为Array对象

!ww&sx(lKd0

        var nodes = $A(someNodeList);51Testing软件测试网%H(_ Pi;V)R

       51Testing软件测试网w?^ f2i$o

        var info = [];51Testing软件测试网Y nI6ohkv!b |

       

er!yD1M"_5B0

        nodes.each (function(node){ // 遍历nodes,添加到info数组中51Testing软件测试网2lD|$wA%[6t

            info.push(node.value + ": " + node.innerHTML);51Testing软件测试网m.c m1]A S"e

        });51Testing软件测试网R&L2Ut&|

       51Testing软件测试网'}!L3Z1x h)G/hmc]

        alert(info.join("\r\n"));51Testing软件测试网4s4_ vDV_;S1hl&x

    }51Testing软件测试网&di0E*hB _

    </scrīpt>51Testing软件测试网A)s2c jL Gi

</head>51Testing软件测试网&m#j\ta

<body>

1kT{ bn f0

    <form>51Testing软件测试网*]QnMn*e C

        <select id="lstFramework" size="10">

a;Da^4@5fa0l'L0

            <option value="1">Prototype</option>

Rn1m3kh0

            <option value="2">scrīpt.aculo.us</option>51Testing软件测试网 {4z{*xKK:}5g&o |

            <option value="3">Dojo</option>51Testing软件测试网Z'm}@ |X0P

            <option value="4">YUI</option>51Testing软件测试网q8ba)^(qE9cBI

        </select>51Testing软件测试网E%|]f_@xR

        <input ōnclick="showOptions();" type="button" value="Show the options">51Testing软件测试网}'W4vm%d(z/e6TD"}

    </form>

~@I? x0

</body>51Testing软件测试网Y'|J6Z$x)| |+M

</html>51Testing软件测试网GL n KrrY }

?m1T-F m q0

图2-1 $A函数应用示例51Testing软件测试网AmE:D^,O

例2-4是通过点击“Show the options”按钮触发onclick事件的响应函数showOptions,函数showOptions使用$A方法将lstFramework 的option对象集合转换为数组输出,相应的输出结果如图2-1所示。51Testing软件测试网dr0PI3o

2.2.3 $F()函数

$F()是另一个经常使用的快捷方式,它是Form.Element.getValue()函数的缩写。$F()函数用来求得页面中输入控件的输入值,它的输入参数可以是目标控件的id值,也可以是目标控件对象本身。$F支持的输入控件包括<input>系列(即type=submit / hidden / password / text / checkbox / radio)、下拉列表<select>控件(多选的情况下,$F将会返回所有选中值的Array对象)和<textarea>控件。例2-5给出了$F()函数的应用示例,该示例通过点击按钮触发onclick事件的响应函数test,调用$F()方法获得输入控件“username”的输入值,然后输出。

[,z'U,R'@.F$J0

例2-5 $F()函数应用示例

tI!E5x?5pB0

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

F3x mO'Y0

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

szH m)L} Y+W0

<html>51Testing软件测试网r/wM5P'u.T

    <head>51Testing软件测试网"j5~/?QZ7n`(f

        <title>chapter 3</title>51Testing软件测试网1zw$R M3nQ&FK

        <scrīpt type="text/javascrīpt" language="javascrīpt"51Testing软件测试网W)[0g^Mx+x"r&eo7pF!V

        src="prototype.js" ></scrīpt>

![:I]4_1|8wf*d z7Ap0

        <scrīpt type="text/javascrīpt" language="javascrīpt">

P.K@7g]0

        function test() {51Testing软件测试网6~9lh(^.G@#S

            alert($F("userName"));

3w9cA){+~@]"T)f0

        }51Testing软件测试网K'C@E"\%iKbqgILS

        </scrīpt>

0{Z"t*Mp)`0

    </head>51Testing软件测试网(yAD LZg

    <body>51Testing软件测试网"I7[#jN0E$@t$h

        <form>51Testing软件测试网;DJ.b|1YM"vR

            <input type="text" id="userName" value="test username">

)? he']FC4r:u0

            <input type="button" value="click" ōnclick="test()">

!Q-e-DHmRtqE0

        </form>51Testing软件测试网-B)d"LU }@(K(d!SM.Yz

    </body>51Testing软件测试网c W6z/z.t$D$w!V

</html>51Testing软件测试网%j&f:[ R6?/rSJ

2.2.4 $H()函数

Hash对象Prototype中定义了Hash对象一个用于模拟Hash数据结构,$H()函数的功能是将对象转换为Hash对象。$H函数将Hash对象的方法和属性通过Object.extend方法扩展到目标对象上,这样返回的对象就具有了Hash对象的方法,如keys方法,values方法等等。下面是$H()函数的一个应用示例:51Testing软件测试网v.O_6q(Nh

<scrīpt>

N7ce*c(@-}(l0

function test() {

:N$Pn/I z&E0

    // 创建一个对象

8?9K"`6yW`,Q0

    var ōbj = {

#\(x1b(DE8nL0

        key1: 1,

g wA/S ['C0

        key2: 2,

7R"Q)Dd._0

        key3: 351Testing软件测试网k&uf2A |z

        };51Testing软件测试网5u6{*gy6Q1|I

    // 将其转换为Hash对象

,sj a2S!H2m-ieP0

    var hash = $H(obj);

^e;B"Ok0

    alert(hash.toQueryString());

VW ];Ew+}-E0

}51Testing软件测试网0U Vn@9Kv(y,_

</scrīpt>

[eEna3gDbJ,L0

2.2.5 $R()函数

$R()函数是new ObjectRange(start, end, exclusive)的缩写形式,它根据指定的起始边界返回相应的对象范围。在Prototype中$R()函数的定义如例2-6所示。

N,n{'_Q\P%]0

例2-6 $R()函数定义

;r*i&HRq8G8uWA%ean0

ObjectRange = Class.create();51Testing软件测试网;Ot;Lu1e

Object.extend(ObjectRange.prototype, Enumerable);51Testing软件测试网)z]E#|8gNj0\

Object.extend(ObjectRange.prototype, {51Testing软件测试网%pT? ]%m%G

initialize: function(start, end, exclusive) {

#E;|_x C8K*Q4jcq/{h0

    this.start = start;

5gNb[iX&w0

    this.end = end;51Testing软件测试网-g9dP5z tx

    this.exclusive = exclusive;51Testing软件测试网Tf'Y0N7U

},51Testing软件测试网)Ru8A:fl#v{)i

_each: function(iterator) {

)N{1N]kc0

    var value = this.start;

#M,mR&D G0

    do {

^L8V(}&^(W0S0

      iterator(value);51Testing软件测试网 Z{:` hM+T

      value = value.succ();51Testing软件测试网%UCT5@ O)H B

    } while (this.include(value));51Testing软件测试网;{b{;Tz}

},

U3~~ wG#_2D~$Y0

// include函数的作用是判断value是否包含在对象范围之内51Testing软件测试网 t0uK|&?ASDv

include: function(value) {51Testing软件测试网&~}'f#c0P#cf/z

    if (value < this.start)51Testing软件测试网!M:xdfL

      return false;

I h ]8Z$V*u0

    if (this.exclusive) //注意exclusive参数仅在判断上界是有效51Testing软件测试网,j*a3i'|GZ

      return value < this.end;

Vbd!s9S0

    return value <= this.end;

9T3N_)Y)yn}0

}51Testing软件测试网2t"ni*K!d2i

});

e0p$OW+Q hc!{W0

var $R = function(start, end, exclusive) {

(zhl j2b6OY"_0

// 定义$R方法,$R是new ObjectRange(start, end, exclusive)的一个简单写法或快捷方式

1@$s"| I] P0x~0

return new ObjectRange(start, end, exclusive);

K k,yxK(|:c0

}51Testing软件测试网 GMfW t+U7u"R/vY

可以看到,ObjectRange类是由Enumerable类继承而来,它的初始化参数start、end和exclusive分别代表ObjectRange对象的下界、上界以及是否排除上界的值。这里需要注意的是,exclusive参数仅仅对上界起作用,从ObjectRange的include方法的实现代码中不难看出这一点。例2-7给出了$R()函数的应用示例,其中比较了exclusive参数分别为true和false时的区别。

kF"Z'KXHR m UAF%~0

例2-7 $R()函数应用示例

n.sHs;Aw"I&\6_0

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

CX h6H K3L0

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">51Testing软件测试网 e@~B~x:KQ*D/{

<html>51Testing软件测试网8d1i2Fy/A)\

    <head>

v6K0watD.A]0

        <title>chapter 3</title>

pRI|5l_AOf0

        <scrīpt type="text/javascrīpt" language="javascrīpt"

H G]6l:JB N+R8d2Xb e0

        src="prototype.js" ></scrīpt>

!fK,R2C;e~le0

        <scrīpt>51Testing软件测试网HW*| y-_f$K \'b(^

        // 依次输出1,2,3,451Testing软件测试网6m,OD2ZIeXbgF

        function test_R1(){51Testing软件测试网O Y-oX\Fl

            var range = $R(1, 5, true);

cKhC G X0

            range.each(function(value, index){

2C%Pm%sc X5I0

                alert(value);

#V$}%Zo"[0

            });

Du'}\y0

        }51Testing软件测试网%|e Z$t oJ

        // 依次输出1,2,3,4,551Testing软件测试网gMl&nC

        function test_R2(){51Testing软件测试网$Hj;s9v#r4?3Szc[Fl

            var range = $R(1, 5, false);

8TJ#q |-F0

            range.each(function(value, index){

f6i.gx*KMPG`0

                alert(value);51Testing软件测试网qTz3B)G(l1`

            });

3F]jgO8C/O:k&Cy0

        }51Testing软件测试网m Q:s@eS(A

        </scrīpt>51Testing软件测试网mCm+Y%n g/NP ^

    </head>51Testing软件测试网 n^ Wx:L2t$L8T

    <body>51Testing软件测试网p#en)`?,Pzx)B6p

        <form>51Testing软件测试网MeW;T,g's

            <input type="button" value="click (exclusive = true)"

'm `$Z4Sg-S0

            ōnclick="test_R1()" />

d-g(EQ3Y|rJR0

            <input type="button" value="click (exclusive = false)"51Testing软件测试网2J_'KO:p

            ōnclick="test_R2()" />

\xB1Jj4LBX0

        </form>

@P7J-U"F re0

    </body>51Testing软件测试网1h'](SNN?

</html>

N3N0nt~|{-? ?0

2.2.6 $$()函数

$$()函数是Prototype 1.5新增的一个快捷方式,它允许开发人员通过CSS样式选择页面中的元素。熟悉XPath的读者会发现,CSS选择符在语法形式上和XML文档的XPath十分类似,Prototype支持的CSS选择符包括以下几种类型:

@'_:kk(V8g~}0

l 元素标签名称,例如:$$(“li”)。

jA B{l6k%t0

l 元素ID,例如:$$(“#fixtures”)。

5JC#?zk _0s0

l CSS类名,例如:$$(“.first”)。

J~ DK@@.[Tf0N0

l 元素是否具有某个属性,例如:$$(“h1[class]”)。

KzX4Jt1P7Zm0

l 元素的某个属性是否符合特定的条件,例如:$$('a[href="#"]')、$$('a[class~="internal"]')、$$('a[href!=#]')。51Testing软件测试网~}'\3fO1|*L

l 上面所有这些CSS选择符的类型可以自由组合,形成一个复合的CSS选择符,例如:$$('li#item_3[class][href!="#"]')。51Testing软件测试网keg7dwyH`

l 不同的CSS选择符(包括复合CSS选择符)之间用空格分隔,就组成了一个多层的CSS选择符,它通过指定目标元素的父节点甚至更多层父节点的CSS样式属性来定位目标元素。例如:$$('div[style] p[id] strong')。

JR2x5o3POiG0

例2-8给出了一个$$()函数的测试页面示例,读者可以在该页面中输入不同的CSS选择符表达式,测试结果。

*e-b6VmWr{0

例2-8 $$()函数测试页面51Testing软件测试网*S,h:ET9a p^['Z

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

.|&?;D'yE(^0

        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

8Mp5M ~A{9ap0

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">51Testing软件测试网(}p%WFA [a IQL7N

    <head>

b`&A4o\ p`0

        <title>chapter 3</title>51Testing软件测试网4Q"Dgp+N@

        <style type="text/css" media="screen">51Testing软件测试网wn A0I;J

        /* <![CDATA[ */51Testing软件测试网US7nV"b$M|

        #testcss1 { font-size:11px; color: #f00; }51Testing软件测试网T e ]3{hju

        #testcss2 { font-size:12px; color: #0f0; display: none; }51Testing软件测试网*K2pG1R]0hXA7Z

        /* ]]> */51Testing软件测试网6c3@1R(O|

        </style>

L9Q!|6WSs pBD]0

        <scrīpt type="text/javascrīpt" language="javascrīpt"

*Z7q0k;NQ"U(R#Pj0

        src="prototype.js" ></scrīpt>51Testing软件测试网[5L!Y'Trk

        <scrīpt>

z9|'BZ c0

        function test() {51Testing软件测试网7H$~G6B;G/bV*n/[4C?VR

            // 根据输入的CSS选择符,切换相应元素的显示51Testing软件测试网,Ut P:SzJiU1t

            $$($F('csspath')).each(

N1DHJCG1J`0

                function(item) {

7j,kkhOo2iI G:C0

                    Element.toggle(item);

)G4{K#S'X0

                }

"J!? ~)\a6L {0

            );51Testing软件测试网.l+uK/~)jsD1b

        }

??ZT'G O.Jb0

        </scrīpt>51Testing软件测试网Z;_K.D3H*Z

    </head>

dt,M \d"_0

    <body>51Testing软件测试网V l{h[ quS mO

        <form>51Testing软件测试网8E5NqIl

            <div id="fixtures">

\~9g*S7@(uz_V-D0

            <h1 class="title">Some title <span>here</span></h1>51Testing软件测试网^;T fU@

            <p id="p" class="first summary">

lNO)T+WM a+OJ0{0

                <strong id="strong">This</strong> is a short blurb

%z]:y5`co0p:\G0

                <!-- 该页面元素具备 first和internal两种CSS样式-->

,d s ^ny!P0

                <a id="link_1" class="first internal" href="#">with a link</a> or

Y.w'iaf&q1\W0

                <a id="link_2" class="internal highlight" href="#">51Testing软件测试网 G:inwr

                    <em id="em">two</em>

*r7O:zG6o,n-A0

                </a>.

&Ix#n&f.iV9I i!pe0

            </p>51Testing软件测试网T9X} Z/Q a2q8sH.tA/T8B

            <ul id="list">51Testing软件测试网8Z#sI)u`H

                <li id="item_1" class="first">

sv\KkWD0

                    <a id="link_3" href="#" class="external">51Testing软件测试网V9I8aTZ LE N4Fh

                    <span id="span">Another link</span>

R7hA7KU8QR iTh0

                    </a>

b ^&AXq.Nw:_l0

                </li>51Testing软件测试网:r}+Z \hOjd^B+u

                <li id="item_2">Some text</li>51Testing软件测试网&vL zz{ z1]i"O z

                <li id="item_3" xml:lang="es-us" class="">Otra cosa</li>51Testing软件测试网 @{:A(OO w9\x

            </ul>51Testing软件测试网@ {r ||M7l.U-U Da

            </div>51Testing软件测试网`2R3^ Y;Q ^

            <input type="text" value="" id="csspath" />51Testing软件测试网4xI nH3B-m

            <input type="button" value="click" ōnclick="test()" />

|llFB'I+hl0

        </form>51Testing软件测试网@6Z-R9V@['X

    </body>51Testing软件测试网|O4?ZG!D {:UK

</html>

9e|Y`+U9nlJ)B0

例2-8的运行页面如图2-2所示,在文本输入框中输入一个CSS选择符(例如“.title”),点击“click”按钮即可切换相应的页面元素(即Some title here)的显示/隐藏状态。51Testing软件测试网fL9IC9{*b4U;H)W+@

   

)hO8PEp{c8s0

(a) 在文本输入框中输入CSS选择符“.title”             (b) 页面元素“Some title here”隐藏

"e]M a3F!V[0

图2-2 $$函数应用示例51Testing软件测试网B:h3kB*pY.[ L!Zj

2.2.7 Try.these()函数

在程序开发的过程中有时会遇到这样的情况:在若干个函数中开发人员不能确定哪一个会返回正确的结果,只能依次尝试。Prototype中Try.these()函数为开发人员提供了一个很简便的方式来解决类似的问题。Try.these()函数的的定义如例2-9所示。51Testing软件测试网#}7W!T:cfB

例2-9 Try.these()函数51Testing软件测试网Z'^[ f U^Q%sVi t_

var Try = {

"L'r!I b R5B A0

these: function() {

d5[;I q'JIG/E H4fc0

// 返回结果51Testing软件测试网&I'Can2EE J

    var returnValue;51Testing软件测试网4p?1XpQ3W8T3`

    for (var i = 0; i < arguments.length; i++) {

DSA4tM0

// 输入参数为多个function对象51Testing软件测试网I8t&s1X%x5W@q*c8LL

      var lambda = arguments[i];51Testing软件测试网+b)Y/V`~ N pL

      try {

4j~6f1A9Q |,c0

// 如果其中一个函数成功返回,则返回该函数的结果51Testing软件测试网8yO]uEil K#D+?4D

        returnValue = lambda();51Testing软件测试网NWug9w K&f||

        break;51Testing软件测试网"C-f'Iq5f$t6E{

      } catch (e) {}

Ew yXVV0

    }

T2Yddxa0

    return returnValue;

p5fQ8lI0

}51Testing软件测试网g!n&l*Xt6yN

}

;DV6K'q%B`0}'BXf0

从上述代码中可以看到,Try.these()函数的每一个参数都必须是一个无参的Javascrīpt方法。在Prototype框架中,实现Ajax对象的getTransport方法就用到了Try.these()函数,getTransport方法的作用是返回一个XMLHttpRequest对象,而在不同浏览器中创建XMLHttpRequest对象的方式是不同的。通过Try.these ()函数可以依次尝试各种浏览器创建XMLHttpRequest对象的方法,直到成功为止。例2-10所示为Ajax对象的getTransport方法的实现代码。51Testing软件测试网!cw4S2S]

例2-10 Ajax对象的getTransport方法的实现代码

M!}4]+JW0

var Ajax = {

NP b @1G;OF0

getTransport: function() {

$|{N5c_ lini ` j7Il0

    // 尝试以下3种创建XMLHttpRequest对象的方法

BU*\1P}.K0

    // 1. Mozilla浏览器中的XMLHttpRequest对象51Testing软件测试网^!Wu)Or*Iv ]W

    // 2. 创建ActiveX对象"Msxml2.XMLHTTP"51Testing软件测试网:?7K5h0u+k/VP

    // 3. 创建ActiveX对象"Microsoft.XMLHTTP"51Testing软件测试网1\J"k:TB1_

    return Try.these(51Testing软件测试网0cyR*a{(Q{)a/f(^

      function() {return new XMLHttpRequest()},51Testing软件测试网0x|'].Z5T6y"^1N-A

      function() {return new ActiveXObject('Msxml2.XMLHTTP')},

7Wx.R^!P0I v0

      function() {return new ActiveXObject('Microsoft.XMLHTTP')}51Testing软件测试网-\N.C~o,En

    ) || false;51Testing软件测试网Y.R3o0tV,}Zm.b

},51Testing软件测试网JI0W1j7}'t r!]2N

A%J`&AA(_%Jx th0

// 当前活动的Ajax请求计数

oQ]nL&uf0

activeRequestCount: 051Testing软件测试网 n M-\|H NGX w?7U

}51Testing软件测试网 ~m1N8k1Z@|,_

第2章介绍了创建XMLHttpRequest对象的方法,代码中对浏览器的类型、版本进行了判断,最终返回XMLHttpRequest对象的实例。与第2章中使用的方法相比,Prototype框架中Ajax对象的实现代码更加简洁明了。51Testing软件测试网4AcA5\oc


TAG:

 

评分:0

我来说两句

Open Toolbar