为了更好地学习jquery,我决定编写一个插件来创建像{+ 3}}一样的谷歌+。这是一个gallery collage effect。
我希望在调整包含图像的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 );
答案 0 :(得分: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() });
现在width
和height
是.data('size')
中存储的对象的属性,可以通过以下方式检索:
alert($(this).data('size').width);
为简单起见,我主要选择第一个选项。然而,第二个看起来更整洁。选择您认为更易读和可维护的那些。
答案 1 :(得分:4)
在服务器端,您可以在data-*
attributes中存储HTML元素的数据,并通过jQuery的.data()
函数(从jQuery 1.4.3获取),这也将该函数的一般行为更改为在文档中指出)。您正在设置插件中的属性,但此时,您可以将原始宽度和高度存储在data
对象中,如下所示:
$(this).data( "data-width", w );
$(this).data( "data-height", h );
使用.data()
函数返回数据,无论它是否在HTML中存储为data-
属性,或者是否包含在附加到元素的jQuery data
对象中。您已经在使用.data()
函数而没有任何参数returns the complete data
object of the matched elements,也包含来自HTML属性和jQuery的data
对象的数据。这可以,但你可以通过这样调用它来获取保存的width
和height
:
$(this).data("width");
$(this).data("height");