All posts by 龙生

挣脱浏览器的束缚 – Ajax权限问题

  标题有些唬人的成分,因为这里跨的只是子域名。   事情的经过是这样的,还是那个个人门户网站。其中有个功能就是RSS订阅,每个订阅作为一个模块出现在页面上。如果一个用户订阅了比较多的RSS,则在打开页面时所有的RSS模块就会开始加载,这时候可能就会需要十几秒甚至更长的时间才能加载完毕。这时,如果用户需要作别的AJAX操作——比如保存页面设置——那么长时间的等待就不可避免了,谁让浏览器对于相同域名只能同时存在两个连接呢?不过这可不是一个好的用户体验,那么我们需要怎么做呢?   第一种做法可能比较容易想到,我们可以自己编写代码维护一个Priority Queue,为每个请求附加一个“优先级”信息,这样我们就可以把重要的请求率先发出。这样就可以在一定程度上解决用户的等待问题。可惜这个方法还是无法突破两个连接的限制。于是第二种做法,我们就要设法突破两个连接的限制了。如果能够向别的域名发出AJAX请求,不也就能避免重要的请求被大量的请求所阻塞了吗?   我们还是从头看起,一点一点地来解决这个问题。 传统的跨域名异步请求解决方案   AJAX安全性的唯一保证,似乎就是对于跨域名(Cross-Domain)AJAX请求的限制。除非打开本地硬盘的网页,或者在IE中将跨域名传输数据的限制打开,否则向其他域名发出AJAX请求都会被禁止。而且对于跨域名的判断非常严格,不同的子域名,或者相同域名的不同端口,都会被认作是不同的域名,我们不能向它们的资源发出AJAX请求。   从表面上看起来似乎没有办法打破这个限制,还好我们有个救星,那就是iframe!   iframe虽然不在标准中出现,但是由于它实在有用,FireFox也“不得不”对它进行了支持(类似的还有innerHTML)。网上已经有一些跨域名发出异步请求的做法,但是它们实在做的不好。它们的简单工作原理如下:在另一个域名下放置一个特定的页面文件作为Proxy,主页面将异步请求的信息通过Query String传递入iframe里的Proxy页面,Proxy页面在AJAX请求执行完毕后将结果放在自己location的hash中,而主页面会对iframe的src的hash值进行轮询,一旦发现它出现了改变,则通过hash值得到需要的信息。   这个方法的实现比较复杂,而且功能有限。在IE和FireFox中,对于URL的长度大约可以支持2000个左右的字符。对于普通的需求它可能已经足够了,可惜如果真要传递大量的数据,这就远远不够了。与我们一会儿要提出的解决方案相比,可能它唯一的优势就是能够跨任意域名进行异步请求,而我们的解决方案只能突破子域名的限制。   那么现在来看看我们的做法!   优雅地突破子域名的限制   我们突破子域名限制的关键还是在于iframe。   iframe是的好东西,我们能够跨过子域名来访问iframe里的页面对象,例如window和DOM结构,包括调用JavaScript(通过window对象)——我们将内外页面的document.domain设为相同就可以了。然后在不同子域名的页面发起不同的请求,把结果通过JavaScript进行传递即可。唯一需要的也仅仅是一个简单的静态页面作为Proxy而已。   我们现在就来开始编写一个原形,虽然简单,但是可以说明问题。   首先,我们先来编写一个静态页面,作为放在iframe里的Proxy,如下:   Copy code<html xmlns="http://www.w3.org/1999/xhtml" ><head>  <title>Untitled Page</title>  <script type="text/javascript" language="javascript">    document.domain = "test.com";        function sendRequest(method, url)    {        var request = new XMLHttpRequest();        request.open(method, url);        request.send(null);    }  </script></head><body> </body></html>   然后我们再编写我们的主页面: Copy code <html xmlns="http://www.w3.org/1999/xhtml" ><head runat="server">  <title>Untitled Page</title>  <script type="text/javascript" language="javascript">    document.domain = "test.com";      function simpleRequest()    {        var request = new XMLHttpRequest();        request.open("POST", "Script.ashx");        request.send(null);    }        function crossSubDomainRequest()    {        var proxy = document.getElementById("iframeProxy").contentWindow;        proxy.sendRequest('POST', 'http://sub0.test.com/Script.ashx');    }        […]

龙生   24 Apr 2010
View Details

asp函数详解

Array()  FUNCTION: 返回一个数组  SYNTAX: Array(list)  ARGUMENTS: 字符,数字均可  EXAMPLE: <%  Dim myArray()  For i = 1 to 7  Redim Preserve myArray(i)  myArray(i) = WeekdayName(i)  Next  %>  RESULT: 建立了一个包含7个元素的数组myArray  myArray("Sunday","Monday", … … "Saturday") CInt()  FUNCTION: 将一个表达式转化为数字类型  SYNTAX: CInt(expression)  ARGUMENTS: 任何有效的字符均可  EXAMPLE: <%  f = "234"  response.write cINT(f) + 2  %>  RESULT: 236  转化字符"234"为数字"234",如果字符串为空,则返回0值 CreateObject()  FUNCTION: 建立和返回一个已注册的ACTIVEX组件的实例。  SYNTAX: CreateObject(objName)  ARGUMENTS: objName 是任何一个有效、已注册的ACTIVEX组件的名字.  EXAMPLE: <%  Set con = Server.CreateObject("ADODB.Connection")  %>  RESULT: CStr()  FUNCTION: 转化一个表达式为字符串.  SYNTAX: CStr(expression)  ARGUMENTS: expression 是任何有效的表达式。  EXAMPLE: <%  s = 3 + 2  response.write "The result is: " & cStr(s)  %>  RESULT: 转化数字“5”为字符“5”。 Date()  FUNCTION: 返回当前系统日期.  SYNTAX: Date()  ARGUMENTS: None.  EXAMPLE: <%=Date%>  RESULT: 8/4/99 DateAdd()  FUNCTION: 返回一个被改变了的日期。  SYNTAX: DateAdd(timeinterval,number,date)  ARGUMENTS: timeinterval is the time interval to add; number is amount of time intervals to add; and date is the starting date.  EXAMPLE: <%  currentDate = […]

龙生   24 Apr 2010
View Details

asp汉字转化为拼音

很多问题都是因为中文问题造成的 如文件名最好别用中文 现在的解决方法一般是产生一个ID,将这个ID做文件名 网页上如果url带汉字也经常出错 现在的解决方法一般用urlencode编码 现在用了这个转化,就好多了 原理,使用Dictionary技术1.添加索引2.遍历词典 <%Set d = CreateObject("Scripting.Dictionary")d.add "a",-20319d.add "ai",-20317d.add "an",-20304d.add "ang",-20295d.add "ao",-20292d.add "ba",-20283d.add "bai",-20265d.add "ban",-20257d.add "bang",-20242d.add "bao",-20230d.add "bei",-20051d.add "ben",-20036d.add "beng",-20032d.add "bi",-20026d.add "bian",-20002d.add "biao",-19990d.add "bie",-19986d.add "bin",-19982d.add "bing",-19976d.add "bo",-19805d.add "bu",-19784d.add "ca",-19775d.add "cai",-19774d.add "can",-19763d.add "cang",-19756d.add "cao",-19751d.add "ce",-19746d.add "ceng",-19741d.add "cha",-19739d.add "chai",-19728d.add "chan",-19725d.add "chang",-19715d.add "chao",-19540d.add "che",-19531d.add "chen",-19525d.add "cheng",-19515d.add "chi",-19500d.add "chong",-19484d.add "chou",-19479d.add "chu",-19467d.add "chuai",-19289d.add "chuan",-19288d.add "chuang",-19281d.add "chui",-19275d.add "chun",-19270d.add "chuo",-19263d.add "ci",-19261d.add "cong",-19249d.add "cou",-19243d.add "cu",-19242d.add "cuan",-19238d.add "cui",-19235d.add "cun",-19227d.add "cuo",-19224d.add "da",-19218d.add "dai",-19212d.add "dan",-19038d.add "dang",-19023d.add "dao",-19018d.add "de",-19006d.add "deng",-19003d.add "di",-18996d.add "dian",-18977d.add "diao",-18961d.add "die",-18952d.add "ding",-18783d.add "diu",-18774d.add "dong",-18773d.add "dou",-18763d.add "du",-18756d.add "duan",-18741d.add "dui",-18735d.add "dun",-18731d.add "duo",-18722d.add "e",-18710d.add "en",-18697d.add "er",-18696d.add […]

龙生   24 Apr 2010
View Details

asp中数组用法

A 定义数组 有两种方式:DIM和REDIM。 DIM定义的是固定个数、数据类型的数组;而REDIM则不同,它可以定义不同类型的数据,也可以定义个数并非固定的数据。比较下面几个例子。 都合法的例子: 程序代码 Dim myarray(5,2) Redim myarray(5,2) 前者错误而后者合法的例子: n=10 n=10 Dim myarray(n) Redim myarray(n,2)另外REDIM还可以定义未定类型的数组,如:Redim myarray(10)   B 数组个数 在以DIM或REDIM定义数组时指定的下标,表示的是访问该数组时所容许的最大下标,却不是该数组的个数。实际上,一维数组个数总是等于(最大下标+1),访问时是通过下标从0开始逐个访问的。 比如:Dim myarray(5) 定义的数组元素有6个,分别是:myarray(0)、myarray(1)、myarray(2)、myarray(3)、myarray(4)、myarray(5)。 再如:Redim thisarray(2,5)实际上定义了一个(2+1)*(5+1)=1 8的二维数组。 既然如此,那么,可不可义定义一个只有一个元素的数组呢?答案是:不可以。 如前所说,Redim thisarray(1)定义的数组实际上有(1+1)个数组元素,但类似于: Redim thisarray(0)的语法,错误的。所以,不能定义一个只有一个数组元素的数组。 其实,以上说的只是其默认状况。其实,定义数组可以通过定义下标的起止从而达到定义数组的个数甚至下标的起止编号的。比如:Redim thisarray(1980 to1990)就 定义了一个含有11个元素的数组,下标从1980到1990。   C 关于UBOUND函数 UBOUND返回的是一维数组的最大下标,而不是元素个数。 比如:Dim Myarray(5),那么UBOUND(Myarray)返回的值是5,而不是6。 UBOUND也可以应用于二维数组。应用于二维数组时,它返回的是第一个下标的最大值。 比如:Dim Myarray(6,3), 那么UBOUND(Myarray)返回的值是6,而不是7,更不是18(6*3=18)。 若要返回第二个下标的最大值,则使用:UBOUND(Myarray,2)。 与UBOUND相对应的是另外一个函数:LBOUND,它返回数组的最小下标。与UBOUND类似,LBOUND(Myarray,2)则返回数组MYARRAY的第二个下标的最小值。所以,准确地说,一维数组Myarray的元素个数为:UBOUND(Myarray)-LBOUND(Myarray)+1,而二维数组的元素个数则为: (UBOUND(Myarray)-LBOUND(Myarray)+1)*(UBOUND(Myarray,2)-LBOUND(Myarray,2)+1) 多维数组依此类推。 数组的定义 程序代码 Dim MyArrayMyArray = Array(1,5,123,12,98)   可扩展数组 程序代码 Dim MyArray()for i = 0 to 10ReDim Preserve MyArray(i)MyArray(i)=inext   将一个字符串分割并返回分割结果的数组 程序代码 Dim MyArrayMyArray = Split(tempcnt,chr(13)&chr(10))For I = Lbound(MyArray) to Ubound(MyArray)Response.Write MyArray(I) & "<br>"Next   数组排序函数 程序代码 Function […]

龙生   23 Apr 2010
View Details
1 402 403