使用滑块内的按钮实现 carousel next 方法 (javascript)

materializecss carousel next method using button inside the slider (javascript)

我正在使用 materializecss carousel 我现在拥有的是 2 个按钮。 当我单击 "working" 按钮(轮播外)时,轮播转到下一张幻灯片。但是,当我单击 "not working" 按钮(在旋转木马内)时,它总是转到第一张幻灯片,即使您在第一张幻灯片中也是如此。

document.addEventListener("DOMContentLoaded", function() {
  var elems = document.querySelectorAll(".carousel");
  var instances = M.Carousel.init(elems);

  window.next = function() {
    var el = document.querySelector(".carousel");
    var l = M.Carousel.getInstance(el);
    l.next(1);
  }
});
<link href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
<div class="carousel">
  <a class="carousel-item red" href="#one!">
    <button class="btn next" onclick="next()">Not working</button>
  </a>
  <a class="carousel-item yellow" href="#two!"></a>
  <a class="carousel-item green" href="#three!"></a>
  <a class="carousel-item teal" href="#four!"></a>
  <a class="carousel-item blue" href="#five!"></a>
</div>
<button class="btn next" onclick="next()">Working</button>

我还使用了一种方法,如果我单击 "not working" 按钮,它将触发 "working" 按钮单击事件。遗憾的是,结果相同。 我想要的是 "not working" 按钮应该在不使用 jquery

的情况下转到下一张幻灯片

按钮元素内的每次点击,也是锚标记内的一次点击。 这两个元素都在执行相互冲突的操作,或者您不希望发生的操作。所以你必须停止其中之一。

一种方法是告诉每个按钮注册点击事件,并停止将点击事件告知其父元素,导致锚标记忽略点击。

由于您不想使用 jquery,因此您必须手动将此行为附加到每个元素。

var pages = document.querySelectorAll(".carousel-item button");

for(var i=0; i<pages.length;i++) {
    pages[i].addEventListener("click", function(e){
      e.stopPropagation();
    });
}


document.addEventListener("DOMContentLoaded", function() {
  var elems = document.querySelectorAll(".carousel");
  var instances = M.Carousel.init(elems);

  window.next = function() {
    var el = document.querySelector(".carousel");
    var l = M.Carousel.getInstance(el);
    l.next(1);
  }
});
<link href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
<div class="carousel">
  <a class="carousel-item red" href="#one!">
    <button class="btn next" onclick="next()">Not working</button>
  </a>
  <a class="carousel-item yellow" href="#two!"></a>
  <a class="carousel-item green" href="#three!"></a>
  <a class="carousel-item teal" href="#four!"></a>
  <a class="carousel-item blue" href="#five!"></a>
</div>
<button class="btn next" onclick="next()">Working</button>

这是针对 Materialise 版本 1.0.0

HTML 例子

                <a onclick="prev()" class="prev btn-floating btn waves-effect waves-light red"><i class="fas fa-chevron-left"></i></a>
    
                <a onclick="next()" class="next btn-floating btn waves-effect waves-light red"><i class="fas fa-chevron-right"></i></a>

            <div class="carousel carousel-slider center">
              <div class="carousel-fixed-item center">
                <a class="btn waves-effect white grey-text darken-text-2">button</a>
              </div>

              <div class="carousel-item amber white-text" href="#two!">
                <h2>Second Panel</h2>
                <p class="white-text">This is your second panel</p>
              </div>
              <div class="carousel-item green white-text" href="#three!">
                <h2>Third Panel</h2>
                <p class="white-text">This is your third panel</p>
              </div>
              <div class="carousel-item blue white-text" href="#four!">
                <h2>Fourth Panel</h2>
                <p class="white-text">This is your fourth panel</p>
              </div>
            </div>

Javascript 部分

//the function below are functions that run after the Dom Content has been loaded
          document.addEventListener('DOMContentLoaded', function() {
                M.AutoInit();

               

                //carousel activation
                var elems = document.querySelectorAll('.carousel');
                var xinstances = M.Carousel.init(elems, 
                {
                  fullWidth: true,
                  indicators: true,
                  numVisible: 3
                });

                //carousel Next function
                window.next = function() {
                  var el = document.querySelector(".carousel");
                  var l = M.Carousel.getInstance(el);
                  l.next(1);
                }

                //carousel previous function
                window.prev = function() {
                  var el = document.querySelector(".carousel");
                  var l = M.Carousel.getInstance(el);
                  l.prev(1);
                }
           }