簡體   English   中英

如何添加,刪除和重新添加事件偵聽器?

[英]How to add an event listener, remove it, and add it again?

我有一個可以顯示當前月份的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);

      }

好吧,我認為一種更簡單的方法是不刪除點擊監聽器,而是在增加/減少當前月份之前立即返回。

因此,例如下個月的處理程序將是:

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

從可用性的角度來看,一種簡單且更優雅的解決方案是僅添加另一個事件處理程序,對於每個“下個月”和“上個月”按鈕,在達到限制之一時將其停用。 這樣,瀏覽器將為您完成工作(不允許用戶單擊它們),並且用戶還將獲得視覺反饋,表明他們已達到極限。

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;
    }
}

只需在您現有的兩個按鈕的事件處理程序中調用此函數即可。

我沒有檢查此功能,也許您甚至可以對其進行一點優化,但是這是我要的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM