【问题标题】:Processing a PHP request from an ajax-driven Fancybox element on the same page在同一页面上处理来自 ajax 驱动的 Fancybox 元素的 PHP 请求
【发布时间】:2013-12-10 23:15:02
【问题描述】:

我一直在从事一个涉及收集/处理搜索结果的小项目,我想你们也许可以伸出援手。我有一个小脚本,它从搜索输入中获取搜索值,通过 PHP 处理它,然后通过 JS 将结果收集并插入到花式框中。到目前为止,一切进展顺利,但我似乎无法解决下一个问题。

我无法与精美框中的任何元素进行交互,因为它会重新加载页面(例如,上一个和下一个按钮或搜索输入)。您将如何使用 AJAX 将新内容或表单输入加载到同一页面实例上的花式框中?

HTML:

<form action="search.php" method="post" name="search" id="search">
<input size="35" value="" placeholder="Search" name="search" id="result" autocomplete="off">
<button id="check" data-fancybox-type="ajax" href="search/search.php" id="check">Search</button> 

脚本:

jQuery(document).ready(function(submit) {
$('#check').on("click", function (e) {
    e.preventDefault(); 
    $.ajax({
        type: "POST",
        cache: false,
        url: "search.php",
        data: $("#result").serializeArray(), 
        success: function (data) {
        // on success, post returned data in fancybox
        $.fancybox(data, {
            // fancybox API options
            fitToView: true,
            openEffect: 'fade',
            closeEffect: 'fade'
        }); 
        } 
    }); 
}); 
}); 

以上脚本主要基于this post

感谢您的想法!

【问题讨论】:

  • $.ajax().data 结果中的 HTML 是什么样的?
  • AJAX在处理完字段值后收集search.php的结果。它看起来有点像标准的 Google 搜索结果。

标签: javascript php jquery ajax fancybox


【解决方案1】:

fancybox API 提供了许多基于事件的回调函数,用于在 box 之前、期间和之后与 fancybox 元素交互,shownloaded。这为您提供了很大的灵活性。

我会在Fancybox2 API 中使用afterLoad() 回调函数。

看看我整理的这个小提琴:Fancybox afterLoad() callback to return a function

这只是我的解决方案,我还是非常学习js的,所以我不能说这是best的方式,欢迎反馈或编辑。

基本上我们将使用fancybox的afterLoad() API函数,以便在成功加载由您成功的$.ajax调用驱动的fancybox元素时返回一个函数,然后监听加载的元素的点击事件进入你的幻想盒子

$.fancybox(echoData, {
                    // fancybox API options
                    fitToView: true,
                    openEffect: 'fade',
                    closeEffect: 'fade',
                    afterLoad: function () {
                        return fancyUpdateMyWay = function () {
                            var a = Math.random();
                            var newHtml = "<h4>UPDATED=" + a + "</h4>";
                            $("#fancyResult").html(newHtml);

                        }

                    }

                });

注意:我想你会想从 fancybox 结果中做进一步的 ajax 调用,这里我只演示了一个简单的来自 jquery 的 DOM 更新。

【讨论】:

  • 感谢您的帮助和您的工作。原则上,这似乎可行,尽管我还不能完全发挥它的功能。
  • 您还有什么问题 - 如果需要,我可以向您展示我拥有的一些其他代码,这些代码将处理关闭框,然后将事件推回父窗口。这听起来相当复杂——你可能想看看 angular.js——它有一个学习曲线——但是事件/视图驱动的东西要容易得多。
  • 问题是已经创建的内容。结果看起来有点像 Google 搜索结果(一个搜索框,后面是链接列表和底部带有分页的描述)。因此,我可以使用您的解决方案重新提交 iframe 内的搜索,但我似乎无法获取已经生成的内容(即下一页)并重新填充 iframe。我知道它可能,我只是还没有弄清楚如何用 JS 调用它。我看看能不能弄个小提琴给你看。
【解决方案2】:

尝试将您的 javascript 更改为使用“点击”而不是“打开”。应该这样做

jQuery(document).ready(function(submit) {
$('#check').click(function (e) {
e.preventDefault(); 
   $.ajax({
   ....
   }); 
 }); 
}); 

【讨论】:

  • 如果使用 jQuery 1.7+,你只是使用了一个简码,没有别的。这并不能解决问题。
  • 不幸的是,JFK 是正确的。问题出在fancybox 中构造的内容中。有些东西需要能够链接出去,比如搜索结果,而另一些则需要将fancybox作为一个窗口来实现。不过谢谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多