模态窗口对字符串参数的巨无聊限制

简介:



本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。   由于IE在对象及对象引用的回收上有不少的问题,我一般很忌讳在不同的窗口和Frame之间传递脚本对象。一般情况下我都是用简单类型来传递参数,比如数字和字符串。对于复杂对象先序列化字符串再在窗口和Frame之间传递,一直以来都挺好的,也没有什么遇到什么问题。


    前几天Tester Team发现一个非常诡异的bug,在模态窗口里的显示的一些数据,当数据量大了后就会出现不确定的错误。开始以为是程序逻辑上的问题,后来调试了半天,发现原来是Modal Dialog的一个特性搞出来的。对于showModalDialog,其参数列表为:

Syntax
    vReturnValue = window .showModalDialog( sURL [ , vArguments ] [ , sFeatures ] )

Parameters
sURL Required. String that specifies the URL of the document to load and display.
vArguments Optional. Variant that specifies the arguments to use when displaying the document. Use this parameter to pass a value of any type, including an array of values. The dialog box can extract the values passed by the caller from the dialogArguments property of the window object.

    MSDN的下面还有一个让人巨郁闷的remark:(
    The vArguments parameter can be referenced within the modal dialog box using the dialogArguments property of the window object. If the vArguments parameter is defined as a string, the maximum string length that can be passed to the modal dialog box is 4096 characters; longer strings are truncated.

    这下知道了,原来是字符串参数太长,被IE自动截断了 angry_smile.gif

    问题是清楚了,可是微软对模态窗口的这个限制是不是太无聊了点啊?不知道微软在搞什么飞机。

    解决这个问题,如果按MSDN说的,我们把vArguments弄成object或array就行了。那么对于参数传出和传入的地方都需要修改"接口"的代码,好麻烦的说。那么能不能让字符串参数突破vArguments的4096个字符的限制呢?

    其实对于一个字符串,只要我们把它包装(有点像C#的Boxing了)成string object,就可以不受vArguments长度的限制了,而且在Modal Dialog中处理字符串的接口函数不需要做任何的修改。比如我们要传递一个5001个字符的字符串,示例如下:
None.gif < button  onclick ="pop()" >pop </ button >
ExpandedBlockStart.gif ContractedBlock.gif < script  language ="javascript" > dot.gif
InBlock.gif
function  pop()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif {
InBlock.gif    
var  str  =  '';
InBlock.gif     for  (  var  i = 0  ; i  <   5000  ;  ++ i )
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif {
InBlock.gif        str 
+=  'a';
ExpandedSubBlockEnd.gif    }

InBlock.gif    
//  alert(str.length);
InBlock.gif
    window.showModalDialog('pop.htm',  new  String(str + 'b'));
ExpandedBlockEnd.gif}

None.gif
</ script >

    就这样使用一个简单的 new String(str+'b') 就完全突破限制了emteeth.gif

本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

目录
相关文章
|
5月前
|
前端开发 JavaScript 索引
前端切图仔,常用的21个字符串方法(上)
前端切图仔,常用的21个字符串方法(上)
57 1
|
5月前
|
前端开发 JavaScript 索引
前端切图仔,常用的21个字符串方法(下)
前端切图仔,常用的21个字符串方法(下)
74 0
|
1月前
春晚刘谦第二个魔术原理讲解
春晚刘谦第二个魔术原理讲解
30 2
|
4月前
|
缓存 网络协议 安全
你以为键入网址后只是等待吗?惊!原来网页显示背后隐藏着这些奇妙步骤(终章)
这篇文章简要介绍了计算机网络中交换机和路由器的工作原理,以及它们在网络通信和连接中的重要作用。交换机利用MAC地址表实现数据包的转发,而路由器则根据IP地址进行转发决策,将数据包从一个网络转发到另一个网络。通过交换机和路由器的协同工作,网络实现了高效的数据传输和通信。
|
10月前
|
Java 程序员 开发者
只用一行代码,你能玩出什么花样?
只用一行代码,你能玩出什么花样?
71 1
|
11月前
|
Python
字符串离奇消失之谜
字符串离奇消失之谜
61 0
|
11月前
|
Python
上古代码漫游记(二):把陷阱去掉了,反倒踩进了新的陷阱?
上古代码漫游记(二):把陷阱去掉了,反倒踩进了新的陷阱?
80 0
参数校验别再写满屏的 if/else 了,差点被劝退……(下)
参数校验别再写满屏的 if/else 了,差点被劝退……(下)
|
Java 数据库连接 Spring
参数校验别再写满屏的 if/else 了,差点被劝退……(上)
参数校验别再写满屏的 if/else 了,差点被劝退…(上)
参数校验别再写满屏的 if/else 了,差点被劝退……(上)
|
Python
又烧脑又炫技还没什么用,在代码里面打印自身
又烧脑又炫技还没什么用,在代码里面打印自身
159 0
又烧脑又炫技还没什么用,在代码里面打印自身