我正在使用下面的功能在我的ajax页面上预加载图像。我的页面包含图片库。但是当我点击另一个图库链接时,我需要停止预加载当前图库。有帮助吗?感谢...
它已经解决了...这是带有示例的工作代码......
<html>
<head>
<script type="text/javascript">
(function($) {
imgList = [];
$.extend({
preload: function(imgArr, option) {
var setting = $.extend({
init: function(loaded, total) {},
loaded: function(img, loaded, total) {},
loaded_all: function(loaded, total) {},
cancel: function() {}
}, option);
setting.cancel(imgList);
var total = imgArr.length;
var loaded = 0;
setting.init(0, total);
for(var i in imgArr) {
imgList.push($("<img />")
.attr("src", imgArr[i])
.load(function() {
var loadedImg=$("img[src='"+$(this).attr("src")+"']");
if(loadedImg.attr("width")==undefined){
$("img[src='"+$(this).attr("src")+"']").attr({
width: this.width,
height: this.height
});
};
loaded++;
setting.loaded(this, loaded, total);
if(loaded == total) {
setting.loaded_all(loaded, total);
imgList = [];
};
})
);
}
}
});
})(jQuery);
function preload(arr,preloaderFunc,preloaderCompleteFunc){
$.preload(arr, {
init: function(loaded, total) {
var percent=(100/total)*loaded;
eval(preloaderFunc+"("+percent+")");
},
loaded: function(img, loaded, total) {
var percent=(100/total)*loaded;
eval(preloaderFunc+"("+percent+")");
},
loaded_all: function(loaded, total) {
eval(preloaderCompleteFunc+"()")
},
cancel: function(imgList) {
if(imgList.length>0){
for(var i in imgList) {
console.log("remove:"+imgList[i])
imgList[i].unbind("load").remove();
}
imgList = [];
};
}
});
};
function preloader(percent){
$(".loaderBar").stop().animate({ "width" : percent+"%" }, 500)
};
function initPreloadImgs(){
if($('.preloadImgs').length != 0) {
$('.preloadImgs').not(".preloadImgs-ok").each(function(index) {
$(this).addClass("preloadImgs-ok");
var preloaderFunc=hasClassVal($(this),"preloaderFunc:");
var preloaderCompleteFunc=hasClassVal($(this),"preloaderCompleteFunc:");
clearClass($(this),"preloaderFunc:");
clearClass($(this),"preloaderCompleteFunc:");
var preloadThem=[];
$('.preloadImgs').find("img").each(function(){
preloadThem.push($(this).attr("src"));
});
if(preloadThem.length==0){
eval(preloaderCompleteFunc+"()");
}else{
preload(preloadThem,preloaderFunc,preloaderCompleteFunc);
};
});
};
};
function preloaded(){
$(".main").fadeIn(1000);
};
function hasClassVal(obj,val){
var classes=$(obj).attr("class")!=undefined?$(obj).attr("class").split(" "):"";
var valLength=val.length;
var getVal=""
for(var i in classes){
var optz=classes[i];
if(optz.length>valLength){
if(optz.substr(0,valLength) == val){
getVal = optz.substr(valLength);
break;
};
};
};
return getVal;
};
</script>
</head>
<body>
<div class="loader"><div class="loaderBar"></div></div>
<div class="main preloadImgs preloaderFunc:preloader preloaderCompleteFunc:preloaded" style="display:none;">
<img src="assets/001.jpg"/>
<img src="assets/002.jpg"/>
<img src="assets/003.jpg"/>
</div>
</body>
</html>
答案 0 :(得分:4)
您所能做的就是释放您所拥有的图像参考。无论是否丢弃飞行中的图像请求,都取决于浏览器的内部实现。清除事件处理程序至少会阻止您在加载图像时对其进行处理。您可以通过向对象添加cancel()
方法来清除所有引用,如下所示:
cancel: function() {
for (var i = 0; i < imgList.length; i++) {
// clean up any jQuery data and event handlers associated with this object
imgList[i].remove();
}
// clear out the imgList so all former array elements can be garbage collected
imgList = [];
}
答案 1 :(得分:1)
如果将加载器放在类中,则可以在单击链接时创建加载。任何以前的加载器都可以获得一个告诉它停止加载的属性。
这样的事情:
function Loader(gallery)
{
this.terminated = false;
this.load = function()
{
// Loading code.
for (loop condition)
{
// break if this.terminated becomes true.
}
}
}
var loader = null;
function preloadGallery(gallery)
{
// Tell the previous one to stop.
if (loader !== null)
loader.terminated = true;
// Start the new one.
loader = new Loader(gallery);
}
是的,在我看来,你正在使用与平常不同的技术来预加载图像。看看this page。