【问题标题】:Modal is "remembering" code from previous modals模态是从以前的模态“记住”代码
【发布时间】:2015-10-11 14:56:45
【问题描述】:

设置
我有一个框格(模态触发器)。每个框打开一个模式。每个模式内部都有一个非常简单的缩略图库,其中包含一个主图像和缩略图。单击缩略图会将主图像替换为自身的较大版本。

问题(此序列中的第 4 步...)
(1) 打开模态A,主图显示——太好了!
(2) 单击模态 A 中的第二个拇指,主图像将变为该拇指的更大版本 - 太棒了!
(3) 关闭模态 A - 太棒了!
(4) 打开模态 B,主图像不是模态 B 的第一个缩略图,但它是模态 B 的第二个缩略图的较大图像 - 不是很好!模态 B 记得我从模态 A 中选择了第二个拇指,因此它显示的是模态 B 的第二个拇指而不是第一个。

问题
我如何(以及在​​哪里)添加代码以使模态“忘记”在最后一个模态中选择的内容?还是每次打开模态时都会重置?如果我选择模态 A 的第三张图像,但打开模态 B 并且没有第三张缩略图,这个问题会很严重 - 因为主图像将是空白的。我是否将代码应用于模态或图库 jquery?这让我发疯了!


模式插件
custombox.js

缩略图插件
simplegallery.js

JQUERY 到 FIRE 模式

$(document).ready(function () {
    $(".modal img").not(":visible").each(function () {
        $(this).data("src", this.src);
        this.src = "";
    });
    $(".modal").each(function () {
        $(this).data("sourcesAreSet", false);
    });
    $('.info').on('click', function (e) {
        var correspondingModal = $($(this).data('href'));
        if (correspondingModal.data("sourcesAreSet") == false) {
            correspondingModal.find("img").each(function () {
                this.src = $(this).data("src");
            });
            correspondingModal.data("sourcesAreSet", true);
        }
        Custombox.open({
            target: $(this).data('href'),
            effect: 'push',
            speed: 500,
            overlayColor: '#2C3E50',
            overlayClose: false
        });
        e.preventDefault();
    });
});

JQUERY 到 FIRE GALLERY

$(document).ready(function(){
    $('#gallery').simplegallery({
        galltime : 1000, // transition delay
        gallcontent: '.content',
        gallthumbnail: '.thumbnail',
        gallthumb: '.thumb',
    });
});

示例模式

<div id="modal51" 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 src="../../../../../assets/images/portfolio/brochures-flyers/20141117_ikuw_flyer_course-outline_tech.jpg" class="image_1">
                    <img src="../../../../../assets/images/portfolio/brochures-flyers/20141117_ikuw_flyer_course-outline_tech_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">technical training course outline</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/20141117_ikuw_flyer_course-outline_tech.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 src="../../../../../assets/images/portfolio/brochures-flyers/thumb_20141117_ikuw_flyer_course-outline_tech.jpg" id="thumb_1" class="fit"></a></div>
                <div class="thumb wow bounceIn" data-wow-delay="1.6s"><a href="#" rel="2"><img src="../../../../../assets/images/portfolio/brochures-flyers/thumb_20141117_ikuw_flyer_course-outline_tech_2.jpg" id="thumb_2" class="fit"></a></div>
            </div>
        </div>
    </div>
</div>


编辑
小提琴!小提琴!小提琴! --> http://jsfiddle.net/zuhloobie/nLhcejsz/

(1) 点击模态A,在右侧看到模态主图A1和拇指A1和A2
(2) 点击拇指A2,看到主图变为A2
(3) 关闭模态A,打开模态B
(4) 看到主图像是 B2,而不是 B1(它记得在模态 A 中单击了第二个拇指,因此它显示了模态 B 的第二个拇指)

希望对您有所帮助! :)

【问题讨论】:

  • 布勒....布勒...
  • 这不是您之前在这里问过的同一个问题:stackoverflow.com/questions/31305037/… 吗?
  • 不 - 不同。这与变焦有关。这是更高的一步,关于清空模式或清除缓存或在打开代码之前重置代码。
  • 我不知道custombox,但它可以有多个实例吗?如果不是,则问题可能是您有多个具有模态类的元素。
  • 是的,它可以有多个实例。发表了一个小提琴:jsfiddle.net/zuhloobie/nLhcejsz

标签: jquery modal-dialog thumbnails image-gallery


【解决方案1】:

问题是您只设置了新的src 值,但图像元素本身(在单击缩略图后隐藏/显示)仍处于与之前模式相同的状态。

我通过在模态打开时触发第一个拇指的点击来使其工作:

open: function() {
    correspondingModal.find("#thumb_1").parent("a").trigger("click");
}

Updated Fiddle

【讨论】:

  • 我喜欢这个,但是是否可以在模态打开回调中重置整个模态内容?喜欢清空它并在点击时重新加载?
  • 然后使用open 函数到empty() 模态并使用html() 再次用你的标记填充它。我不明白你为什么要重新加载它。是的,建议的解决方案有点像 hack,但它确实有效。
  • 正如我在 Jeroen 的帖子中提到的,我只能让它清空 - 我不能让它重新加载。我认为清空它并重新加载它是“正确”的做法。也是插件作者推荐的,就是不能重新加载?
  • 更新:这不起作用。当您尝试打开 Modal C 时它失败。如果您打开 Modal B 并单击拇指 B2...然后关闭 Modal B 并打开 Modal C - 主图像是空白的。仅当模态框具有相同数量的缩略图时,您的答案才有效 - 情况并非如此。
【解决方案2】:

我更改了初始 .ready() 函数的顺序,并尝试保存所有模式的内容并在 Custombox 关闭时重新加载它们。

编辑:已通过在 Custombox 的 open()close() 函数上加载内容来解决未加载的图像。

获取初始模态内容:

$(".modal").each(function () {
    window['reset' + $(this).attr('id')] = $(this).find('.content').html();
});

在 Custombox open() 处加载模态:

open: function(){
            $(".modal").each(function () {
                $(this).find('.content').html(window['reset' + $(this).attr('id')]);
            });
        }

在 Custombox close() 处重新加载模式:

close: function(){
            $(".modal").each(function () {
                $(this).find('.content').html(window['reset' + $(this).attr('id')]);
            });
        }

更新的小提琴:http://jsfiddle.net/nLhcejsz/6/

现在应该按照您的要求运行,模式会忘记单击了哪个缩略图并相应地重置。

【讨论】:

  • 我喜欢这背后的想法......但我在解决这些图像无法加载的问题时遇到了问题:/
  • 我会再次检查它,看看我能做什么。我相信它最终会变得很简单。
  • 请查看更新后的答案,它现在对我有用。
  • 完美!非常感谢你,@格伦。真的很感激:)
  • 太棒了!很高兴我能提供帮助!
【解决方案3】:

可能是一个hackjob。但是试一试。在.info函数的click中加入这段代码:

$(".content img").hide(0, function () {
    $(".image_1").show();
});

这有效地“重置”了图像:

小提琴:http://jsfiddle.net/praveenscience/nLhcejsz/2/

【讨论】:

  • 是否可以在模态打开回调中重置整个模态内容?喜欢清空它并在点击时重新加载?
  • 您的回答与我在您发布此内容前 3 天在回复 Jeroen 时已经提到过的回答基本相同。
  • @chris 但这是为了让它变空,是吗?
  • 我的偏好是清空模态内容并重新加载它。如果这不起作用,那么我将不得不求助于隐藏/显示图像,正如我已经提到的那样,我已经在 J​​eroen 的帖子中工作过。
【解决方案4】:

我在使用引导模式时遇到了同样的问题。我为自己找到了一个简单且有效的解决方法:

$('.info').on('click', function (e) {
    $(".modal-body").empty(); 
    // Don't know which element should be empty in your example
    // After the empty(), I load the content I need
}

对我来说一个简单的.empty() 之前我加载内容完成了这项工作。

【讨论】:

  • 我希望在加载之前清空模式的所有内容(使用 custombox.js 打开回调)......我可以使用.empty() 来做到这一点,但它只会清空。 ..它不加载内容
  • 我得到的最接近的方法是将其添加到关闭回调中:$('.image_1').hide();,然后将 $('.image_1').show(); 添加到打开回调中。感觉很hacky?我真的不知道它为什么有效,但我认为它有效。如果有更好的方法,我会全力以赴......
  • 但我宁愿清空模态框的内容并在打开模态框时重新加载它,而不是调整模态框内的各个部分,因为它会涵盖其他潜在问题。
  • 你有机会做一个 jsfiddle 吗?
  • 小提琴! jsfiddle.net/zuhloobie/nLhcejsz。试图使它有点可以理解。遵循问题中概述的顺序,在顶部。
【解决方案5】:

我有一个简单的:

let preventNoMultiple = true;
$('.modal').modal();
$('.Modal').on('shown.bs.modal', function (event) {
  if(preventNoMultiple){// ...do something}
});
$('.Modal').on('hidden.bs.modal', function (event) {preventNoMultiple = false;}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    相关资源
    最近更新 更多