【问题标题】:Fancybox 3 ajax load image galleryFancybox 3 ajax 加载图片库
【发布时间】:2017-10-23 01:11:16
【问题描述】:

Fancy box 3 documentation 提供了一些关于其 AJAX 功能的示例。我希望能够单击一个按钮并加载一个“图库”,其中包含从 ajax 响应加载的图像。

我发现的一个示例(this 页面上的最后一个)需要在隐藏的 div 中硬编码图库的图像路径;这很好,但我宁愿通过 AJAX 加载来减少页面加载时间。

我发现了一些看起来像 promising 的东西,但我不确定如何在其中实现 ajax。有什么想法吗?

$.fancybox.open([
    {
        src  : '1_b.jpg',
        opts : {
            caption : 'First caption'
        }
    },
    {
        src  : '2_b.jpg',
        opts : {
            caption : 'Second caption'
        }
    }
], {
    loop : false
});

【问题讨论】:

    标签: jquery ajax fancybox-3


    【解决方案1】:

    原来它超级简单:

    $(document).ready(function () {
        $("#test").on('click', function () {
            $.ajax({
                type: 'POST',
                url: '/neou_cms/test/ajax_resp',
                dataType: 'json',
                success: function (data) {
                    $.fancybox.open(data);
                }
            });
        });
    });
    

    AJAX 响应在哪里:

    [{"src":"\/images\/uploads\/projects\/207002523\/m_207002523_1.jpg"},
     {"src":"\/images\/uploads\/projects\/207002523\/m_207002523_2.jpg"},
     {"src":"\/images\/uploads\/projects\/207002523\/m_207002523_3.jpg"}, 
     {"src":"\/images\/uploads\/projects\/207002523\/m_207002523_4.jpg"}]
    

    只要遵循以下语法,您甚至可以添加字幕和可选的拇指:

        {
            src  : '1_b.jpg',
            opts : {
                caption : 'First caption'
            }
        },
    

    Codeigniter 代码:

    $this->load->model('backend/images_model');
    $query = $this->db->get_where('projects', array('id' => '207002523'));
    $images = $this->images_model->get_images($query->row()->images);
    $output = array();
    foreach ($images as $image) {
        $output[] = array('src' => $image['main']);
    }
    echo json_encode($output);
    exit;
    

    如果您已经在 href 中有一张图片,并且希望在 fancybox 打开时加载更多图片,您可以这样做:

    $(document).ready(function () {
        $("[data-fancybox]").fancybox({
            loop: false,
            onInit: function (instance) {
                $.ajax({
                    type: 'POST',
                    url: '/neou_cms/test/ajax_resp',
                    dataType: 'json',
                    success: function (data) {
                        $.each(data, function (index, src) {
                            instance.createGroup({
                                type: 'image',
                                src: src
                            });
                        });
                    }
                });
            }
        });
    });
    

    对最新版fancybox的小修正:

    $(document).ready(function () {
      $("[data-fancybox]").fancybox({
        loop: false,
        onInit: function (instance) {
          let id_album = $("[data-fancybox]").attr('id');
          $.ajax({
            type: 'POST',
            url: './neou_cms/test/ajax_resp',
            dataType: 'json',
            success: function (data) {
              $.each(data, function (item) {
                instance.addContent({
                  'type': 'image',
                  'src': item.src
                });
              });
            }
          });
        }
      });
    });
    

    【讨论】:

    • TypeError: instance.createGroup is not a function,我该如何解决这个问题?
    • 是的!仔细阅读文档后,我注意到 .createGroup.addContent 替代
    • 如果您愿意,您可以在此处填写答案,以免下一个人感到困惑。
    • @Alex 帮助很大。谢谢。一个问题。在您使用$.fancybox.open(data); 的第一种方法中,我如何使用一些自定义选项触发相同的操作?
    【解决方案2】:

    ajax画廊有两个步骤:

    1. 链接到 ajax 库。
    2. 在不同的网址中构建您的画廊。

    链接到 ajax 库:

    如果你再看一下文档(ajax 部分):

    http://fancyapps.com/fancybox/3/docs/#ajax

    它表明您可以轻松链接到 ajax 库(无需 javascript) 将data-type="ajax"data-src="my_page.com/path/to/ajax/" 用于您的ajax 内容

    <a data-fancybox data-type="ajax" data-src="my_page.com/path/to/ajax/" href="javascript:;">
        AJAX content
    </a>
    

    创建画廊链接后,现在您可以继续在另一个 url 中设置 ajax 画廊。

    在不同的网址中构建您的画廊:

    在您打算保留所有画廊图像的单独网址 (my_page.com/path/to/ajax/) 中,您只需像普通的 fancybox 画廊一样进行设置。

    例子:

    <div>
        <a data-fancybox="ajax-gallery-1" href="http://farm8.staticflickr.com/7367/16426879675_e32ac817a8_b.jpg" title="Codirosso spazzacamino (Massimo Greco _Foligno)"><img width="160" height="106" src="http://farm8.staticflickr.com/7367/16426879675_e32ac817a8_m.jpg" alt="" /></a>
        <a data-fancybox="ajax-gallery-1" href="http://farm6.staticflickr.com/5612/15344856989_449794889d_b.jpg" title="Morning Twilight (Jose Hamra Images)"><img width="160" height="106" src="http://farm6.staticflickr.com/5612/15344856989_449794889d_m.jpg" alt="" /></a>
        <a data-fancybox="ajax-gallery-1" href="http://farm8.staticflickr.com/7289/16207238089_0124105172_b.jpg" title=" (Eric Goncalves (cathing up again!))"><img width="160" height="106" src="http://farm8.staticflickr.com/7289/16207238089_0124105172_m.jpg" alt="" /></a>
        <a data-fancybox="ajax-gallery-1" href="http://farm9.staticflickr.com/8568/16388772452_f4d77a92c7_b.jpg" title="Arctic Paradise (Tom Draxler)"><img width="160" height="106" src="http://farm9.staticflickr.com/8568/16388772452_f4d77a92c7_m.jpg" alt="" /></a>
        <a data-fancybox="ajax-gallery-1" href="http://farm8.staticflickr.com/7308/15783866983_27160395b9_b.jpg" title="Rodeo Dusk (_JonathanMitchellPhotography_)"><img width="160" height="106" src="http://farm8.staticflickr.com/7308/15783866983_27160395b9_m.jpg" alt="" /></a>
        <a data-fancybox="ajax-gallery-1" href="http://farm3.staticflickr.com/2880/10346743894_0cfda8ff7a_b.jpg" title="Les papillons ont du chagrin (JMS')"><img width="160" height="106" src="http://farm3.staticflickr.com/2880/10346743894_0cfda8ff7a_m.jpg" alt="" /></a>
    </div>
    

    FancyBox3网站上也有一个ajax请求示例,如果你访问http://fancyapps.com/fancybox/3/,滚动到上面写着Ajax request的部分,你可以看到开发者如何设置他的画廊和他如何在不同的 url http://fancyapps.com/fancybox/3/ajax.php?v=1508722146 中显示他的画廊。

    【讨论】:

    • 我看到了你发布的两个例子。但是,它与其说是画廊,不如说是带有可点击图像的模式。我所说的更像是花哨的盒子网站上给出的第一个例子。如果您单击一个图像,您会看到您可以访问下一行的下一个图像。除了我想要实现的不是对这些图像进行硬编码而是通过 Ajax 加载。有意义吗?
    • 知道了,这意味着您想完全使用 javascript 输入您的图库内容,并将其他 html 分开,对吗?在这种情况下,我认为这是不可能的,因为 fancyBox 需要您触发 href:'_'才能使其工作。您在网站上看到的带有缩略图的示例正在使用硬编码方法,并且画廊无法在其开启时触发。即使您默认触发画廊,布局和机制也将不再相同。你有什么理由要通过ajax加载吗?
    • 我找到了解决办法!
    • 你能在这里发布你的解决方案,并在未来帮助其他人
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    相关资源
    最近更新 更多