0

編輯#2目標: 的問題不存在了。這是某種範圍的問題。但現在它正在工作。我很抱歉給您帶來不便。事件代表團,這是爲什麼不工作,通過ID


在我的腳本的某一部分有一個事件代表團,並通過ID指定目標。但是當我運行它。行if(evt.target.id == ("subtaskSubmit" + subtaskCounter))似乎根本不工作。這裏是我的代碼:

var subtaskCounter = 0; 
aWholeTask.addEventListener("click", function(evt){   
      //other event targets specifications .. 

       if(evt.target.id == "divide"){ 
        var subtaskInput = document.createElement("input"), 
        subtaskSubmit = document.createElements.button("submit"), // this is a special function i've made, don't bother about it. I've used it all over the place and it's working normally. 
        subtaskContainer = document.createElement("p"); 
        subtaskContainer.style.marginLeft = "40px"; 
        subtaskInput.id = "subtaskInput" + (++subtaskCounter); 
        subtaskInput.type = "text"; 

        subtaskSubmit.id = "subtaskSubmit" + subtaskCounter; 
        subtaskContainer.appendChildren(subtaskInput,subtaskSubmit);     
        aWholeTask.appendChild(subtaskContainer); 
       } 

       if(evt.target.id == ("subtaskSubmit" + subtaskCounter)){ 
        //this event is the one that not working when i press on that element 
        alert("hello");      

       } 
     }); 

編輯: 我已經做了一些修改調試代碼,結果是奇怪的:

var subtaskCounter = 0; 
aWholeTask.addEventListener("click", function(evt){   
      //other event targets specifications .. 

       if(evt.target.id == "divide"){ 
        var subtaskInput = document.createElement("input"), 
        subtaskSubmit = document.createElements.button("submit"), // this is a special function i've made, don't bother about it. I've used it all over the place and it's working normally. 
        subtaskContainer = document.createElement("p"); 
        subtaskContainer.style.marginLeft = "40px"; 
        subtaskInput.id = "subtaskInput" + (++subtaskCounter); 
        subtaskInput.type = "text"; 

        subtaskSubmit.id = "subtaskSubmit" + subtaskCounter; 
        subtaskContainer.appendChildren(subtaskInput,subtaskSubmit);     
        aWholeTask.appendChild(subtaskContainer); 
       } 


        if(evt.target.innerHTML == "Submit"){ 

         alert(evt.target.id == ("subtaskSubmit" + subtaskCounter)); 
         //And this surprisingly returns false !   
        } 
      }); 

那麼,爲什麼evt.target.id == ("subtaskSubmit" + subtaskCounter)回報false

+0

爲什麼你有作爲事件處理程序的自我調用函數? – 2012-07-30 17:56:03

+0

我只是不希望這兩個事件的變量對其他事件可見。 – 2012-07-30 17:56:44

+0

我看到,還有其他處理程序...每個編號爲 – 2012-07-30 17:57:18

回答

0

看起來問題是因爲您正在通過一些處理程序共享subtaskCounter。圍繞撥打aWholeTask.addEventListener("click", ...)的電話有沒有迴路?

如果有,那麼在調用點擊處理程序時,subTaskCounter將始終指向導致其退出循環的值。

var subtaskCounter = 0; 
while (subCounter < 5) { 
    aWholeTask.addEventListener("click", function(evt){ 
     console.log(subTaskCounter); 
    }); 
    subTaskCounter ++; 
} 

在上面的例子中,你會發現,subTaskCounter永遠是5時,點擊處理函數(即導致循環結束時的值)。這是所有處理程序共享的相同變量。如果這確實是你的問題,你需要凍結你的關閉。這是一種使用自我調用匿名函數的方法。

var subtaskCounter = 0; 
while (subCounter < 5) { 
    aWholeTask.addEventListener("click", (function(frozenSubTaskCounter) { 
     return function(evt){ 
      console.log(frozenSubTaskCounter); 
     }; 
    })(subTaskCounter)); 
    // The line above creates a separate closure `frozenSubTaskCounter` 
    // for each of the handlers 
    subTaskCounter ++; 
} 

在上面的例子中,你會看到console.log()將輸出您的預期值。

+0

這正是我正在尋找的,可悲的是我不能在我正在寫的腳本中實現閉包。我想我以OOP的方式重新編寫代碼。所以有一個功能可以添加和刪除任務和子任務,而且我肯定會在那裏實現關閉。再次感謝 :) – 2012-07-31 20:46:52