因此警报为宽度和高度提供了未定义的值。我认为来自img.onload计算的图像的w和h值没有被传递给要返回的值,或者它可能会返回w和h 之前 onload计算它们:
function getMeta(url){
var w; var h;
var img=new Image;
img.src=url;
img.onload=function(){w=this.width; h=this.height;};
return {w:w,h:h}
}
// "http://snook.ca/files/mootools_83_snookca.png" //1024x678
// "http://shijitht.files.wordpress.com/2010/08/github.png" //128x128
var end = getMeta("http://shijitht.files.wordpress.com/2010/08/github.png");
var w = end.w;
var h = end.h;
alert(w+'width'+h+'height');
如何让警报显示正确的宽度和高度?
答案 0 :(得分:94)
function getMeta(url){
$("<img/>",{
load : function(){
alert(this.width+' '+this.height);
},
src : url
});
}
function getMeta(url){
var img = new Image();
img.onload = function(){
alert( this.width+' '+ this.height );
};
img.src = url;
}
function getMeta(url){
var img = new Image();
img.addEventListener("load", function(){
alert( this.naturalWidth +' '+ this.naturalHeight );
});
img.src = url;
}
将上述内容简单地用作:getMeta( "http://example.com/img.jpg" );
https://developer.mozilla.org/en/docs/Web/API/HTMLImageElement
答案 1 :(得分:19)
只需将回调作为参数传递:
function getMeta(url, callback) {
var img = new Image();
img.src = url;
img.onload = function() { callback(this.width, this.height); }
}
getMeta(
"http://snook.ca/files/mootools_83_snookca.png",
function(width, height) { alert(width + 'px ' + height + 'px') }
);
答案 2 :(得分:10)
w
函数中的h
和img.onload
变量与getMeta()
函数中的变量不在同一范围内。一种方法,如下:
小提琴:http://jsfiddle.net/ppanagi/28UES/2/
function getMeta(varA, varB) {
if (typeof varB !== 'undefined') {
alert(varA + ' width ' + varB + ' height');
} else {
var img = new Image();
img.src = varA;
img.onload = getMeta(this.width, this.height);
}
}
getMeta("http://snook.ca/files/mootools_83_snookca.png");
答案 3 :(得分:5)
ES6:您可以使用async/await
以类似序列的方式在getMeta
函数下方进行操作,并且可以按以下方式使用它(这与问题代码几乎相同) (我添加了await
关键字,并将变量end
更改为img
,并将var
更改为let
关键字。)您需要运行getMeta
await
仅来自async
函数(运行)。
function getMeta(url) {
return new Promise((resolve, reject) => {
let img = new Image();
img.onload = () => resolve(img);
img.onerror = reject;
img.src = url;
});
}
async function run() {
let img = await getMeta("http://shijitht.files.wordpress.com/2010/08/github.png");
let w = img.width;
let h = img.height;
size.innerText = w+' width, '+h+' height';
size.appendChild(img);
}
run();
<div id="size" />
答案 4 :(得分:0)
使用jQuery获取图像大小
(取决于哪种格式化方法更适合您的偏好):
function getMeta(url){
$('<img/>',{
src: url,
on: {
load: (e) => {
console.log('image size:', $(e.target).width(), $(e.target).height());
},
}
});
}
或
function getMeta(url){
$('<img/>',{
src: url,
}).on({
load: (e) => {
console.log('image size:', $(e.target).width(), $(e.target).height());
},
});
}