Javascript窗口对象

tes*_*dtv 12 html javascript iframe dom window

在Javascript中,假设我们有一个main.html包含<iframe>(iframe.html)的主页面()

现在在这里iframe.html,如果我们需要在主页面上引用某些内容(main.html),我们不能只指定window而不是parent.window

如果答案是我们需要编写的parent.window,我想知道window主页中的所有iframe都没有单一的对象引用.

虽然我明白document是针对个别iframe的,但window应该是所有人共同的......不是吗......请帮助我理解这个概念......

还有什么东西window.parent吗?如果是的话,它与它有什么不同parent.window

T.J*_*der 12

iframes(和frames)是他们自己的窗口,即使在iframes 的情况下,他们看起来像是主文档窗口的一部分.所以,是的,要引用主文档的窗口,他们会使用parent(或者window.parent如果你想要冗长,但要清楚),因为它们是单独的对象.这是部分必要的,因为很多东西document最终都作为包含的属性window.

如果你仔细想想,那就有意义了:a的目的iframe是在页面中嵌入独立的内容.如果主页面和它上面的iframe(s)共享一个window对象,它们将共享全局上下文,并且很可能彼此冲突.

无偿的现场例子:

家长的HTML:

<p>I'm the parent window</p>
<iframe width="500" height="500" src="http://jsbin.com/iyogir"></iframe>
Run Code Online (Sandbox Code Playgroud)

家长的JavaScript:

function foo() {
  display("<code>foo</code> called!");
}
function display(msg) {
  var p = document.createElement('p');
  p.innerHTML = msg;
  document.body.appendChild(p);
}
Run Code Online (Sandbox Code Playgroud)

孩子的HTML:

<p>I'm in the frame</p>
<input type='button' id='theButton' value='Click Me'>
Run Code Online (Sandbox Code Playgroud)

孩子的JavaScript:

window.onload = function() {

  document.getElementById('theButton').onclick = function() {
    var p = window.parent;
    if (!p) {
      display("Can't find parent window");
    }
    else if (typeof p.foo !== "function") {
      display("Found parent window, but can't find <code>foo</code> function on it");
    }
    else {
      display("Calling parent window's <code>foo</code> function.");
      p.foo();
    }
  };

  function display(msg) {
    var p = document.createElement('p');
    p.innerHTML = msg;
    document.body.appendChild(p);
  }

};
Run Code Online (Sandbox Code Playgroud)


Fré*_*idi 9

这个概念与以下window内容相关document:window每个document,document每个一个window.

这意味着<iframe>元素,它们有自己的document,也有自己的window,就像一个弹出窗口或主导航窗口.

因此,您确实必须使用window.parent访问<iframe>元素的容器,就像您必须window.opener用来访问弹出窗口的所有者一样.

编辑:这两个window.parentparent.window是返回同一个对象有效表达式.这是因为window对象是脚本中的默认上下文(非限定名称被解析为成员window),而window对象具有window引用自身的属性.

因此,parent.window被评估为window.parent.window,与其相同的对象window.parent.

也就是说,我更喜欢使用window.parent,以避免与额外属性访问相关的(最小)开销.

  • @Sime:我觉得你忘记了那里的"自我";) (4认同)
  • @hmthr我推荐`window.window.parent.window.window` ...`:)` (2认同)