工作中遇到一个问题,内容部分包含一些图片链接(img标签不在页面,而是某个字段的内容包含图片),当页面加载时再调整图片图片以适应页面。
起初想法很简单,代码如下
//$("img[src*='/CRFDPIC/']").each(function () { // $(this).css('cursor', 'hand'); // $(this).click(function () { // _zoomPic(this); // }) // var width = parseFloat($(this).attr('width')); // var height = parseFloat($(this).attr('height')); // if (width > height) { // if (width > imaxwidth) { // $(this).removeAttr('width'); // $(this).removeAttr('height'); // $(this).attr('width', imaxwidth); // $(this).attr('height', (imaxwidth * height) / width); // } // } // else { // if (height > imaxhight) { // $(this).removeAttr('width'); // $(this).removeAttr('height'); // $(this).attr('height', imaxhight); // $(this).attr('width', (imaxhight * width) / height); // } // } //})
当网速足够快或页面有缓存时,该代码确实将不合适的图片调整成了适应页面的大小,但是当遇到大图片或者网页速度不够快时便失效了。
出现该问题,调试js,发现代码并无报错,但是-设置断点后发现(this)为空,恍然大悟,图片还未加载好,js就已经执行完了!
发现问题,就想着只能在图片加载完之后再执行调整大小的操作了,所以给图片绑定load事件。
var imaxhight = 620; var imaxwidth = 620; var bmpmaxwidth = "22px"; $("img[src*='/CRFDPIC/']").one("load", function () { //alert($(this).attr("src")); $(this).css('cursor', 'hand'); $(this).click(function () { _zoomPic(this); }); var width = this.width; var height = this.height; if (width > height) { if (width > imaxwidth) { $(this).removeAttr('width'); $(this).removeAttr('height'); $(this).attr('width', imaxwidth); $(this).attr('height', (imaxwidth * height) / width); } } else { if (height > imaxhight) { $(this).removeAttr('width'); $(this).removeAttr('height'); $(this).attr('height', imaxhight); $(this).attr('width', (imaxhight * width) / height); } } }).each(function () { if (this.complete) { $(this).load(); } });
代码中
// var width = parseFloat($(this).attr('width'));
// var height = parseFloat($(this).attr('height'));
修改为
var
width =
this
.width;
var
height =
this
.height;
因为加载到的图片,jQuery对象不一定有这两个属性,而dom元素可以获取到这两个属性。
为所有选择器命中的图片绑定一次load事件(bind、或者直接使用.load(function(){}都是可以的,但是这个事件不是只使用一次吗,对吧),在each中判断如果该图片加载完毕了则调整图片大小。
不能直接在each中进行操作,因为图片还没加载完。
这里one只是绑定一个事件到符合选择器的已存在元素上。
.delegate()
Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.
delegate可以给不存在元素预先绑定事件,当元素通过append等方式加载上之后就已经绑定好该事件了
转载于:https://blog.51cto.com/smartwang/1402871