重新打开动态初始化的 fancybox

Reopen dynammically initialized fancybox

我无法重新打开动态创建的 fancybox。首先,我调用 AJAX 请求并获取有关图像的信息。接下来,我在 jQuery 中创建并预加载图像,预加载成功后,我创建了 fancybox 的实例。

我关闭了 fancybox,当我尝试用相同的操作重新打开它时,它打开了一小会儿 [0.5 秒] 并立即关闭 [它执行事件 afterClose 一次或多次]。

$.ajax({
            'url' : '<?= Includer::getBase().'/companies/'.Yii::$app->request->getQueryParam('id').'/invoices/' ?>' + invoiceId,
            'success' : function(data) {
                var invoiceObject = jQuery.parseJSON(data);
                $('#invoice-thumbnail-list').empty();

                var imagesPreloadCounter = 0;
                var imagesExpectedCount = Object.keys(invoiceObject.images).length;

                var i = 0;
                for (var index in invoiceObject.images) {
                    i++;
                    url = invoiceObject.images[index].url;
                    big_url = invoiceObject.images[index].big_url;
                    a = $('<a>').addClass('invoice-thumbnail').addClass("fancybox-thumb").attr('rel', 'gallery').attr('title', prepareInvoiceData(invoiceObject));
                    image = $('<img>').load(function() {
                            imagesPreloadCounter += 1;
                            if (imagesPreloadCounter == imagesExpectedCount) {
                                console.info('loaded');
                                $('div#invoice-thumbnail-list a.invoice-thumbnail').fancybox({
                                    'padding'       :   20,
                                    'width'         :   425,
                                    'height'        :   600,
                                    afterClose      :   function() {
                                        window.location.reload();
                                        return true;

                                    },
                                    prevEffect  : 'none',
                                    nextEffect  : 'none',
                                    closeClick  : true,
                                    'arrows'    : false,
                                    'nextClick'   : false,
                                    afterLoad   : function (current, previous) {
                                        console.log('afterLoad');
                                        if (current && previous) {
                                            $('.zoomContainer').remove();
                                            current_index = current.index + 1;
                                            $("#invoice_thumb_"+current_index).elevateZoom({
                                                'easign'    : true,
                                                'zoomType'  : "inner",
                                                'cursor'    : "crosshair"
                                            });
                                        }
                                        return true;
                                    },
                                    loop        : false,
                                    'helpers' : {
                                        'overlay' : {
                                            'css' : {
                                                'background' : 'rgba(58, 42, 45, 0.7)'
                                            }
                                        },
                                        thumbs : {
                                            width: 50,
                                            height: 50
                                        }
                                    }
                                });

                                //$.fancybox.open();
                                $('.fancybox-thumb').eq(0).trigger('click');
                                $("#invoice_thumb_1").elevateZoom({
                                    'easign'    : true,
                                    'zoomType'  : "inner",
                                    'cursor'    : "crosshair"
                                });
                            }



                    }).attr('src', url)
                        .attr('height', '100%')
                        .attr('width', '100%')
                        .attr('data-zoom-image', big_url)
                        .attr('alt', '')
                        .attr('id', 'invoice_thumb_'+i);
                    $(a).append(image);
                    $('#invoice-thumbnail-list').append(a);
                }


            }
        });

以上是具有此功能的代码片段。我不知道为什么 fancybox 会触发大量 afterLoad 图片。

我认为您不需要在 ajax 调用中创建 fancybox 实例。我认为你应该采用不同的方法并在 ajax 调用之外初始化 fancybox outside,这将适用于现有或动态添加的图像,如 :

jQuery(document).ready(function ($) {
    $.ajax({
        'success': function (data) {
            // create and append dynamic images
        }
    });
    // initialize fancybox
    // works for existing or dynamically added images
    $(".fancybox-thumb").fancybox({
        // fancybox API options
    });
}); // ready

如果您想在图像通过 ajax 添加到 DOM 后立即 触发 您的 fancybox 图库,您可以使用 jQuery.when()喜欢:

$.when(
    $.ajax({
        'success': function (data) {
            // create dynamic images
        }
    })
).done(
    $('.fancybox-thumb').eq(0).trigger('click')
);

当然,你应该已经像第一个例子一样初始化了fancybox。