js的showModalDialog对字符串的限制

不知道,大家有没有遇到这样的奇葩问题,当时今天笔者很不幸,遇到这一奇葩的问题,就当使用window.showModalDialog("test.jsp",args,'dialogHeight=100px;dialogWidth=250px;');进行数据传输,当args的数据大于4096个字符时,多出来的数据会被自动截掉,从而导致数据的完整性丢失.

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给出了如下标识:
    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.

根据MSDN的说法,我们把args弄成object或array就行了,那么对于参数传出和传入的地方都需要修改"接口"的代码,这样一来未免就一些许麻烦。那么能不能让字符串参数突破args的4096个字符的限制呢?

其实对于一个字符串来说,只要我们把它包装成string object,就可以不再args长度的限制了,而且在Modal Dialog中处理字符串的接口函数不需要做任何的修改,如下代码:

function test(id){
	var _bpc;
	jQuery.ajax({
		url: 'test.html',
		data: {'id': id, 'name': name},
		type : "POST",
		async: false,
		cache : false,
		dataType : "json",
		success : function(data) {
			var result = json_parse(unescape(data));
			var selectHTML = [];
			if(result){
				if(result.length == 1){
					_bpc = {'id': result[0][0], 'name': result[0][1]};
				} else if(result.length > 1){
					selectHTML .push('<select name="">');
					for(var i = 0, le = result.length; i < le; i++){
						var item = result[i];
						selectHTML.push('<option id="bpc' + item[0] + '" value="' + item[0] + '">' + item[1] + '</option>');
					}
					selectHTML.push('</select>');
					alert(selectHTML.length);
					_obj = window.showModalDialog('index.html?'+'Math.random().toString()',selectHTML, 'dialogHeight=100px;dialogWidth=250px;');
					if(!_obj)  _obj = {'id': -1, 'name': ''};
				}
			}
		},
		error: function(e){
			alert('查询失败,请稍后再试!');
		}
	});
	return _obj;
}
数据接收页面:

<script type="text/javascript" language="javascript">
function finish(){
	var sel = document.getElementById('selDiv').firstChild;
	if(sel){
		var selectedItem = sel.options[sel.selectedIndex];
		window.returnValue = {'id': selectedItem.value, 'name': selectedItem.text};
	}
	window.close();
}
window.onload =function(){
	var args = window.dialogArguments;
	if(args != null){
		var bpcsArgs = args.join('');
		document.getElementById("selDiv").innerHTML = bpcsArgs;
		document.getElementById("selDiv").firstChild.focus();
	}
}
</script>
</head>
<body style="text-align: center;background: #ECE9D8; margin: 5px auto;" οnkeydοwn="if(event.keyCode==13)finish()">
	<table align="center">
		<tr align="left"><td>该档案存在于以下流水类型中</td></tr>
		<tr align="left"><td>请选择一个后点击确定</td></tr>
		<tr align="center"><td><div id="selDiv"></div></td></tr>
		<tr align="center"><td><input type="submit" value="确定" οnclick="finish()" />
			    <input type="button" value="取消" οnclick="window.close()" /></td></tr>
	</table>
</body>
</html>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值