【问题标题】:How to add an event listener, remove it, and add it again?如何添加事件侦听器,将其移除,然后再次添加?
【发布时间】:2016-07-14 15:38:10
【问题描述】:

我有一个显示当前月份的 chrome 日历应用程序。我也有下个月和上个月的按钮,可以根据显示的月份进入下个月和上个月。但是,我只希望日历到当年的 12 月和当年的 1 月,所以在用户点击 12 月/1 月后,我删除了事件处理程序。但是,当不是 12 月或 1 月时,我需要再次添加事件处理程序。我该怎么做?

var count = 0;


var updated = setInterval(function() {

 var v = document.getElementById("CalendarMonth").innerHTML;

 updatedMonth = months.indexOf(v);

}, 1000);




document.getElementById("nextMonth").addEventListener("click", nxtMonth);

function nxtMonth()
{
  count = count +1;


     if(nextMonth == 11)
   {
      console.log("the year has ended!");
      document.getElementById("nextMonth").removeEventListener("click", nxtMonth);
    }

 else
 {
   nextMonth = updated + count;
//ideally, this would work. But for some reason it does not
   document.getElementById("nextMonth").addEventListener("click", nxtMonth); 

 } 

document.getElementById("previousMonth").addEventListener("click",    prevMonth);

function prevMonth()
{
  count = count -1;


 if(previousMonth == -1)
      {
        console.log("the year has just started!");

                  document.getElementById("previousMonth").removeEventListener("click", prevMonth);
      }
      else if(count==-1)
      {
        previousMonth =1;
      }

      else
      {
          previousMonth = updated + count;
           document.getElementById("previousMonth").addEventListener("click", prevMonth);

      }

【问题讨论】:

    标签: javascript google-chrome javascript-events event-handling


    【解决方案1】:

    嗯,我认为更简单的方法是不删除点击侦听器,而是在增加/减少当前月份之前立即返回。

    例如,下个月的处理程序将是:

    if (nextMonth == 11) {
        return;
    }
    count++;
    

    【讨论】:

      【解决方案2】:

      从可用性的角度来看,一个简单且更优雅的解决方案是添加另一个事件处理程序,每个“下个月”和“前几个月”按钮一个,以便在达到其中一个限制时停用它们。这样,浏览器将为您完成工作(它不允许用户点击它们),并且用户还将获得他们已达到限制的视觉反馈。

      function checkMonth(currentMonth)
      {
          if(currentMonth == 12){
              document.getElementById("nextMonth").disabled = true;
          } else {
              document.getElementById("nextMonth").disabled = false;
          }
      
          if(currentMonth == 1){
              document.getElementById("previousMonth").disabled = true;
          } else {
              document.getElementById("previousMonth").disabled = false;
          }
      }
      

      只需在两个按钮的现有事件处理程序中调用此函数即可。

      我没有检查过这个功能,也许你甚至可以稍微优化一下,但这是我会采用的方法。

      【讨论】:

      • 这几乎可以完美运行,但是,“计数”会变得一团糟,因为您可以继续按下按钮,从而增加计数。一旦达到 11,是否有重新开始计数?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2022-07-21
      • 1970-01-01
      相关资源
      最近更新 更多