我正在尝试进行预览,这将出现在新的Fancybox iframe中。几个星期以来,我正在寻求一些帮助或最佳实践,但我找不到它。
我的主要问题是将数据从表单(更新数据库之前)传递到Fancybox窗口。我的AJAX技能很差,所以也许我的问题不是那么难。
请检查代码:
$('.preview2').fancybox({
fitToView : false,
width : 905,
height : 505,
autoSize : false,
closeClick : false,
openEffect : 'none',
closeEffect : 'none',
ajax: {
type: "POST",
cache : false,
url: "preview.php",
data: $('#postp').serialize()
}
});
还有一个电话链接:
<a class="preview2" data-fancybox-type="iframe" href="preview.php" id="preview2">Preview</a>
我几乎可以确定preview.php文件的一切正常,只需发布变量并将其打印在正确的位置。
有人可以查看Fancybox / AJAX部分吗?
答案 0 :(得分:18)
正如我在评论中提到的,您的预览按钮应该通过ajax提交表单以获取POST预览值(我们将使用ajax
代替iframe
)所以:
<a class="preview2" data-fancybox-type="ajax" href="preview.php" id="preview2">Preview</a>
然后您需要将预览按钮绑定到手动on("click")
方法以首先通过ajax
提交表单....然后将结果发布到fancybox中,如下所示:
$(document).ready(function () {
$('.preview2').on("click", function (e) {
e.preventDefault(); // avoids calling preview.php
$.ajax({
type: "POST",
cache: false,
url: this.href, // preview.php
data: $("#postp").serializeArray(), // all form fields
success: function (data) {
// on success, post (preview) returned data in fancybox
$.fancybox(data, {
// fancybox API options
fitToView: false,
width: 905,
height: 505,
autoSize: false,
closeClick: false,
openEffect: 'none',
closeEffect: 'none'
}); // fancybox
} // success
}); // ajax
}); // on
}); // ready
请参阅 DEMO (随意浏览源代码)
答案 1 :(得分:2)
我不喜欢这个解决方案,所以我会发布自己的调查。
为什么用1. .on("click", ...
编写代码2. e.preventDefault
3. $.ajax
4. this.href
只是为了成功调用fancybox,已经有all this functions inside ?
如果你决定使用ajax而不是iframe(就像在接受的答案中一样),你可以简单地将type
属性添加到fancybox()
来电,因为它已被检查,并传递所有其他< / p>
$('.preview2').fancybox({
type: "ajax",
ajax: {
data: $('#postp').serialize()
// url: "someurl.php" not needed here, it's taken from href
// if you need it, e.g. you have a button, not a link
// use "href" property that overrides everything
// not attribute, cause it's invalid
}
// href: "url_to_add_or_override_existing_one",
// all other effects
// afterLoad: function () { // other cool stuff }
});
编辑由于@JFK指出它还不够,每次点击链接时都必须获取表单数据,因此beforeLoad()
需要data
而不是{{} 1}}。 Finnaly:
$('.preview2').fancybox({
type: "ajax",
beforeLoad: function() {
this.ajax.data = $('#postp').serialize();
}
});
您也可以删除所有data-*
属性
<强> FIDDLE 强>
KISS
答案 2 :(得分:0)
我尝试了一种更有趣的方式,使用fancybox,
在fancybox页面
var myvar;
$(document).ready(function(){
myvar = parent.$("#formvariwant").val();
});