Fancybox (jQuery) - 将信息从父级传递到 iframe 并将 iframe 传递回父级

2024-02-15

我正在尝试在我的页面上打开一个 fancybox iframe。将一些基本信息传递给 iframe。然后我想让 iframe 与其父级对话。

我静态地传递 nameid-1 ,尽管我真的很想将其作为变量,例如:var nameid=$(this).attr('nameid')

我只是不知道如何正确执行这一切,因为我是 Ajax/Javascript 新手并且在逻辑上苦苦挣扎。

基础.html

JS:

<script type='text/javascript'>
//<![CDATA[   
// Popup Function
$(document).ready(function () {
    $('a.openinformation').fancybox({
        openEffect: 'fade',
        openSpeed: 500 //,
    });
});
// Update from iFrame
function setInformation(userText) {
    $('#displayfield-nameid-1').html(userText);
    $('#showhide-nameid-1').show();
}
//]]>
</script>

HTML:

<div>
    <a class="openinformation fancybox.iframe" href="iframe.html" nameid= "1" originalname="Mary Poppins"  >Mary Poppins</a>
</div>

<div id ="showhide-nameid-1" style=" display:none; background:#0CF;">
    <p>Replacement Name: <span id="displayfield-nameid-1"></span></p>
</div>

iframe.html

JS :

<script type='text/javascript'>
//<![CDATA[ 
// Start  
$(window).load(function () {
    // When Loaded  get going.
    $(document).ready(function () {
        $('a.doupdate').click(function () {
            parent.setInformation($(this).text());
            parent.$.fancybox.close();
        });
        $('a.closeremove').click(function () {
            parent.$('#showhide-nameid-1').hide();
            parent.$.fancybox.close();
        });
    });
});
//]]>
</script>

HTML

<p>The old name: $originalname;</p>
<p>The id for this column is: $nameid</p>

<p>Please select a new name:</p>
<div><a class="doupdate" href="#">Display new married  name :  Mary Smith</a></div>
<div><a class="doupdate" href="#">Display new married  name:  Sandy Shore</a></div>
<div><a class="closeremove" href="#" id="1">Clear (Hide)  married Names Box</a></div>

您的问题可以分为两部分:

  1. 如何将数据(存储在变量中)从父页面传递到 iframe(在 fancybox 中打开)
  2. 如何在 iframe 内操作数据(和/或将此类数据存储在变量中),然后在 fancybox 关闭时将这些值传递到父页面。

1)。将数据从父页面传递到(fancybox)iframe

我认为你最好的选择是将所有数据存储在一个 JavaScript 中object like :

var parentData = {};

...这样你就可以通过一个object到 iframe 而不是几个变量。然后您可以向其中添加不同的属性和值object like :

parentData.nameid       = "1";
parentData.originalname = "Mary Poppins";

...或更多(如果您需要的话)。

您可能仍然希望通过 (HTML5) 静态传递该信息data属性如:

<a data-nameid="1" data-originalname="Mary Poppins" href="iframe.html" class="openinformation">Mary Poppins</a>

...并推动data值转化为parentData object在花哨的盒子里beforeLoad回调如:

beforeLoad : function () {
    parentData.nameid       = $(this.element).data("nameid");
    parentData.originalname = $(this.element).data("originalname");
}

...恕我直言,这会给你带来更大的灵活性。

现在,您在 iframed 页面中唯一需要做的就是引用那些特性 as parent.parentData.nameid and parent.parentData.originalname任何您需要它们的时候,例如

有这个html(iframe.html)

<p>The old name: <span id="originalname"></span></p>
<p>The id for this column is: <span id="nameid"></span></p>

...您可以使用此脚本写入父级的值object like :

$("#nameid").text(parent.parentData.nameid);
$("#originalname").text(parent.parentData.originalname);

Notice你不能这样做(如在 php 中)

<p>The old name: $originalname;</p>

...所以我们用了<span>标签通过 javascript 编写其内容。


2)。将数据从 iframe 页面传递到父页面。

您需要做的第一件事是在父页面中声明object存储来自 iframe 的数据和处理它的函数,如下所示:

var iframeData = {};
function setInformation(data) {
    return iframeData = data;
};

然后在iframed页面中,可以写不同的内容特性/values to the iframeData object并运行setInformation()iframe 中的函数(在父页面中)将值传递给父页面,如下所示:

$(".doupdate").on("click", function (e) {
    e.preventDefault();
    iframeData.newname = $(this).find("span").text(); // set object property/value
    parent.setInformation(iframeData); // pass it to parent page
    parent.$.fancybox.close();
});

上面的代码假设你有一个类似的 html

<a class="doupdate" href="#">Display new married  name :  <span>Mary Smith</span></a>

... notice我把我想要传递的名字包裹在一个span标签。或者你可以将它分成 2spans like :

<span class="fname">Mary</span><span class="lname">Smith</span>

...并将它们写成单独的值,例如:

iframeData.fname = $(this).find("span.fname").text();
iframeData.lname = $(this).find("span.lname").text();

对于清除按钮,我只需重新初始化变量并关闭 fancybox,例如

$('a.closeremove').on("click", function (e) {
    e.preventDefault();
    iframeData = {}; // reset variable
    parent.setInformation(iframeData); // pass it to parent page
    parent.$.fancybox.close();
});

...并使用 fancybox afterClose 回调从父页面本身执行对父页面的操作,如下所示:

afterClose : function () {
    if ( objLength(iframeData) > 0 ) {
        $('#displayfield-nameid-1').html(iframeData.newname);
        $('#showhide-nameid-1').show();
    } else {
        $("#displayfield-nameid-1").empty();
        $('#showhide-nameid-1').hide();
    }
}

... notice我只会显示选择器#showhide-nameid-1 if the iframeData object的长度大于0。因此,我需要一个函数来验证object's length :

基于this https://stackoverflow.com/a/5533226/1055987回答,你可以这样做:

function objLength(iframeData) {
    // ref https://stackoverflow.com/a/5533226/1055987
    var count = 0, i;
    for (i in iframeData) {
        if (iframeData.hasOwnProperty(i)) {
            count++;
        }
    }
    return count;
};

...这将返回object's length.

最后的注释 :

由于 iframed 页面使用前缀引用父页面parent,如果在iframe之外打开会返回js错误。在尝试从父页面来回访问数据之前,您可能需要首先验证 iframe 页面是否确实包含在 iframe 内,如下所示:

if (window.self !== window.top) {
    // the page is inside an iframe
}

See DEMO http://www.picssel.com/playground/jquery/passVariablesIframe_18oct14.html并随意探索这两个页面的源代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fancybox (jQuery) - 将信息从父级传递到 iframe 并将 iframe 传递回父级 的相关文章

随机推荐

  • Java For-Each循环:排序顺序[重复]

    这个问题在这里已经有答案了 java for each 循环是否保证在列表上调用时元素将按顺序呈现 在我的测试中似乎确实如此 但我似乎找不到任何文档中明确提到的这一点 List
  • 为什么 NetBeans 找不到我的某些项目的 CopyLib?

    今天早上我遇到了一个棘手的问题 我花了几个小时试图追踪它 我继承了两个 NetBeans 项目的一些代码 A and B 他们都成功构建并运行 没有复杂的 Ant 构建任务 只是默认的 IDE 设置 这两个项目共享大量代码 因此我将其分解为
  • 如何从 Rails 模型中删除列?

    我需要从我已经创建的 Rails 模型中删除几列 并且该模型中有一些行条目 怎么做 任何包含修改 Rails 中架构的详细信息的链接吗 我正在使用 Rails 版本 3 要删除数据库列 您必须生成迁移 script rails g migr
  • Jquery:连接两个元素的值

    尝试在 Jquery 中实现一些目标有点卡住了 想知道是否有人可以提供帮助 我正在创建自己的就地编辑功能 您可以在其中单击编辑按钮 然后我的定义列表的内容将被交换为表单 预填充数据 如同this http 15daysofjquery co
  • 函数和 powershell 远程处理

    我有一个运行良好的脚本 但我想提高我的 powershell 知识 并想知道是否有更简单的方法来做到这一点 我的脚本的一部分连接到服务器并拉回服务器上的文件和大小列表并将其导出到 csv 我找到了一个函数 Exportcsv 它允许我使用早
  • 如何在 React js - JSX 中动态创建输入文本字段?

    我对 ReactJS 还很陌生 我遇到了一个场景 我必须创建 6 个彼此非常相似的输入字段 现在我的类渲染方法中有类似的东西 render return div p p div
  • 如何使“旧式”异步方法可等待

    如果我有一个带有回调的异步方法 MyMethodAsync
  • 如何从 jar 库创建 OSGi 包?

    如何从 jar 库创建 OSGi 包 如果您使用的是 eclipse 有一个向导 它允许您选择多个 jar 库并创建包含这些 jar 的插件项目 即 OSGi 包 你可以在这里找到它 File gt New gt Other gt Plug
  • 从 PL/SQL 调用/使用 JMS

    是否可以从 PL SQL 调用 使用 JAVA 消息服务 JMS 我知道我们可以从 pl SQL 调用 java 但是调用 java 与调用 JMS 队列或 JMS 主题不同 因为 JMS 依赖于 JNDI 资源命名 当我们使用基于 JND
  • Python 大量迭代失败

    我写的简单蒙特卡罗 计算 http math fullerton edu mathews n2003 montecarlopimod htmlPython 程序 使用多处理模块 它工作得很好 但是当我为每个工作人员传递 1E 10 次迭代时
  • Spring MVC ExceptionHandler 实现平静和正常

    我想处理正常请求和休息 ajax 请求的异常 这是我的代码 ControllerAdvice public class MyExceptionHandler ExceptionHandler Exception class public M
  • wampserver 主页仅从本地主机可见

    最近我用过WAMPserver 在Windows机器上搭建服务器环境 一切都很好 但我有一个小问题 每个人都可以访问wampserver主页 因此他们可以看到同一服务器上托管的其他网页 服务器文件系统等 网页的 URL 具有以下格式 hos
  • Android PlaceFilter 与 Google Places API 的使用

    我正在尝试使用 Google Places API 并且想将搜索过滤为仅健身房类型 我正在使用给出的代码https developers google com places https developers google com place
  • Mongoose 查询最近 24 小时内的文档,每小时仅查询一个文档

    我正在编写一个应用程序 其中有一些天气传感器每 5 分钟将空气温度和湿度发送到服务器 我想画一张图表来显示温度和湿度如何变化 即一夜之间 我的想法是根据过去 24 小时的数据绘制图表 我自己无法弄清楚 所以我想也许我可以在这里寻求帮助 当然
  • 如何使用操作和控制器名称获取 ActionDescriptor

    给定操作名称 控制器名称和 HTTP 动词 GET POST 等 是否可以检查该操作是否具有 即被修饰 特定的操作过滤器属性 请注意 操作和控制器不是当前操作和控制器 而是可以是应用程序中的任何操作和控制器 Thanks 我已经回答了我自己
  • mac下appium的安装目录

    我已经从 MAC 终端安装了 appium 1 5 1 安装没问题 但由于某种原因我需要安装它的路径 谁能告诉我安装目录在哪里 如果您安装了 GUI appium 应用程序 您可以在 Mac 的 Launchpad 中单击其图标的应用程序
  • 服务结构提醒

    文档 https learn microsoft com en us azure service fabric service fabric reliable actors timers reminders actor reminders
  • ASP.NET Core RC2 区域未发布

    所以我刚刚更新了我的应用程序以使用 ASP NET Core RC2 我使用 Visual Studio 发布了它 并注意到我的区域未发布 这张快照来自src MyProject bin Release PublishOutput 这是我的
  • python pdb:捕获异常后恢复代码执行?

    如果我运行代码ipython pdbmagic 启用并且代码抛出异常 有什么办法告诉代码之后继续执行吗 例如 假设例外是ValueError x 0 not allowed 我可以在 pdb 中设置x 1并允许代码继续 恢复 执行 我认为您
  • Fancybox (jQuery) - 将信息从父级传递到 iframe 并将 iframe 传递回父级

    我正在尝试在我的页面上打开一个 fancybox iframe 将一些基本信息传递给 iframe 然后我想让 iframe 与其父级对话 我静态地传递 nameid 1 尽管我真的很想将其作为变量 例如 var nameid this a