【问题标题】:Remove Event Listener method for a toggle删除切换的事件侦听器方法
【发布时间】:2018-01-15 02:42:53
【问题描述】:

我有一个简单的点击功能,当点击按钮时,用户无法滚动。这一切正常。该按钮虽然用作切换,但在切换的“其他”部分,即当用户再次单击时,我想删除停止用户使用 removeEventListener(); 方法滚动的事件侦听器。我在此方法中调用的函数不起作用?

我似乎无法找出问题所在?

codepen:https://codepen.io/emilychews/pen/MrBvzP

JS

var button = document.getElementById("button");

// function to be called and removed when button is clicked
function noscroll() {
    window.scrollTo(0, 0);
}

// TOGGLE EVENT LISTENER
var scrollToggle = false;

function toggleEventListener() {
    if (scrollToggle === false) {

        window.addEventListener("scroll", function(){
        noscroll();        
        }, false);

      scrollToggle = true;

    } else {

        window.removeEventListener("scroll", function(){
        noscroll();        
        }, false);

      scrollToggle = false;

    }
}

button.addEventListener("click", function() {
    toggleEventListener();
}, false)
body {margin: 0; padding: 0; height: 150vh;}

#button {font-family: arial;
  margin: 10px 0 0 30px;
  width: 100px;
  height: 50px;
  background: red;
  display: flex;
  justify-content: center;
  align-items: center;
  color: white;
  cursor: pointer;
}
<div id="button">Click Me</div>

【问题讨论】:

  • 这可以用6行代码来实现。您不必绑定和取消绑定事件侦听器。

标签: javascript html dom-events toggle


【解决方案1】:

我不相信你可以remove an anonymous event handler。您需要命名它,以便它知道哪个侦听器匹配。我们可以重用您的 noscroll 函数作为我们的命名处理程序。

尝试运行 sn-p,你会看到它有你预期的结果。

https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener

var button = document.getElementById("button");

// function to be called and removed when button is clicked
function noscroll() {
    window.scrollTo(0, 0);
}

// TOGGLE EVENT LISTENER
var scrollToggle = false;

function toggleEventListener() {
    if (scrollToggle === false) {
        window.addEventListener("scroll", noscroll, false);
        scrollToggle = true;
    } else {
        window.removeEventListener("scroll", noscroll, false);
        scrollToggle = false;
    }
}

button.addEventListener("click", function () {
    toggleEventListener();
}, false)
body {margin: 0; padding: 0; height: 150vh;}

#button {font-family: arial;
  margin: 10px 0 0 30px;
  width: 100px;
  height: 50px;
  background: red;
  display: flex;
  justify-content: center;
  align-items: center;
  color: white;
  cursor: pointer;
}
<div id="button">Click Me</div>

我们可以通过将检查scrollToggle 的逻辑移动到处理程序本身来进一步简化这一点。无需添加/删除处理程序。 (而且它可以保持匿名。)

var button = document.getElementById("button");

// TOGGLE EVENT LISTENER
var scrollToggle = false;

window.addEventListener("scroll", () => { 
  if (scrollToggle) {
    window.scrollTo(0, 0) 
  }
}, false);

function toggleEventListener() {
  scrollToggle = !scrollToggle;
}

button.addEventListener("click", function () {
  toggleEventListener();
}, false)
body {margin: 0; padding: 0; height: 150vh;}

#button {font-family: arial;
  margin: 10px 0 0 30px;
  width: 100px;
  height: 50px;
  background: red;
  display: flex;
  justify-content: center;
  align-items: center;
  color: white;
  cursor: pointer;
}
<div id="button">Click Me</div>

【讨论】:

    【解决方案2】:

    这个方法怎么样?

    window.removeEventListener("scroll", noscroll);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-04
      • 1970-01-01
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      • 2018-06-29
      • 2023-02-04
      • 2019-10-19
      相关资源
      最近更新 更多