js 的数组怎么push一个对象....

阿狸Ahri 2015-03-10 04:53:20
我在js push了一个对象,但是在下一个方法的时候 这个对象就空了。怎么回事。

模型:
类似于一个主页面下面有多个iframe的结构。我的是一个主页面,里面有若干个div,每个DIV视为一个页面。多个页面共存,当一个页面显示的时候,其他页面隐藏。

问题:

我在主页面上面定义一个变量,一个用来测试对比的

var fnCallBack = [];
var fnn=[];


然后在js文件书写 打开,关闭页面的方法

//打开页面,isLeave是否保留,true不保留,false保留, 默认保留
openWeb: function (ob, url, isLeave, _fn) {
//上面部分代码忽略
ob.href = pUrl;
var obj = { fn: _fn, param: "", pID: $($(ob).closest("div[data-role='page']")).attr("id") };//定义了一个对象
top.window.fnn.push("111111"); //用来测试的
top.window.fnCallBack.push(obj);//把这个对象push到数组了
return true;
},
backWeb: function (ob,res) {
$(ob).attr("data-rel", "back");
top.window.fnn.push("22222"); //当调试到这里的时候,发现22222是可以被 push到fnn里面去的
top.window.fnCallBack[top.window.fnCallBack.length - 1].param=res;//但是这个fnCallBack数组直接变成空了
return true;
},

为什么会有这种情况,为什么单独Push一个数,或者函数 在backWeb都能读到,但是push一个对象直接就无效了

下面是调试的截图
在openWeb的截图


在backWeb的截图


为什么两个测试有不同的结果
...全文
15333 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
shoppingli 2015-03-11
  • 打赏
  • 举报
回复
只针对你这个代码解析: backWeb: function (ob,res) { $(ob).attr("data-rel", "back"); top.window.fnn.push("22222"); //当调试到这里的时候,发现22222是可以被 push到fnn里面去的 top.window.fnCallBack[top.window.fnCallBack.length - 1].param=res;//但是这个fnCallBack数组直接变成空了 return true; }, top.window.fnCallBack这个数组是有正确的,用push这个方法也是可行,为何出现LZ所说的第二种直接变空是因为LZ写错了,top.window.fnCallBack.length-1这个有问题,如果数组开始没有数据,top.window.fnCallBack.length-1=-1,你这是如何叫数组付值。修改成top.window.fnCallBack[top.window.fnCallBack.length].param=res这样,应该就能正确添加数组了
xuzuning 2015-03-11
  • 打赏
  • 举报
回复
你需要的是这样的吗?
<script>
var st = [];
</script>
<iframe src=test_sub.htm name=na1></iframe>
<iframe src=test_sub.htm name=na2></iframe>
<iframe src=test_sub.htm name=na3></iframe>
test_sub.htm
<script src=scripts/json2.js></script>
<script>
function foo(na) {
  for(var i=0; i<parent.st.length; i++) {
    if(parent.st[i].name == self.name) {
      parent.st[i].value = document.getElementById([na]).value;
      return;
    }
  }
  parent.st.push({name : self.name, value : document.getElementById([na]).value });
}
function see() {
  alert(JSON.stringify(parent.st));
}
</script>
<input type=text id=t>
<input type=button value=修改 onclick=foo('t')>
<input type=button value=查看 onclick=see()>
虽然是按我的思路写的,与你给出的代码稍有不同。但并没有质的区别 估计是你的其他代码影响了效果
functionsub 2015-03-11
  • 打赏
  • 举报
回复
你是有其他操作重新操作过那个数组了吧? 你把代码改下,把对象push到fnn这个测试数组里看看。
qq840727854 2015-03-11
  • 打赏
  • 举报
回复
我试着 运行你的 代码 好像 是可以的~
阿狸Ahri 2015-03-11
  • 打赏
  • 举报
回复
引用 1 楼 hookee 的回复:
top.window.fnCallBack.push( { fn:.... } ); 直接push对象试试看
要是分别定义三个变量数组,一个个push 根本没有问题
阿狸Ahri 2015-03-11
  • 打赏
  • 举报
回复
引用 1 楼 hookee 的回复:
top.window.fnCallBack.push( { fn:.... } ); 直接push对象试试看
也不行啊,我想问我 写法应该没什么问题吧,怎么会成这样子的
hookee 2015-03-11
  • 打赏
  • 举报
回复
top.window.fnCallBack.push( { fn:.... } ); 直接push对象试试看
阿狸Ahri 2015-03-11
  • 打赏
  • 举报
回复
好吧,无语了,今天早上我知道了。那个fnCallBack这个变量名称是我从另一个项目拷贝的, 这就是随便的一个变量命名,我觉得好,我又想不到其他单词,就用了。 唉,找了老半天,在一个用户控件上面有的ready方法里面有个 fnCallBack.length=0,我那个页面正好用了这个控件,结果直接清空了。 那时候我想老半天,打开一个页面进来的时候都有值,我既没有进行其他操作,也没有刷新页面,好端端的,到下一个方法就没了。

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧