【问题标题】:Access elements of parent window from iframe从 iframe 访问父窗口的元素
【发布时间】:2011-10-25 01:29:43
【问题描述】:

我有一个页面,我们可以调用parent.php。在此页面中,我有一个带有提交表单的iframe,在此之外,我有一个 id 为“target”的 div。是否可以在 iframe 中提交表单并在成功时刷新目标 div。说加载一个新页面或其他什么?

编辑: 目标 div 在父页面中,所以我的问题基本上是您是否可以在 iframe 之外对父页面进行 jQuery 调用。那会是什么样子?

编辑 2: 所以这就是我的 jquery 代码现在的样子。它位于 iframe 页面中。 div #target 在 parent.php 中

$(;"form[name=my_form]").submit(function(e){     
 e.preventDefault; 
 window.parent.document.getElementById('#target'); 
 $("#target").load("mypage.php", function() { 
 $('form[name=my_form]').submit(); 
 }); 
 })

我不知道脚本是否处于活动状态,因为表单提交成功但目标没有任何反应。

编辑 3:

现在我正在尝试从 iframe 中的链接调用父页面。那里也没有成功:

<a href="javascript:window.parent.getElementById('#target').load('mypage.php');">Link</a>

【问题讨论】:

  • 目标div在父页面还是iframe中?
  • 它在父页面中,所以我的问题基本上是您是否可以例如在 iframe 之外对父页面进行 jquery 调用。

标签: javascript jquery ajax iframe


【解决方案1】:

我认为问题可能是您没有找到您的元素,因为您调用中的“#”来获取它:

window.parent.document.getElementById('#target'); 

如果你使用 jquery,你只需要#。应该是这里:

window.parent.document.getElementById('target'); 

【讨论】:

  • 如果网站容器和 iframe 位于不同的域怎么办?
  • @Michelem 我认为你不走运;为了让您能够访问父级,iframe 需要具有与父级相同的协议和域。这是防止跨域脚本的保护措施。
  • @Michelem:如果 iframe 和父级在不同的域上,与父级通信的唯一方法是使用 window.postMessage()。不过,这只有在您可以控制两端的情况下才有可能。此处的文档:developer.mozilla.org/en-US/docs/Web/API/Window/postMessage
  • @michelem 是否有任何示例如何访问 iframe 中的父元素?我们可以用 window.postMessage() 做一些事情,但是我们想要访问元素并在 iframe 中使用它呢?
  • 已经很晚了,但是这里的示例 window.postMessage() 基于 reactjs dev.to/damcosset/…
【解决方案2】:

您可以使用window.parent 从 iframe 中访问父窗口的元素,如下所示:

// using jquery    
window.parent.$("#element_id");

等同于:

// pure javascript
window.parent.document.getElementById("element_id");

如果你有多个嵌套的 iframe,并且你想访问最顶层的 iframe,那么你可以像这样使用window.top

// using jquery
window.top.$("#element_id");

等同于:

// pure javascript
window.top.document.getElementById("element_id");

【讨论】:

  • 请注意,使用 jQuery 与使用 getElementById 相同。可能会让新开发者感到困惑 ?
【解决方案3】:

在iframe里面有下面的js,用ajax提交表单。

$(function(){

   $("form").submit(e){
        e.preventDefault();

       //Use ajax to submit the form
       $.ajax({
          url: this.action,
          data: $(this).serialize(),
          success: function(){
             window.parent.$("#target").load("urlOfThePageToLoad");
          });
       });

   });

});

【讨论】:

  • 它可以通过ajax提交表单,但目标div从一开始就保持原样。从 iframe 中与 parent.php 进行通信似乎没有工作。
  • 如果 iframe 在同一个域中,那么您不会有任何问题。您可以尝试在成功处理程序中提醒window.parent.$("#target").length
  • iframe 在同一个域中。好吧,我把代码放在而不是 window.parent.$("#target").load("urlOfThePageToLoad");但它什么也没返回。它在您的代码中表示“表单”的位置,它应该是表单的名称吗?会这样吗?
  • 表格名称是什么?将form[name=nameOfYourform] 替换为form
  • 你想在修改后的问题中做什么?
【解决方案4】:

我认为您可以只使用 iframe 中的 window.parent。 window.parent 返回父页面的窗口对象,所以你可以这样做:

window.parent.document.getElementById('yourdiv');

然后对那个 div 做任何你想做的事情。

【讨论】:

  • 我是 jquery 新手,但我应该在 ifram 文件中添加这样的内容吗?
  • $(document).ready(function(){ window.parent.document.getElementById('#target'); $("#target").load("file.php"); });
  • 可能更像: $(document).ready(function() { $(window.parent.document.getElementById("target")).load("file.php")); });
  • 恐怕这不起作用。表单提交得很好,但目标 div 没有任何反应。它保持原样。嗯..
  • 可能需要阻止表单提交,直到您要从 iframe 运行的 javascript 完成提交。所以它会是这样的(对不起,如果下面的代码有错误,把它写在这样的代码块中很痛苦): $(;"form").submit(function(e){ e.preventDefault; window .parent.document.getElementById('#target'); $("#target").load("file.php", function() { $('form').submit(); }); })
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 2018-12-18
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
相关资源
最近更新 更多