为什么另一个实例方法调用没有 运行?
Why another instance method call doesn't run?
在我的 JavaScript 中,我有一个用于 Image
class 的 move()
方法,它应该为 Image
class,当他们的 move()
方法被调用时,参数是他们的数字 id
s,
第一次调用方法 Image1.move(1);
并在 move()
方法中为第一个 Image
实例设置动画,但是,我已将下一个实例声明为 运行 move()
方法的参数是 id
,但除了实例 Image1
之外,没有其他实例 运行 调用 move()
方法,为什么会这样?以及如何在调用时将其他实例设为 运行 move()
方法?
document.addEventListener('DOMContentLoaded', function (event) {
let slidingChoices = {
slideCount: 3,
slidingDuration: 1000,
slidePause: 2500,
}
let sliderWrapper = document.getElementsByClassName('slider-wrapper')[0];
let sliderWrapperWidth = sliderWrapper.offsetWidth;
class Image {
constructor(_src, _id) {
this.src = _src;
this.id = _id;
this.appear()
}
appear() {
let img = document.createElement('img');
img.setAttribute("src", this.src);
img.id = this.id;
img.classList.add('img');
sliderWrapper.appendChild(img);
img.style.left = `${sliderWrapperWidth}px`;
img.onload = function() {
sliderWrapper.style.height = `${img.height}px`;
}
document.getElementById('1').style.left = '0';
}
move(which) {
let NextImageNumber;
window.onload = function() { document.getElementById(which).style.left = '0px';
document.getElementById(which).style.transition = slidingChoices.slidingDuration + 'ms';
if (document.getElementById(which).style.left === '0px') {
setTimeout(function () {
document.getElementById(which).style.left = -sliderWrapperWidth + 'px';
document.getElementById(which).style.transition = slidingChoices.slidingDuration + 'ms'; document.addEventListener('transitionend', () => {
document.getElementById(which).style.left = sliderWrapperWidth + 'px';
document.getElementById(which).style.transition = 'none';
});
// Here is the problem
NextImageNumber = (which + 1 < slidingChoices.slideCount ) ? which + 1 : 1;
eval(`Image${NextImageNumber}.move(${NextImageNumber})`);
},slidingChoices.slidePause)
}
}
}
}
for (let i = 1; i <= slidingChoices.slideCount; i++) {
eval(`Image${i} = new Image('https://via.placeholder.com/200/FFFF00/000000?Text=WebsiteBuilders.com', '${i}')`);
}
Image1.move(1);
});
*{
padding: 0;
margin: 0;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.slider-wrapper{
position: relative;
max-width: 200px;
margin: 50px auto;
box-sizing: content-box;
border: 1px solid #000;
}
.slider-wrapper img{
position: absolute;
display: block;
}
<div class="slider-wrapper">
</div>
Image
是内置 JS class 的名称,在严格模式下 eval
将无法访问您覆盖的 class,因此它正在调用本机图像 class 而不是您定义的图像,本机图像没有 move
方法。您可能应该重命名 class.
此外,不会在您每次调用 move()
时调用 window.onload
。那应该在顶层,而不是在你的移动方法中。
在我的 JavaScript 中,我有一个用于 Image
class 的 move()
方法,它应该为 Image
class,当他们的 move()
方法被调用时,参数是他们的数字 id
s,
第一次调用方法 Image1.move(1);
并在 move()
方法中为第一个 Image
实例设置动画,但是,我已将下一个实例声明为 运行 move()
方法的参数是 id
,但除了实例 Image1
之外,没有其他实例 运行 调用 move()
方法,为什么会这样?以及如何在调用时将其他实例设为 运行 move()
方法?
document.addEventListener('DOMContentLoaded', function (event) {
let slidingChoices = {
slideCount: 3,
slidingDuration: 1000,
slidePause: 2500,
}
let sliderWrapper = document.getElementsByClassName('slider-wrapper')[0];
let sliderWrapperWidth = sliderWrapper.offsetWidth;
class Image {
constructor(_src, _id) {
this.src = _src;
this.id = _id;
this.appear()
}
appear() {
let img = document.createElement('img');
img.setAttribute("src", this.src);
img.id = this.id;
img.classList.add('img');
sliderWrapper.appendChild(img);
img.style.left = `${sliderWrapperWidth}px`;
img.onload = function() {
sliderWrapper.style.height = `${img.height}px`;
}
document.getElementById('1').style.left = '0';
}
move(which) {
let NextImageNumber;
window.onload = function() { document.getElementById(which).style.left = '0px';
document.getElementById(which).style.transition = slidingChoices.slidingDuration + 'ms';
if (document.getElementById(which).style.left === '0px') {
setTimeout(function () {
document.getElementById(which).style.left = -sliderWrapperWidth + 'px';
document.getElementById(which).style.transition = slidingChoices.slidingDuration + 'ms'; document.addEventListener('transitionend', () => {
document.getElementById(which).style.left = sliderWrapperWidth + 'px';
document.getElementById(which).style.transition = 'none';
});
// Here is the problem
NextImageNumber = (which + 1 < slidingChoices.slideCount ) ? which + 1 : 1;
eval(`Image${NextImageNumber}.move(${NextImageNumber})`);
},slidingChoices.slidePause)
}
}
}
}
for (let i = 1; i <= slidingChoices.slideCount; i++) {
eval(`Image${i} = new Image('https://via.placeholder.com/200/FFFF00/000000?Text=WebsiteBuilders.com', '${i}')`);
}
Image1.move(1);
});
*{
padding: 0;
margin: 0;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.slider-wrapper{
position: relative;
max-width: 200px;
margin: 50px auto;
box-sizing: content-box;
border: 1px solid #000;
}
.slider-wrapper img{
position: absolute;
display: block;
}
<div class="slider-wrapper">
</div>
Image
是内置 JS class 的名称,在严格模式下 eval
将无法访问您覆盖的 class,因此它正在调用本机图像 class 而不是您定义的图像,本机图像没有 move
方法。您可能应该重命名 class.
此外,不会在您每次调用 move()
时调用 window.onload
。那应该在顶层,而不是在你的移动方法中。