【问题标题】:jQuery Object Literal PatternjQuery 对象文字模式
【发布时间】:2016-02-03 11:17:02
【问题描述】:

为了编写更简洁的代码,我决定学习一些设计模式。我真的很喜欢 Object Literal Module 模式,但我遇到了一些麻烦。我在意大利面条代码中创建了一个灯箱,但无法将其转换为对象文字模式。

var $overlay = $("<div class='lightbox'></div>");
var $img = $("<img>");
var $caption = $("<p class='caption'></p>");



$overlay
    .append($img)
    .append($caption);



$('body').append($overlay);


$('.gallery li').click(function (e) {
    e.preventDefault();

    var src = $(this).children('img').attr("src");
    var cap = $(this).children('img').attr("alt");

    $img.attr('src',src);
    $caption.text(cap);

    $overlay.fadeIn('fast');

    $overlay.click(function () {
        $overlay.fadeOut('fast');
    });
});

【问题讨论】:

  • 欢迎 JamJam,您的具体问题是什么?您要转换哪些部分?
  • @A1rPun 你好,如果可能的话。我最近读到了这个link,他将一些用jquery编写的组件转换为对象文字模式,我试图将上面的代码重构为对象文字模式。

标签: javascript jquery css design-patterns object-literal


【解决方案1】:

我已使用与您的帖子链接的相同结构将代码重构为对象字面量。所有创建的元素都在 lightbox.el 命名空间中,您使用 lightbox.init() 启动灯箱。

var lightbox = {
    el: {
        overlay: $("<div class='lightbox'></div>"),
        img: $("<img>"),
        caption: $("<p class='caption'></p>"),
        galleryItems: $('.gallery li'),
        body: $('body')
    },
    fadeSpeed: 'fast',
    init: function(){
        lightbox.append();
        lightbox.bindUIActions();
    },
    bindUIActions: function(){
        lightbox.el.galleryItems.click(lightbox.handleGalleryClick);
    },
    handleGalleryClick: function(e){
        e.preventDefault();
        var src = $(this).children('img').attr("src");
        var cap = $(this).children('img').attr("alt");

        lightbox.el.img.attr('src',src);
        lightbox.el.caption.text(cap);    
        lightbox.el.overlay.fadeIn(lightbox.fadeSpeed);    
        lightbox.el.overlay.click(lightbox.fadeOutOverlay);
    },
    fadeOutOverlay: function(){
        lightbox.el.overlay.fadeOut(lightbox.fadeSpeed);
    },
    append: function(){
        lightbox.el.overlay
            .append(lightbox.el.img)
            .append(lightbox.el.caption);
        lightbox.el.body.append(lightbox.el.overlay);
    }
}

用法:

lightbox.init();

【讨论】:

  • 非常感谢。我试图把它弄好 2 天,现在我明白我的错误是什么了。感谢您的帮助。
  • 为什么使用对象名称 lightbox 而不是 'this' 和 'var self = this'?
  • @jacopo.galli 如果您愿意,可以使用this。 OP 问题中的链接使用了变量而不是 this,所以我坚持相同的约定。
猜你喜欢
  • 1970-01-01
  • 2015-02-02
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 2011-04-24
  • 2012-03-30
相关资源
最近更新 更多