我正在开发一个使用纯javascript制作滑块的个人项目。但是js代码不起作用。当我单击下一个按钮时,控制台会显示next()不是函数的错误。与Previous按钮相同,它表示prev()未定义。 我尽力而为,但我无法找到答案。令我感到困惑的是,我已经声明了这两个函数,但是在单击时,我收到一个函数不是函数的错误。
main.js:38 Uncaught TypeError:next不是函数 在HTMLElement。 (main.js:38)
JS代码:
var next = document.getElementById("next");
var prev = document.getElementById("prev");
var ulist = document.getElementsByTagName("ul").lastChild;
var ulist1 = document.getElementsByTagName("ul").firstChild;
var slides = document.querySelectorAll("li");
for(var i=0; i<3; i++){
slides[i].style.display = 'none';
}
slides[0].classList.add("active");
document.getElementsByClassName("active")[0].style.display = "block";
function next() {
document.getElementsByClassName("active")[0].classList.add("oldActive");
document.getElementsByClassName("active")[0].classList.remove("active");
if(Object.is(document.getElementsByClassName("oldActive")[0]) , ulist){
slides[0].classList.add("active");
}
else{
document.getElementsByClassName("oldActive")[0].nextElementSibling.classList.add("active");
}
}
function prev() {
document.getElementsByClassName("active")[0].classList.add("oldActive");
document.getElementsByClassName("active")[0].classList.remove("active");
if(Object.is(document.getElementsByClassName("oldActive")[0]) , ulist1){
slides[2].classList.add("active");
}
else{
document.getElementsByClassName("oldActive")[0].previousElementSibling.classList.add("active");
}
}
next.addEventListener('click' , function() {
next();
});
prev.addEventListener('click' , function() {
prev();
});
HTML代码:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Image/Content Slider with Pure JS</title>
<link rel="stylesheet" href="css/style.css">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.0.13/css/all.css" integrity="sha384-DNOHZ68U8hZfKXOrtjWvjxusGo9WQnrNx2sqG0tfsghAvtVlRW3tvkXWZh58N9jp" crossorigin="anonymous">
</head>
<body>
<header>
<h1>A Responsive Image/Content Slider</h1>
<p>It is made with HTML5, CSS3 and JavaScript</p>
</header>
<div class="left">
<h1><i class="fas fa-arrow-left" id="prev"></i></h1>
</div>
<main>
<div class="slider">
<ul class="slides" id="slidelist">
<li class="slide 1" name="slideo"><img src="images/hero_bg.jpeg" alt=""></li>
<li class="slide 2" name="slideo"><img src="images/hero_bg1.jpeg" alt=""></li>
<li class="slide 3" name="slideo"><img src="images/hero_bg1.jpeg" alt=""></li>
</ul>
</div>
</main>
<div class="right">
<h1><i class="fas fa-arrow-right" id="next"></i></h1>
</div>
<script type="text/javascript" src="js/main.js"></script>
</body>
</html>
答案 0 :(得分:0)
你有下一个和上一个的重复名称 - 一个作为元素,后来作为函数。将其中一个重命名为其他内容以避免命名冲突。
例如:
var next = document.getElementById("next");
var prev = document.getElementById("prev");
到
var nextEl = document.getElementById("next");
var prevEl = document.getElementById("prev");
答案 1 :(得分:0)
工作小提琴:https://jsfiddle.net/o61pbg0z/
问题是
var next = document.getElementById("next");
var prev = document.getElementById("prev");
并且
function next() {
document.getElementsByClassName("active")[0].classList.add("oldActive");
document.getElementsByClassName("active")[0].classList.remove("active");
if(Object.is(document.getElementsByClassName("oldActive")[0]) , ulist){
slides[0].classList.add("active");
}
else{
document.getElementsByClassName("oldActive")[0].nextElementSibling.classList.add("active");
}
}
function prev() {
document.getElementsByClassName("active")[0].classList.add("oldActive");
document.getElementsByClassName("active")[0].classList.remove("active");
if(Object.is(document.getElementsByClassName("oldActive")[0]) , ulist1){
slides[2].classList.add("active");
}
else{
document.getElementsByClassName("oldActive")[0].previousElementSibling.classList.add("active");
}
}
因此,尝试给他们两个不同的名字
失败原因: 在JavaScript中,函数声明和变量声明都被提升到函数的顶部(如果在函数中定义),或者全局上下文的顶部(如果在函数外部)。函数声明优先于变量声明(但不是变量赋值)。