我正在创建一个网页,允许用户输入 URL 并从 URL 中提取图像,例如 Facebook 或 pinterest 和 thefancy.com。您输入一个 URL,他们会为您获取宽度大于指定宽度的图像。
我的代码都是 jQuery,不需要确定图像大小并且工作正常。我还应该说我的 javascript 知识非常有限。
当用户点击回车时,页面向服务器端脚本发出一个 ajax 请求(使用 jQuery),并接收一个包含从页面中提取的图像源数组的 json 对象。在 ajax.success 回调中,我将此图像数组传递给使用 jquery append() 方法将图像动态添加到 DIV 的方法。
// server script errors are also reported inside
// ajax success callback
success: function(response){
switch(response.code) {
case 401 :
webgloo.sc.ImageSelector.showMessage(response.message,{"css":"color-red"});
break ;
case 200 :
webgloo.sc.ImageSelector.processUrlFetch(response);
break ;
default:
webgloo.sc.ImageSelector.showMessage(response.message,{"css":"color-red"});
break ;
}
},
我试图在成功回调处理程序中获取图像大小。在阅读了 SO 之后,我添加了一个图像加载处理程序,并且在该图像加载处理程序中,我有一个回调 addImage(),它增加了一个 num_added 变量。稍后我想使用这个 num_added 变量来确定向用户显示什么样的消息。
问题是 showNextMessage() 不会等待 processUrlFetch() 中的循环完成。调用 processUrlFetch() 后立即触发 showNextMessage()。因此,我总是显示“未找到图像”消息。
我曾尝试研究该主题,但在这里我的深度不够。我认为混合 jquery 和 DOM 事件可能是一个问题。另外,我不确定我通过 image.load() 获取图像大小的方法有多防弹。我也不知道 imagesloaded 插件是否会帮助我的事业。
我有两个问题
- 如果我在这里为动态插入的图像获取“真实”图像大小所做的是一种有效的跨浏览器技术(依赖于 img.load 事件)
- 如何确保仅在循环完成后触发 showNextMessage()?
processesUrlFetch : function(response) { var images = response.images ;
for(i = 0 ; i < images.length ; i++) {
var img = new Image();
/* trouble part */
img.onload = function() {
if((this.width >= 300) && (this.height >= 300 )) {
webgloo.sc.ImageSelector.addImage(this.src);
}
}
img.src = images[i] ;
webgloo.imagep.src = images[i] ;
}
webgloo.sc.ImageSelector.showNextMessage();
},
showNextMessage : function() {
if(webgloo.sc.ImageSelector.num_added > 0 ) {
$("#stack").fadeIn("slow");
$("#next-message").fadeIn("slow");
} else {
var message = "No image of appropriate size found!";
webgloo.sc.ImageSelector.showMessage(message, {"css":"color-red comment-text"});
}
},
addImage : function(image) {
webgloo.sc.ImageSelector.num_added++ ;
var index = webgloo.sc.ImageSelector.num_added ;
if(webgloo.sc.ImageSelector.debug) {
console.log("Adding image : " + index + " : " + image);
}
var buffer = this.imageDiv.supplant({"srcImage":image, "id":index } );
// logo, small icons etc. are first images in a page
// what we are interested in will only come later.
$("div#stack .images").prepend(buffer);
this.bucket[index] = { "id":index, "srcImage": image, "selected" : false} ;
},
如果您想查看完整代码 - 这是要点:- https://gist.github.com/3084904