You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

同域下如何通过点击iframe内button刷新父页面result div(jQuery)

解决同域iframe点击刷新父页面元素的问题

这个问题其实是iframe跨上下文访问的典型场景,咱们一步步来搞定它:

为什么你的原有代码无效?

你之前写的$(".result").load(...)是在iframe的上下文里执行的,这里的$指向的是iframe页面的jQuery,所以它只会去查找iframe内部的.result元素,自然没法操作父页面的内容啦。

最简单的解决方案(依赖父页面的jQuery)

因为是同域,浏览器允许iframe直接访问父窗口的对象,咱们只需要明确指定用父页面的jQuery上下文来选择元素就行:

在iframe的脚本里写:

$(document).ready(function() {
  $('.button').click(function() {
    // 用parent.$获取父页面的jQuery对象,再操作父页面的.result元素
    parent.$(".result").load("main.php .result");
  });
});
  • parent是浏览器提供的原生对象,指向父窗口的window,同域下可以直接访问
  • main.php .result里的后缀是jQuery load方法的筛选器,会自动加载main.php页面中所有.result元素的内容,替换掉父页面当前的.result元素

不依赖父页面jQuery的方案(原生JS+iframe内的jQuery)

如果父页面没引入jQuery,也可以用原生JS先获取父页面的元素,再通过AJAX获取内容替换:

$(document).ready(function() {
  $('.button').click(function() {
    // 用原生JS获取父页面的所有.result元素
    const parentResultElements = parent.document.querySelectorAll(".result");
    
    // AJAX请求父页面内容
    $.get("main.php", function(pageContent) {
      // 从返回的页面中提取新的.result元素
      const newResultContents = $(pageContent).find(".result");
      
      // 逐个替换父页面的元素内容
      parentResultElements.forEach((el, index) => {
        $(el).html(newResultContents.eq(index).html());
      });
    });
  });
});

额外注意事项

  • 一定要确保父页面和iframe是完全同域的(协议、域名、端口都必须一致),不然浏览器的同源策略会阻止跨上下文访问
  • 如果你的.button是动态生成的(比如后期通过JS添加的),建议用事件委托来绑定点击事件,避免绑定失效:
    $(document).on('click', '.button', function() {
      parent.$(".result").load("main.php .result");
    });
    

内容的提问来源于stack exchange,提问作者Pepe

火山引擎 最新活动