Skip to content

jquery实现ajax加载图片

2010年1月29日

最近在学习JQuery,想从原理上模拟一下无刷新的相册浏览。

最先想到的思路是利用缓存,也就是先显示提示消息,然后get图片,在get完的时候回调,将img标签的src改掉,由于刚刚get过,有了缓存,所以图片会立刻显示出来。

页面元素:

html
<input class="picbtn" type="button" value="Next" />
<div class="tip">正在加载……</div>
<div class="notice">
	<img />
</div>
<input class="picbtn" type="button" value="Next" />
<div class="tip">正在加载……</div>
<div class="notice">
	<img />
</div>

按钮的事件绑定:

javascript
$(".picbtn").click(function(){NextPic();});
$(".picbtn").click(function(){NextPic();});

定义了一个数组PicArr用来记录所有图片。

NextPic内容:

javascript
$(".tip").slideDown(200);  //显示提示	$.get(PicArr[CurrPic],function(){
	$("img").attr("src",PicArr[CurrPic]);
	$(".tip").slideUp(200);
	CurrPic++;
	if(CurrPic>4)
		CurrPic=0;
		});
};
$(".tip").slideDown(200);  //显示提示	$.get(PicArr[CurrPic],function(){
	$("img").attr("src",PicArr[CurrPic]);
	$(".tip").slideUp(200);
	CurrPic++;
	if(CurrPic>4)
		CurrPic=0;
		});
};

在CHROME和FF下显示正常,IE6下异常,IE7、8未测试。

后来在ASPRAIN的开发者 稽山草 的帮助下,思路改成了先改src,然后绑定onload事件,在onload中回调。

核心代码:

javascript
$("img").attr("src",PicArr[CurrPic])
	.bind(load,function(){
		$(".tip").slideUp(200);
		CurrPic++;
		if(CurrPic>4)CurrPic=0;
	});
$("img").attr("src",PicArr[CurrPic])
	.bind(load,function(){
		$(".tip").slideUp(200);
		CurrPic++;
		if(CurrPic>4)CurrPic=0;
	});

后来一看基本正常了,但是仔细看还是不正常,图片顺序开始乱跳,跟踪了好久发现回调函数会多次运行。中间想到会不会是事件绑定的问题,因为onclick事件的绑定是$(Element).bind("click",callback),可以简写成$(Element).click(callback),想到$(Element).bind("load",callback)$(Element).load(url,callback)会不会是一样,查资料写得都不怎么清楚,改了试一下,还是不一样,不过在chrome和ff下依然能工作,但是数据不太正常,IE下报错。

再次检查 稽山草 给的代码,发现问题在哪了。

load事件的绑定的是一个匿名函数,而当按钮按下时会再次绑定,所以会重复执行。于是将绑定bind改成one搞定。最终完整代码如下:

html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
	<title>JQUERY动态加载图片</title>
	<script type="text/javascript" src="jquery/jquery-1.3.2.min.js"></script>
	<script type="text/javascript">
		(function($){
			$.NextPic=function(){
				$(".tip").slideDown(200);
				$("img").attr("src",PicArr[CurrPic]).one(load,function(){
					$(".tip").slideUp(200);
					CurrPic++;
					if(CurrPic>4)CurrPic=0;
				});
				/*("img").load(PicArr[CurrPic],function(){
					$(this).attr("src",PicArr[CurrPic]);
					$(".tip").slideUp(200);
					alert(CurrPic);
					CurrPic++;
					if(CurrPic>4)CurrPic=0;
				});*/
			}
		})(jQuery);

		$(document).ready(function(){
			PicArr = new Array("1.jpg","2.jpg","3.jpg","4.jpg","5.jpg");
			CurrPic=0;
			$(".tip").css({"position":"absolute","top":"100px","left":"50px"});
			$(".tip").hide();
			$(".scoll").click(function(){$.NextPic();});
		})
	</script>
</head>
<body>
	<input class="picbtn" type="button" value="Next" />
	<div class="tip">正在加载……</div>
	<div class="notice">
		<img id="img"/>
	</div>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
	<title>JQUERY动态加载图片</title>
	<script type="text/javascript" src="jquery/jquery-1.3.2.min.js"></script>
	<script type="text/javascript">
		(function($){
			$.NextPic=function(){
				$(".tip").slideDown(200);
				$("img").attr("src",PicArr[CurrPic]).one(load,function(){
					$(".tip").slideUp(200);
					CurrPic++;
					if(CurrPic>4)CurrPic=0;
				});
				/*("img").load(PicArr[CurrPic],function(){
					$(this).attr("src",PicArr[CurrPic]);
					$(".tip").slideUp(200);
					alert(CurrPic);
					CurrPic++;
					if(CurrPic>4)CurrPic=0;
				});*/
			}
		})(jQuery);

		$(document).ready(function(){
			PicArr = new Array("1.jpg","2.jpg","3.jpg","4.jpg","5.jpg");
			CurrPic=0;
			$(".tip").css({"position":"absolute","top":"100px","left":"50px"});
			$(".tip").hide();
			$(".scoll").click(function(){$.NextPic();});
		})
	</script>
</head>
<body>
	<input class="picbtn" type="button" value="Next" />
	<div class="tip">正在加载……</div>
	<div class="notice">
		<img id="img"/>
	</div>
</body>
</html>