老师请检查
来源:5-2 自由编程
月入过亿
2022-11-18 10:26:34
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Class 的应用</title>
<link rel="stylesheet" href="./slider.css" />
</head>
<body>
<div class="slider-layout">
<div class="slider">
<div class="slider-content">
<div class="slider-item">
<a href="javascript:;"><img src="./imgs/1.jpg" alt="1" class="slider-img" /></a>
</div>
<div class="slider-item">
<a href="javascript:;"><img src="./imgs/2.jpg" alt="1" class="slider-img" /></a>
</div>
<div class="slider-item">
<a href="javascript:;"><img src="./imgs/3.jpg" alt="1" class="slider-img" /></a>
</div>
<div class="slider-item">
<a href="javascript:;"><img src="./imgs/4.jpg" alt="1" class="slider-img" /></a>
</div>
</div>
<!-- 左右按钮 -->
<a href="javascript:;" class="leftbtn" id="leftbtn"><</a>
<a href="javascript:;" class="rightbtn" id="rightbtn">></a>
</div>
</div>
<script src="./base.js"></script>
<script>
// console.log(BaseSlider);
const leftbtn = document.querySelector('.leftbtn');
const rightbtn = document.querySelector('.rightbtn');
const slider = document.querySelector('.slider');
// 继承(原始幻灯片)父类的方法
class Slider extends BaseSlider {
constructor(el, options) {
super(el, options);
// 调用自己的方法
this._bindEvent();
this._leftbtn();
this._rightbtn();
this._slider();
}
_bindEvent() {
document.addEventListener('keyup', e => {
console.log(e.keyCode);
// ← A
if (e.keyCode === 37 || e.keyCode === 65) {
this.prev()
}
// → D
else if (e.keyCode === 39 || e.keyCode === 68) {
this.next();
}
})
}
_leftbtn() {
leftbtn.addEventListener('click', ()=>{
this.prev();
console.log(this);
})
}
_rightbtn() {
rightbtn.addEventListener('click', () => {
this.next();
})
}
_slider(){
slider.addEventListener('mouseenter',()=>{
leftbtn.style.display='block';
rightbtn.style.display='block';
})
slider.addEventListener('mouseleave',()=>{
leftbtn.style.display='none';
rightbtn.style.display='none';
})
}
}
// 实例化对象
new Slider((slider), {
initialIndex: 1,
animation: true,
speed: 2000
})
</script>
</body>
</html>老师我还有个问题,左右按钮的点击事件,为啥换成普通函数之后就会报错,显示没有this.prev()这个方法,换成箭头函数就没有错误了
1回答
同学你好,代码是对的,很棒,问题回复如下:
事件处理函数,如果使用普通函数,那么里面的this指向dom元素:

该规则,之前讲过,可以回顾一下:
https://class.imooc.com/lesson/2124#mid=50533
此时this.next,就是获取“rightbtn上的next方法”。由于next方法处于实例上,而非dom元素rightbtn上,所以this.next无法获取到,会报错。
换成箭头函数后,由于箭头函数中this没有具体指向,需要沿着作用域链查找this指向谁:


因此换成箭头函数后,this就会指向实例:

此时this.next,就是获取“实例上的next方法”,因此可以正常获取到。
祝学习愉快!