2016-11-27 32 views
0

首先,我有這個代碼input.addEventListener不是函數與

var input = document.querySelector("fieldset > input"); 
var label = document.querySelector("fieldset > label"); 

input.addEventListener("focus", function(event) { 
    if (label.classList.contains("label-blur")) { 
    label.classList.remove("label-blur"); 
    label.classList.add("label-focus"); 
    } else { 
    label.classList.add("label-focus"); 
    } 
}); 

input.addEventListener("blur", function(event) { 
    if (!input.value) { 
    label.classList.remove("label-focus"); 
    } else { 
    label.classList.add("label-blur"); 
    } 
}); 

它正常工作。

然後我改變'querySelector''querySelectorAll'。 我發現信息,addEventListener不能與querySelectorAll(JS error object has no method addEventListener)一起使用。 所以分辨率是這樣的:

var input = document.querySelectorAll("fieldset > input"); 
var label = document.querySelectorAll("fieldset > label"); 


for(var i=0; i < input.length; i++) { 
    input[i].addEventListener("focus", function(event) { 
    if (label.classList.contains("label-blur")) { 
     label.classList.remove("label-blur"); 
     label.classList.add("label-focus"); 
    } else { 
     label.classList.add("label-focus"); 
    } 
    }); 

    input[i].addEventListener("blur", function(event) { 
    if (!input.value) { 
     label.classList.remove("label-focus"); 
    } else { 
     label.classList.add("label-blur"); 
    } 
    }); 
}; 

可是這樣一來我有新的錯誤:

  • 遺漏的類型錯誤:無法讀取屬性「包含」未定義
  • 遺漏的類型錯誤的:無法讀取屬性'刪除'未定義

請讓我知道,如何解決這個問題。

我tryed這種方式(由康納黑斯廷斯推薦):

for(var i=0; i < input.length; i++) { 
     input[i].addEventListener("focus", function(event) { 
     for(var j=0; j < label.length; j++) { 
      if (label[j].classList.contains("label-blur")) { 
      label[j].classList.remove("label-blur"); 
      label[j].classList.add("label-focus"); 
      } else { 
      label[j].classList.add("label-focus"); 
      } 
     }; 
     }); 

     input[i].addEventListener("blur", function(event) { 
     for(var j=0; j < label.length; j++) { 
      if (!input.value) { 
      label[j].classList.remove("label-focus"); 
      } else { 
      label[j].classList.add("label-blur"); 
      } 
     }; 
     }); 
    }; 

它的工作好,但每一個 '的addEventListener' 作品是錯誤的。現在只需「標籤焦點」正在工作。它對我的每一個工作(如果任何輸入:焦點,每個標籤顯示)。

而'讓j = i'代替'for(var j = 0; j < label.length; j ++)'什麼也不做。

+2

'升abel [i]'會在相同的索引處爲你指定標籤,儘管你需要使用'let'而不是'var',這樣'i'就被限制在每個循環迭代中。 – 2016-11-27 13:11:29

+0

...另外'if(input [i] .value){...',或者簡單地'if(this.value){...' – 2016-11-27 13:13:31

回答

0

你在for循環,你需要爲了得到在相同的索引標籤爲標籤的輸入與標籤做訪問通過i輸入同樣的方式節點列表

你也必須做同樣的事情,輸入[I]事件偵聽器的內部

for(var i=0; i < input.length; i++) { 
    input[i].addEventListener("focus", function(event) { 
    if (label[i].classList.contains("label-blur")) { 
     label[i].classList.remove("label-blur"); 
     label[i].classList.add("label-focus"); 
    } else { 
     label[i].classList.add("label-focus"); 
    } 
    }); 

    input[i].addEventListener("blur", function(event) { 
    if (!input[i].value) { 
     label[i].classList.remove("label-focus"); 
    } else { 
     label[i].classList.add("label-blur"); 
    } 
    }); 
}; 
+0

謝謝你,我已經做了,但是有些事情是錯誤的。我加了問題。 – spp

+0

@spp我編輯了我的評論,揭示了我的意思 –

+0

input [i] .value - 錯誤「Uncaught TypeError:無法讀取未定義的屬性'值'。 – spp

-1
var inputs = document.querySelectorAll("fieldset > input"), 
    labels = document.querySelectorAll("fieldset > label"); 


for(var i=0; i < inputs.length; i++) { 
    var input = inputs[i], 
     label = labels[i]; 
    input.addEventListener("focus", function(event) { 
    var input = this.input, 
     label = this.label; 
    if (label.classList.contains("label-blur")) { 
     label.classList.remove("label-blur"); 
     label.classList.add("label-focus"); 
    } else { 
     label.classList.add("label-focus"); 
    } 
    }.bind({input: input, label: label})); 

    input.addEventListener("blur", function(event) { 
    var input = this.input, 
     label = this.label; 
    if (!input.value) { 
     label.classList.remove("label-focus"); 
    } else { 
     label.classList.add("label-blur"); 
    } 
    }.bind({input: input, label: label})); 
}; 

如果使用ES6,那麼你應該使用let而不是無功後的for循環

+0

你確定這真的會起作用嗎?當匿名函數被執行時,'input'將會有最終的值。 – 2016-11-27 13:40:05

+0

它不起作用。 – spp

+0

該函數的綁定將使其匿名函數接收正確的值... PLZ再試一次! – rafaelcastrocouto