将值/变量从 fancybox iframe 传递给父级

Posted

技术标签:

【中文标题】将值/变量从 fancybox iframe 传递给父级【英文标题】:pass value/variable from fancybox iframe to parent 【发布时间】:2014-07-04 03:25:21 【问题描述】:

我正在尝试将来自 fancybox iframe 的变量/值传递给父窗口,但没有成功。

Fancybox 是通过

的链接启动的
   class="fancybox fancybox.iframe"

我在 fancybox.iframe 中的代码是:

$(document).ready(function()
   $('.insert_single').click(function()
    var test =  $('.members_body').find('row.U_USERNAME');
    setTimeout(function() parent.$.fancybox.close();,300);return true;

   );
);

其中“row.U_USERNAME”是要在 iframe 中找到的用户名。

然后,在父级中有以下代码:

 $(document).ready(function()
 $('.fancybox').fancybox(

  
openEffect:'fade',
openSpeed:500,


    afterClose: function()
    alert($(".fancybox-iframe").contents().find(test)); 
    $('#form input[name=username]').val()(test);return false;
    
                   

  );
 );

但是当fancybox关闭时,变量“test”没有出现警告,变量也没有在表单的输入字段中显示为值或文本。

我已阅读并尝试了在 *** 上找到的各种解决方案,但均未成功。

提前感谢您的帮助

编辑

这是Example

【问题讨论】:

【参考方案1】:

fancybox 关闭时,iframe 将从文档中删除。所以你必须使用beforeClose事件而不是afterClose

$(document).ready(function() 
    $('a.fancybox').fancybox(
        openEffect:'fade',
        openSpeed:500,
        beforeClose: function() 
            // working
            var $iframe = $('.fancybox-iframe');
            alert($('input', $iframe.contents()).val());
        ,
        afterClose: function() 
            // not working
            var $iframe = $('.fancybox-iframe');
            alert($('input', $iframe.contents()).val());
        
    );
);

JSFiddle:http://jsfiddle.net/NXY7Y/1/

编辑:

我编辑了你的 jsfiddle (http://jsfiddle.net/NXY7Y/9/)。更新在此链接中 http://jsfiddle.net/NXY7Y/13/

主页 javscript:

$(document).ready(function() 
    $('a.fancybox').fancybox(
        openEffect:'fade',
        openSpeed:500//,
        //beforeClose: function() 
        //    // working
        //    var $iframe = $('.fancybox-iframe');
        //    alert($('input', $iframe.contents()).val());
        //,
        //afterClose: function() 
        //    // not working
        //    var $iframe = $('.fancybox-iframe');
        //    alert($('input', $iframe.contents()).val());
        //
    );
);

function setSelectedUser(userText) 
    $('#username').val(userText);

无需使用afterClosebeforeClose 事件。只需从 iframe on link click 事件访问父函数setSelectedUser,如下所示:

$(document).ready(function() 
    $('a.insert_single').click(function() 
        parent.setSelectedUser($(this).text());
        parent.$.fancybox.close();
    );
);

【讨论】:

('row.U_USERNAME') 不是 iframe 中的输入字段。当点击 iframe 中用户名旁边的链接时,我会得到这个用户名 ($('.insert_single').click(function())。然后我想将此用户名作为值放入父窗口中的文本字段中。 我只是举了一个例子,说明如何访问 iframe 中的任何元素以及何时/何地必须这样做 (beforeClose)。用您的选择器替换选择器“输入”... 作为警报消息,我收到object Object。我在beforeClose 函数中的代码是:` var $iframe = $('.fancybox-iframe');alert($('.insert_single', $iframe.contents()));` 这是问题1。第二个问题是:如何在文本字段中获取用户名。这是FIDDLE 抱歉,我忘记将类添加到链接中。更新的小提琴是http://jsfiddle.net/NXY7Y/9/ +1 - 我发布了一个替代解决方案,没有在子页面中设置任何 jQuery。【参考方案2】:

一些说明:

您应该使用.find() 通过选择器查找元素(您正在尝试查找变量.find(test),它不是有效格式)。 您应该使用.val() 获取input 字段的内容或使用.val(new_value) 设置input 字段的内容 您应该使用.html().text() 来获取除input 之外的任何元素的内容,

例子:有这个html代码

<p class="test">hola</p>

...还有这个 jQuery 代码

var temp = $(".test").html();

...temp 将返回 hola

另一方面,如果您可以控制 iframed 页面并且它与父页面在同一个域下,那么您可能不需要在子页面中设置任何 jQuery。

所以,例如,在子(iframed)页面中有这个 html

<div class="members_body">
    <p>GOOGLE</p>
    <p>JSFIDDLE</p>
    <p>***</p>
</div>

您可以在父页面中设置此 jQuery 以获取子页面中任何单击元素的内容:

var _tmpvar; // the var to use through the callbacks
jQuery(document).ready(function ($) 
    $(".fancybox").fancybox(
        type: "iframe",
        afterShow: function () 
            var $iframe = $('.fancybox-iframe');
            $iframe.contents().find(".members_body p").each(function (i) 
                $(this).on("click", function () 
                    _tmpvar = $('.members_body p:eq(' + i + ')', $iframe.contents()).html();
                    $.fancybox.close();
                ); // on click
            ); // each
        ,
        afterClose: function () 
            $('#form input[name=username]').val(_tmpvar);
        
    );
); // ready

请注意,我们在全局范围内声明了 var _tmpvar,以便我们可以在不同的回调中使用它。

JSFIDDLE

【讨论】:

不错的一个。我喜欢在afterClose 上设置输入文本的效果。 +1

以上是关于将值/变量从 fancybox iframe 传递给父级的主要内容,如果未能解决你的问题,请参考以下文章

从窗口将值传递给 iframe

Fancybox 2 从代码打开 Iframe 版本

FancyBox 从 iframe 中关闭并将父页面带到链接

如何在 fancybox iframe 中显示 ajax 响应

从 iframe 调用父级中的 Fancybox

从 Iframe 调用父级中的 Fancybox,无需手动打开