2013-01-14 41 views
5

我想要做一个预览,它会出现在一个新的Fancybox iframe中。几周后,我正在寻找一些帮助或最佳做法,但我找不到它。Post preview - 通过AJAX和Fancybox传递数据

我的主要问题是将数据从表单(更新数据库之前)传递到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

要么AJAX或iframe ......尝试没有'数据的fancybox-type' – JFK

+0

好一天JFK,这是我再次。删除数据fancybox类型会导致“请求的内容无法加载,请稍后再试”错误。 – kacper

+0

'#postp'中有什么? ...有任何演示网站? – JFK

回答

16

正如我在我的评论中提到,你的预览按钮应该通过AJAX提交表单获得那个职位预览值(我们将使用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(随意浏览源代码)

+0

非常感谢!您的DEMO工作完美,这正是我所需要的。我正尝试在CMS中运行您的脚本。此时此刻点击链接没有任何反应,所以我认为其他一些剧本令人不安。稍后我会提供反馈意见,我认为它会起作用。再次感谢! :) – kacper

+0

@kacper http://meta.stackexchange.com/a/5235/173947以防万一;) – JFK

+0

我的声望太差,点击“up”,所以我只能点击“OK”:) – kacper

0

我试图用的fancybox的作品更有趣的方式,

在页面的fancybox

var myvar; 
$(document).ready(function(){ 
    myvar = parent.$("#formvariwant").val(); 
}); 
+0

感谢特蕾莎,我会在我的新项目中尝试这种方式:) – kacper

2

我不喜欢这个解决方案,所以我会发布我自己的调查。

为什么写代码1. .on("click", ... 2. e.preventDefault 3. $.ajax 4. this.href只是为了呼吁成功的fancybox,已经有all this functions inside

如果您决定AJAX,而不是使用iframe的(如在接受的答案),你可以简单地添加type属性fancybox()调用,因为它是beening检查,并通过所有其他

$('.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。Finnaly:

$('.preview2').fancybox({ 
    type: "ajax", 
    beforeLoad: function() { 
     this.ajax.data = $('#postp').serialize(); 
    } 
}); 

您可以删除所有data-* atrributes太

FIDDLE

KISS

+0

@JFK所以这是什么[http:/ /prntscr.com/5so2b0](http://prntscr.com/5so2b0)then – vladkras

+0

@JFK可能是你的'loginTest2.php'有问题?这里是[小提琴](http://jsfiddle.net/vladkras/5s2e73tq/),它确实有效。还要读一点关于[serialize()和serializeArray()的区别](http:// stackoverflow。com/a/10430571/1713660) – vladkras

+0

@JFK只要你删除了你的css,让我用css从CDN发布[updatedd小提琴](http://jsfiddle.net/vladkras/5s2e73tq/1/)。另外,我必须承认,当改变输入值时,序列化表单在fancybox中不能正常工作。它似乎在初始化状态下冻结 – vladkras