Array类型对象从ifram传到主页面,类型丢失
今天在把一个Array对象系列化成json对象时,最终的结果老是不对,跟下去,
发现jsonhelper(转化js对象为json字符串的帮助类)中有判断是否是Array的语
句if(o instanceof Array)。而定义的对象的这个属性,明明是Array,直接鼠标移上去查看,
外观都符合Array的表现(vs2008)。疑惑啊。补充一下,这里流程是这样的:iframe对应的页面实现一个
getValue方法获取这个页面中的值,主页面通过iframe.getValue()拿到js对象。然后,主页面把js对象转成json字符串。
耐心的跟,发现在getValue里面obj instanceof Array 还是true的,然后到了主页面后,obj instanceof Array
就成false,obj只是Object类型。难倒,Array对象,到了另个页面,类型就丢失,变成了基本的
Object。于是另建个测试web。关键代码如下 :
Main.aspx:
<head runat="server">
<title></title>
<script type="text/javascript" src="public.js">
</script>
<script type="text/javascript">
function showType() {
var val = frm1.getValue();
frm1.document.writeln("iframe frm1' return value should be Arrary type,length is" + val.length + "<br/");
frm1.document.writeln("show each item:<br/>");
frm1.document.writeln("<ol>");
for (var i = 0; i < val.length; i++) {
frm1.document.writeln("<li>" + val[i] + "</li>");
}
frm1.document.writeln("</ol>");
frm1.document.writeln("<br/>");
frm1.document.writeln("let us see it's type whether is Array use val instance of Array: ");
frm1.document.writeln(val instanceof Array);
frm1.document.writeln("<br/>");
var loaclArrObj = new Array();
frm1.document.writeln("let us see local Array type object use loaclArrObj instance of Array: ");
frm1.document.writeln(loaclArrObj instanceof Array);
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<iframe src="Default2.aspx" id="frm1" width="500px" height="400px"></iframe>
</div>
<div>
<input type="button" value="getType" onclick="showType()" /></div>
</form>
</body>
</html>
iframe.aspx:
<head runat="server">
<title></title>
<script type="text/javascript">
function getValue() {
var arr = new Array();
arr.push("hello world");
arr.push("how are you");
arr.push("i'm fine! thank you!");
return arr;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
英文很菜,刻意的逼自己锻炼,所以没用中文。 结果:
iframe frm1' return value should be Arrary type,length is3
- hell world
- how are you
- i'm fine! thank you!
let us see it's type whether is Array use val instance of Array: false
let us see local Array type object use loaclArrObj instance of Array: true
除了访问Array对象的类型有失真外,其他一切正常。而本页面定义的Array对象,百分百保真。然后在chrome,firefox下运行,同样的结果。这里。描述的都是现象,不知道怎么去更深一步去描叙。比如js作用域,跨域?可惜搜搜,查到的域都不足以匹配这里的域的意思。找不到解释,很是惶恐,盼‘真心人’出来释疑解惑。
如今时间到了20110724,在javascript精粹中看到同样的讨论以及解决办法。一下来自Arrya和对象容易混淆这个章节: