【问题标题】:Only load images after modal is open仅在模态打开后加载图像
【发布时间】:2015-07-21 20:29:49
【问题描述】:

我有一大堆盒子。每个框打开一个模式。每个模态都有图像。

问题是页面加载所有图像并且需要很长时间。只有在打开特定模式时,我才能让它加载模式的图像?也许还有spinner gif

我正在使用 custombox.js 插件。

$(document).ready(function() {
    $('.info').on('click', function(e) {
        Custombox.open({
            target: $(this).data('href'),
            effect: 'push',
            speed: 500,
            overlayColor: '#2C3E50',
            overlayClose: false,
            //overlayEffect: '',
            //overlayOpacity: 1,
        });
        e.preventDefault();
    });
});

编辑:示例模式代码

<div id="modal57" class="modal">
    <div id="portfolioItemClose" class="close"><span></span>
    </div>
    <div class="portfolioTitle wow fadeInLeft" data-wow-delay=".5s" data-wow-duration=".3s">ikuw solutions
    </div>
    <div class="portfolioImageBodyContainer">
        <div class="portfolioImage wow rotateIn" data-wow-delay=".3s" data-wow-duration=".3s">
            <div id="gallery" class="">
                <div class="content">
                    <img data-src="../../../../../assets/images/portfolio/brochures-flyers/20150102_ikuw_flyer-tech_oracle-pl-sql-tips-techniques_1.jpg" class="image_1">
                    <img data-src="../../../../../assets/images/portfolio/brochures-flyers/20150102_ikuw_flyer-tech_oracle-pl-sql-tips-techniques_2.jpg" class="image_2" style="display:none;">
                </div>
            </div>
        </div>
        <div class="portfolioBody wow fadeInDown" data-wow-delay=".5s" data-wow-duration=".3s">
            <div class="portfolioClientDescriptionUsage">
                <div class="portfolioBodyClient wow fadeIn" data-wow-delay=".8s">ikuw solutions</div>
                <div class="portfolioBodyDescription wow fadeIn" data-wow-delay=".9s">PL/SQL tips &amp; techniques flyer</div>
                <div class="portfolioBodyUsage wow fadeIn" data-wow-delay="1s">students</div>
            </div>
            <div class="portfolioBodyText wow fadeIn" data-wow-delay="1.1s">[text]</div>
            <div class="portfolioBodyPDF wow fadeIn" data-wow-delay="1.1s"><a href="../../../../../assets/images/portfolio/brochures-flyers/20150102_ikuw_flyer-tech_oracle-pl-sql-tips-techniques.pdf" target="_blank">View full-scale PDF&nbsp;&nbsp;<span class="fa fa-angle-right"></span></a></div>
            <div class="portfolioBodyLine wow zoomIn" data-wow-delay="1.2s" data-wow-duration=".3s"></div>
            <div class="portfolioBodyVersions wow fadeIn" data-wow-delay="1.3s">pages</div>
            <div class="thumbnail">
                <div class="thumb wow bounceIn" data-wow-delay="1.5s"><a href="#" rel="1"><img data-src="../../../../../assets/images/portfolio/brochures-flyers/thumb_20150102_ikuw_flyer-tech_oracle-pl-sql-tips-techniques_1.jpg" id="thumb_1" class="fit"></a></div>
                <div class="thumb wow bounceIn" data-wow-delay="1.6s"><a href="#" rel="2"><img data-src="../../../../../assets/images/portfolio/brochures-flyers/thumb_20150102_ikuw_flyer-tech_oracle-pl-sql-tips-techniques_2.jpg" id="thumb_2" class="fit"></a></div>
            </div>
        </div>
    </div>
</div>

【问题讨论】:

  • 或许使用custombox的“完成”回调函数?

标签: jquery modal-dialog


【解决方案1】:

解决方案是在加载时删除所有模态框图像源,并将其值保留在属性data-src 中。然后,当您打开模态窗口时,您可以将源设置为仅打开的模态图像,这要归功于相应的data-src 值。类似的东西:

$(document).ready(function () {
    // Considering that your modal divs have a class 'modal'
    $(".modal img").not(":visible").each(function () {
        $(this).data("src", this.src);
        this.src = "";
        // or remove the whole attribute with $(this).removeAttr("src")
    });

    // Set an attribute `data-sourcesAreSet` to each modal div in order to prevent setting the images sources if they are already set
    $(".modal").each(function () {
        $(this).data("sourcesAreSet", false);
    });

    $('.info').on('click', function (e) {

        var correspondingModal = $($(this).data('href'));

        // Only set the images sources if they are not already set.
        if (correspondingModal.data("sourcesAreSet") == false) {
            correspondingModal.find("img").each(function () {
                this.src = $(this).data("src");
                // or add the attribute with $(this).attr("src", $(this).data("src"))
            });
            correspondingModal.data("sourcesAreSet", true);
        }

        Custombox.open({
            target: $(this).data('href'),
            effect: 'push',
            speed: 500,
            overlayColor: '#2C3E50',
            overlayClose: false
        });
        e.preventDefault();
    });
});

以下是可以使用上述代码的模态框示例:

<a data-href="#modal" class="info">Click here</a>

<div id="modal" class="modal-demo modal">
    <button type="button" class="close" onclick="Custombox.close();">
        <span>&times;</span><span class="sr-only">Close</span>
    </button>
    <h4 class="title">Modal title</h4>
    <div class="text">
        Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
    <img src="Images/example.png" />
    </div>
</div>

如果您还想在加载图像时显示微调器 gif,您可以为每个图像执行in this answer 的建议,或者,您可以有一个与模态框一样大的 div,其中包含微调器 gif您可以隐藏在自定义框的“完成”回调函数中,尽管我不确定当所有图像完成加载时会触发此函数。

【讨论】:

  • 您的代码正确地隐藏了图像,并且页面加载速度非常快(显然),如开发人员工具 > 网络(chrome)上所示,但是当模式打开时它们没有出现。
  • 对不起,如果我不清楚。我并不是要手动添加属性data-src。我的意思是每个图像都有一个src 属性,并且在文档加载时,就像我所做的那样,将src 属性值存储在data-src 属性中。但是,如果您更喜欢手动添加 data-src 属性,则可以删除第一个 foreach 块,然后在打开框时添加 src 属性和 attr()
  • 完美。非常感谢!
猜你喜欢
  • 2017-02-14
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
  • 2018-06-05
相关资源
最近更新 更多