gpt4 book ai didi

在函数中返回未定义的 Javascript 原型(prototype)属性

转载 作者:太空宇宙 更新时间:2023-11-04 03:21:04 24 4
gpt4 key购买 nike

使用原型(prototype)继承创建图像旋转器,我不断在控制台中收到错误显示:TypeError: this.curPhoto is undefined this.curPhoto.removeClass('上一个');我把它放在用于切换重叠 div 位置的函数之一的回调函数中(彼此堆叠)这是代码:

    <script src='https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'></script>
<script src='ImageRotatorOOP.js' type='text/javascript'> </script>
<script type='text/javascript'>
$('document').ready(function() {
setInterval('rotateImages()', 2000);
});

function rotateImages() {
var imageRotator = new ImageRotator($('#photoShow'));
if(imageRotator.nextPhoto.length == 0) {
imageRotator.nextPhoto = imageRotator.container.children().first();
}

imageRotator.stackImages();
}
</script>

</head>
<body>
<h1> Image Rotator </h1>
<div id='photoShow'>
<div class='current'>
<img src='images/RoyMustang.jpg' alt='Roy Mustang' />
</div>
<div>
<img src='images/nhk.png' alt='Welcome to the NHK' />
</div>
<div>
<img src='images/dragonball_z.jpg' alt='Dragonball Z'/>
</div>
</div>
</body>
</html>

还有 .js 文件

    var ImageRotator = function(container) {
this.container = container;
this.curPhoto = this.container.find('div.current');
this.nextPhoto = this.curPhoto.next('div');
}

ImageRotator.prototype.stackImages = function() {
this.curPhoto.removeClass('current').addClass('previous');
this.nextPhoto.css({opacity: 0.0}).addClass('current').animate({opacity: 1.0}, 1000, function() {
this.curPhoto.removeClass('previous');
});
}

这是css文件

   #photoShow img {
width: 400px;
height: 300px;
}

#photoShow div {
position: absolute;
z-index: 0;
}

#photoShow div.previous {
z-index: 1;
}

#photoShow div.current {
z-index: 2;
}

最佳答案

在动画完成函数中,this 的值将是正在动画的 DOM 对象,而不是您的 ImageRotator 对象。您可以通过执行以下操作来解决该问题:

ImageRotator.prototype.stackImages = function() {
this.curPhoto.removeClass('current').addClass('previous');
var self = this;
this.nextPhoto.css({opacity: 0.0}).addClass('current').animate({opacity: 1.0}, 1000, function() {
self.curPhoto.removeClass('previous');
});
}

注意:这是回调函数的一个常见问题,因为 Javascript 中的每个函数调用都会为 this 设置一个新值,所以除非动画回调专门设计用于设置 this< 的值 到你想要的,它会被设置成别的东西。在嵌入回调之前将值保存到局部变量是一种常见的解决方法。您也可以使用 .bind() 来做类似的事情,但它是为您做的。

这是一个使用 .bind() 的例子:

ImageRotator.prototype.stackImages = function() {
this.curPhoto.removeClass('current').addClass('previous');
this.nextPhoto.css({opacity: 0.0}).addClass('current').animate({opacity: 1.0}, 1000, function() {
this.curPhoto.removeClass('previous');
}.bind(this));
}

关于在函数中返回未定义的 Javascript 原型(prototype)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27890183/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com