【问题标题】:Post preview - Passing data with AJAX and Fancybox发布预览 - 使用 AJAX 和 Fancybox 传递数据
【发布时间】:2013-01-14 09:44:00
【问题描述】:

我正在尝试做一个帖子预览,它将出现在一个新的 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 部分吗?

【问题讨论】:

  • 是 ajax 或 iframe ...尝试不使用 data-fancybox-type
  • 晚安 JFK,又是我。删除 data-fancybox-type 会导致“无法加载请求的内容。请稍后再试”错误。
  • #postp 中有什么内容? ...有任何演示站点吗?
  • #postp 是表单的 ID。您认为演示站点对您有帮助吗?让其他人访问面​​板可能会出现问题,但如果需要,我可以尝试这样做;)
  • 请注意,为了“预览”表单,您必须(通过 ajax)提交它......这是您想要做的吗?如果是这样,恐怕您无论如何都需要转向手动方法。

标签: javascript jquery ajax forms fancybox


【解决方案1】:

正如我在 cmets 中提到的,您的预览按钮应通过 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(随意探索源代码)

【讨论】:

  • 非常感谢!您的 DEMO 完美运行,这正是我所需要的。我正在尝试在我的 CMS 中运行您的脚本。此时点击链接后没有任何反应,所以我认为其他一些脚本令人不安。稍后我会提供反馈,我认为它会起作用。再次感谢! :)
  • 我的名声太差了,不能点击“up”,所以我可以点击“OK”:)
  • 有效!问题是我的 preview.php 文件中的某些部分代码......但我发现了另一个问题 - 我只能打开一次预览文件(当然不刷新) - 在 Firebug 中的第二、第三等时间出现错误: TypeError: $.fancybox is not a function closeClick: false
  • @kacper 很可能您的 preview.php 还加载了一些 js 脚本或 jQuery 之后会产生冲突
  • @thumbtackthief : url 指的是一个文件(通常是一个 php 文件),它将预处理表单,在这种情况下,会将输入字段的值返回到 fancybox。在这里查看stackoverflow.com/a/16956120/1055987 以获取该 php 文件的示例....
【解决方案2】:

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

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

如果您决定使用 ajax 而不是 iframe(如在接受的答案中),您可以简单地将 type 属性添加到 fancybox() 调用,因为它正在被检查,然后传递所有其他

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

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

您也可以删除所有 data-* 属性

FIDDLE

亲吻

【讨论】:

  • @JFK 你的loginTest2.php 可能有问题?这是fiddle,它确实有效。还阅读了一些关于serialize() and serializeArray() difference
  • @JFK 只要你删除了你的 css,让我用 CDN 的 css 发布 updatedd fiddle。另外我必须承认,当您更改输入值时,序列化表单在fancybox 中无法正常工作。它似乎在初始化状态时被冻结
  • @JFK 真的吗?你需要解释吗?好的,这意味着,有时aceppted != correct 我用工作解决方案和fiddle 编辑了我的帖子,但当然你可以继续忽略或反对并尝试删除比你更好的答案
【解决方案3】:

我尝试了一种更有趣的方式来使用fancybox,

在fancybox页面中

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

【讨论】:

  • 谢谢Theresa,我会在我的新项目中尝试这种方式:)
猜你喜欢
  • 1970-01-01
  • 2010-12-25
  • 2017-07-14
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
  • 2023-04-02
相关资源
最近更新 更多