我试图将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”,变量也不会在表单的输入字段中显示为值或文本。
我已经阅读并尝试了在stackoverflow上找到的各种解决方案但没有成功。
提前感谢您的帮助
修改
这是Example
答案 0 :(得分:5)
关闭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);
}
无需使用afterClose
或beforeClose
个事件。只需从链接点击事件中的iframe访问父函数setSelectedUser
,如下所示:
$(document).ready(function() {
$('a.insert_single').click(function() {
parent.setSelectedUser($(this).text());
parent.$.fancybox.close();
});
});
答案 1 :(得分:3)
一些澄清:
.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>STACKOVERFLOW</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