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("hell 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作用域,跨域?可惜搜搜,查到的域都不足以匹配这里的域的意思。找不到解释,很是惶恐,盼‘真心人’出来释疑解惑。
    

     今天在把一个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

  1. hell world
  2. how are you
  3. 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和对象容易混淆这个章节:

posted on 2010-07-09 19:35  arg  阅读(593)  评论(4编辑  收藏  举报

导航