2

为了更好地学习 jquery,我决定编写一个插件来创建类似于 google+的画廊拼贴效果。这是一个例子

我想在调整包含图像的 html 元素的大小时再次触发它。我遇到的部分问题是我需要存储原始图像大小以便重新计算图像大小以使其适合。

我不知道在哪里存储以及如何检索这些原始图像大小。完整的插件链接在上面,但我会在这里做一个总结。

;(function( $ ) {
    $.fn.collagePlus = function( options ) {

        var settings = $.extend( 
            //... 
            'images'          : $('img', $(this))
            //... 
        );

        return this.each(function() {
            settings.images.each(function(index){
                //... 

                /*
                * get the current image size
                */
                var w = (typeof $(this).data().width != 'undefined') ? $(this).data().width : $(this).width();
                var h = (typeof $(this).data().height != 'undefined') ? $(this).data().height : $(this).height();

                /*
                * store the original size for resize events
                */
                $(this).attr( "data-width" , w  );
                $(this).attr( "data-height" , h  ); 
                //... Do some other stuff
                }
            );
        });
    }
})( jQuery );
4

2 回答 2

4

你用.data()错了。当您将 1 个参数传递给.data函数时,它会返回给定键的值。当您传递 2 个参数时,.data将为该键设置值。

这个块:

//get the current image size
var w = (typeof $(this).data().width != 'undefined') ? $(this).data().width : $(this).width();
var h = (typeof $(this).data().height != 'undefined') ? $(this).data().height : $(this).height();

应该:

var $this = $(this); //caching your selector
if (!$this.data('width')) //if this element doesn't have a width stored
    $this.data('width', $this.width()); //stores currently computed width
if (!$this.data('height')) //repeat
    $this.data('height', $this.height());

当然,稍后检索数据:

alert($this.data('width')) //alerts currently stored width

小提琴演示

您还可以在.data传递属性映射中存储对象:

if (!$(this).data('size'))
    $(this).data('size', { width: $(this).width(), height: $(this).height() });

现在widthheight是存储在 中的对象的属性.data('size'),可以通过以下方式检索:

alert($(this).data('size').width);

小提琴

为了简单起见,我主要选择第一个选项。但是第二个看起来更整洁。选择您认为更具可读性和可维护性的任何一个。

于 2012-07-14T12:22:44.753 回答
4

在服务器端,您可以将 HTML 元素的数据存储在data-*属性中并通过 jQuery 的.data()函数获取它(从jQuery 1.4.3开始,它也改变了该函数的一般行为,如文档中所述)。您正在插件中设置属性,但此时,您可以将原始宽度和高度存储在data对象中,如下所示:

$(this).data( "data-width", w );
$(this).data( "data-height", h );

.data()无论数据是作为data-属性存储在 HTML 中还是包含在data附加到元素的 jQuery 对象中,使用该函数都会返回数据。您已经在使用.data()不带任何参数的函数,它返回data匹配元素的完整对象,以及来自 HTML 属性和 jQuerydata对象的数据。这行得通,但你可以得到保存width,并height像这样调用它:

$(this).data("width");
$(this).data("height");
于 2012-07-14T12:26:39.183 回答