jquery 为什么naturalHeight或naturalWidth返回`undefined`?

kuuvgm7e  于 2023-10-17  发布在  jQuery
关注(0)|答案(3)|浏览(109)

我的类分配希望我为我引用的脚本使用defer标记,但由于我的js文件中的执行顺序,这导致图像的naturalWidth未定义。
我的HTML在头部有这一行(赋值希望我把它放在<head>中,但使用defer="defer"<script src="scripts/script.js" defer="defer"></script>
我的js:

var catImageWidth = document.getElementById("cat-image").naturalWidth;
var birdImage = document.getElementById("bird-image");
birdImage.width = catImageWidth;

所以我试了这个:

var catImage = document.getElementById("cat-image");
var birdImage = document.getElementById("bird-image");
var catImageWidth;

catImage.onload = function() {
    catImageWidth = this.naturalWidth;
    console.log(catImageWidth) //logs 600
}

birdImage.width = catImageWidth; //logs `undefined`

我认为birdImage.width的赋值是未定义的,因为这行代码在catImage.onload实际发生之前运行。这是否意味着我只能在catImage.onloadfunction范围内分配birdImage.width
我尝试了catImage.onload = () => { //block of code }的ES6,但这似乎不起作用。

t3irkdon

t3irkdon1#

问题是你试图访问一个超出范围的变量。
请给予这个试试:

<img id="cat-image" src="https://static.pexels.com/photos/104827/cat-pet-animal-domestic-104827.jpeg">
<img id="bird-image" src="http://animalia-life.club/data_images/bird/bird3.jpg">

<script>
var catImage = document.getElementById("cat-image");
var birdImage = document.getElementById("bird-image");
var catImageWidth;

catImage.onload = function() {
    catImageWidth = this.naturalWidth;
    birdImage.width = catImageWidth;
}

console.log(birdImage.width);
</script>
dgiusagp

dgiusagp2#

这是否意味着我只能在catImage.onload函数的作用域内分配birdImage.width
似乎是这样,这是最好的办法。
您可以使用箭头函数,但不能使用this关键字来引用图像。

不工作:

catImage.onload = () => {
    catImageWidth = this.naturalWidth; //undefined
    console.log(catImageWidth)
}

因为在arrow函数中,this对象没有绑定到图像引用,它引用外部作用域的this

有效:

catImage.onload = function() {
    catImageWidth = this.naturalWidth;
    console.log(catImageWidth) //logs 600
}

或:

catImage.onload = function() {
    catImageWidth = catImage.naturalWidth;
    console.log(catImageWidth) //logs 600
}
wtlkbnrh

wtlkbnrh3#

这也可以使用JQuery(请注意,我先保存元素引用(我正在使用一个维护此元素的JS类),然后我需要正确地获取onLoad函数中包含naturalWidth的对象:
DOM构建后获取引用:

this._imageElement = $(this._htmlElement).find("img.theImage:first");
$(this._imageElement).on('load', this._onImageLoaded.bind(this));

后者:

_onImageLoaded() {
   this._imageWidth = this._imageElement[0].naturalWidth;
   this._imageHeight = this._imageElement[0].naturalHeight;
}

相关问题