首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jQuery插件数据与多个实例的混淆

jQuery插件数据与多个实例的混淆
EN

Stack Overflow用户
提问于 2012-02-14 17:28:44
回答 1查看 1.5K关注 0票数 2

我正在尝试开发一个jQuery插件来显示自适应图像库。我使用.data()存储库的每一张幻灯片的信息。

当显示单个图库时,一切看起来都很正常,但是当尝试在一个页面上拥有多个图片库实例时,就会出现混乱。这里可以查看一个粗略的演示。

下面是正在运行的代码:

代码语言:javascript
复制
(function($) {
    $.Gallery = function(element, options) {
        this.$el = $(element);
        this._init(options);
    };

    $.Gallery.defaults = {
        showCarousel : true,
    };

    $.Gallery.prototype = {
        _init : function(options) {
            var $this = $(this);
            var instance = this;

            // Get settings from stored instance
            var settings = $this.data('settings');
            var slides = $this.data('slides');

            // Create or update the settings of the current gallery instance
            if (typeof(settings) == 'undefined') {
                settings = $.extend(true, {}, $.Gallery.defaults, options);
            }
            else {
                settings = $.extend(true, {}, settings, options);
            }
            $this.data('settings', settings);

            if (typeof(slides) === 'undefined') {
                slides = [];
            }
            $this.data('slides', slides);

            instance.updateCarousel();
        },

        addItems : function(newItems) {
            var $this = $(this),
                slides = $this.data('slides');

            for (var i=0; i<newItems.length; i++) {
                slides.push(newItems[i]);
            };
        },

        updateCarousel : function() {
            var instance = this,
                $this = $(this);
                slides = $(instance).data('slides');

            var gallery = instance.$el.attr('id');

            /* Create carousel if it doesn't exist */
            if (instance.$el.children('.carousel').length == 0) {
                $('<div class="carousel"><ul></ul></div>').appendTo(instance.$el);
                var image = instance.$el.find('img');
            };

            var carouselList = instance.$el.find('.carousel > ul'),
                slideCount = slides.length,
                displayCount = carouselList.find('li').length;


            if (displayCount < slideCount) {
                for (var i=displayCount; i<slides.length; i++) {                    
                    slides[i].id = gallery + '-slide-' + i;
                    slide = $('<img>').attr({src : slides[i].thumb}).appendTo(carouselList).wrap(function() {
                        return '<li id="' + slides[i].id + '" />'
                    });

                    slide.on({
                        click : function() {
                            instance.slideTo($(this).parent().attr('id'));
                        },
                    });
                };
            };
        },

        slideTo : function(slideID) {
            var $this = $(this);
            var slides = $this.data('slides');
            var image;
            var $instance = $(this.$el);

            $(slides).each( function() {
                if (this.id == slideID){
                    image = this.img;
                };
            });

            $('<img/>').load( function() {
                $instance.find('div.image').empty().append('<img src="' + image + '"/>');
            }).attr( 'src', image );
        },
    };

    $.fn.gallery = function(options) {

        args = Array.prototype.slice.call(arguments, 1);

        this.each(function() {
            var instance = $(this).data('gallery');

            if (typeof(options) === 'string') {
                if (!instance) {
                    console.error('Methods cannot be called until jquery.responsiveGallery has been initialized.');
                }
                else if (!$.isFunction(instance[options])) {
                    console.error('The method "' + options + '" does not exist in jquery.responsiveGallery.');
                }
                else {
                    instance[options].apply(instance, args);
                }
            }
            else {
                 if (!instance) {
                    $(this).data('gallery', new $.Gallery(this, options));
                }
            }
        });
        return this;
    };

})(jQuery);

$(window).load(function() {
    $('#gallery2').gallery();
    $('#gallery3').gallery();

    $('#gallery2').gallery('addItems', [
        {
            img: 'images/image2.jpg',
            thumb: 'images/image2_thumb.jpg',
            desc: 'Image of number 2'
        },
        {
            img: 'images/image3.jpg',
            thumb: 'images/image3_thumb.jpg',
            desc: 'Image of number 3'
        },
        {
            img: 'images/image4.jpg',
            thumb: 'images/image4_thumb.jpg',
            desc: 'Image of number 4'
        },
        {
            img: 'images/image5.jpg',
            thumb: 'images/image5_thumb.jpg',
            desc: 'Image of number 5'
        }
    ]);

    $('.pGallery').gallery('addItems', [
        {
            img: 'images/2.jpg',
            thumb: 'images/2_thumb.jpg',
            desc: 'Image of number 0'
        },
        {
            img: 'images/image1.jpg',
            thumb: 'images/image1_thumb.jpg',
            desc: 'The second image'
        }
    ]);
    $('.pGallery').gallery('updateCarousel');
});

在表面上,它似乎创建了两个展厅,其适当的滑动结构如下:

  • gallery2
    • 画廊2-幻灯片-0
    • 画廊2-幻灯片-1
    • 画廊2-幻灯片-2
    • 画廊2-幻灯片-3
    • 画廊2-幻灯片-4
    • 画廊2-幻灯片-5

  • gallery3
    • 画廊3-幻灯片-0
    • 画廊3-幻灯片-1

但是,onclick操作不适用于Gallery2的最后两张幻灯片(幻灯片在两个图库中都复制过)。仔细检查DOM后,我可以看到存储在gallery2数据中的幻灯片具有以下ids:

  • gallery2
    • 画廊2-幻灯片-0
    • 画廊2-幻灯片-1
    • 画廊2-幻灯片-2
    • 画廊2-幻灯片-3
    • 画廊3-幻灯片-0
    • 画廊3-幻灯片-1

我不知道是什么导致了混乱,也不知道如何解决,所以任何帮助都将是非常感谢的。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-14 19:00:21

您的问题是调用$('.pGallery').gallery('addItems'...会导致将相同的对象添加到两个库的内部结构中,当您调用$('.pGallery').gallery('updateCarousel');时,存储在这些对象中的in将被覆盖。

你需要在里面放一份原始对象的副本。做:

代码语言:javascript
复制
addItems : function(newItems) {
    var $this = $(this),
        slides = $this.data('slides');

    for (var i=0; i<newItems.length; i++) {
        //slides.push(newItems[i]);
        slides.push(jQuery.extend({}, newItems[i]));
    };
},

使用jQuery.extend({}, oldObject),您可以执行浅拷贝

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9281434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档