var rnd = Math.round((Math.random() * (1153 - 1) + 1));
while(!IsValidImageUrl("/engine/achigen/i/"+rnd+".png"))
rnd = Math.round((Math.random() * (1153 - 1) + 1));
$("#achieve a img").attr("src", "/engine/achigen/i/"+rnd+".png");
我希望在页面加载时将指定的图像替换为其他图像。我有图像1.png..1153.png,但我需要检查图像src是否有效。
function IsValidImageUrl(url) {
$("#achieve a img", {
src: url,
error: return false,
load: return true
});
}
我怎么做?我的方式错了
答案 0 :(得分:1)
你可以做的是创建一个递归/回调函数,它会重复自己,直到找到有效的URL。对于回调,使用promise模式很方便。
考虑这个应该做的技巧的例子:
function IsValidImageUrl(url, success, error) {
return $.Deferred(function () {
$("#achieve a img", {
src: url,
error: this.reject,
load: this.resolve
});
}).promise();
}
function generateImage() {
var rnd = Math.round((Math.random() * (1153 - 1) + 1));
return IsValidImageUrl("/engine/achigen/i/" + rnd + ".png").then(function() {
return "/engine/achigen/i/" + rnd + ".png";
}, generateImage);
}
generateImage().then(function(url) {
console.log('valid url', url);
});
在此示例中,IsValidImageUrl
返回一个Promise对象,如果url有效/无效,则该对象可以解析或拒绝。帮助generageImage
用于调用IsValidImageUrl
,直到找到有效图像。
答案 1 :(得分:0)
您可以在js中创建每个图像并监听onload,onerror事件。请记住,创建1153个图像肯定会让浏览器向你吐口水。
function loadImage(i){
var img = new Image();
img.onload = function(){
// image exists, do something with it, eg.
// $('.container').append(this); or
// $("#achieve a img").attr("src", this.src);
};
img.onerror = function(){
// image does not exist, do something about it, eg.
// load another one
// var anotherRandomNumber = Math.ceil(Math.random() * 1153));
// loadImage(anotherRandomNumber);
};
img.src = "/engine/achigen/i/" + i + ".png";
}
var randomNumber = Math.ceil(Math.random() * 1153));
loadImage(randomNumber);