【问题标题】:Why are myarray instanceof Array and myarray.constructor === Array both false when myarray is in a frame?当 myarray 在框架中时,为什么 myarray instanceof Array 和 myarray.constructor === Array 都为假?
【发布时间】:2011-06-24 20:13:08
【问题描述】:

所以下面的代码会两次提示 false:

window.onload = function(){
                    alert(window.myframe.myarray instanceof Array);
                    alert(window.myframe.myarray.constructor === Array);
                }

当页面中有一个名为“myframe”的 iframe 包含一个名为“myarray”的数组时。如果数组被移动到主页中(而不是 iframe),那么代码会像预期的那样两次提醒 true。有谁知道这是为什么?

【问题讨论】:

  • window.myframe.myarray 打印什么?我以为你需要它是 window.myframe.document.myarray
  • window.myframename.myarray 在 Chrome 和 FF 中运行良好...... document.getElementById('myframeid').contentWindow.myarray 也适用......你的建议似乎不起作用...
  • 错误我的意思是 window.myframe.contentWindow.document.myarray
  • 嗯,这也不起作用...我认为如果您尝试访问 DOM 节点而不是 JavaScript 变量/对象,您会使用现有的?

标签: javascript


【解决方案1】:
function isArray(o) {
  return Object.prototype.toString.call(o) === '[object Array]';
}

详细解释 here 关于为什么 .constructor 会因帧而失败。

在多帧 DOM 环境中编写脚本时会出现问题。简而言之,在一个 iframe 中创建的 Array 对象不与在另一个 iframe 中创建的数组共享 [[Prototype]]。它们的构造函数是不同的对象,因此 instanceof 和构造函数检查都失败了:

【讨论】:

  • 这正是问题所在。
  • 仍然有可能你不得不退回到鸭子打字因为库可以轻松地重载 toString (比如如果你加载 shumway: Object.prototype.toString.call([1,2,3]) === '1,2,3'
【解决方案2】:

这两个窗口各自创建自己的全局脚本环境。

其中一个的 Array 构造函数与另一个不同。

var win2=window.myframe;
alert(win2.myarray instanceof win2.Array); returns true

【讨论】:

    猜你喜欢
    • 2020-03-23
    • 2023-03-16
    • 2020-04-05
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 2012-07-06
    • 1970-01-01
    相关资源
    最近更新 更多