我猜我在思考中有一个基本错误,但我就是无法绕过它。
我有几个文本字段,我想向其中添加一个EventListener。我把它们都放在一个类中,并将EventListener添加到这个类中。当选择的事件是"点击"时,每件事都是完美的。但当我把它改为"专注"时,什么都不会发生。为什么?
这项工作:
document.getElementById('parent').addEventListener('click', emptyField, false);
这不是:
document.getElementById('parent').addEventListener('focus', emptyField, false);
文本字段:
function emptyField(e){
var clicked = e.target;
if (clicked.value == clicked.name) {
clicked.value='';
if (clicked.id=='password') {
clicked.type='password';
}
}
}
<class id="parent">
<input type="text" name="USERNAME" id="username" value="USERNAME"><br>
<input type="text" name="PASSWORD" id="password" value="PASSWORD" ><br>
</class>
click
事件冒泡到祖先元素。
focus
事件没有,而是<input>
被聚焦,而不是外部元素。
我认为您必须使用querySelectorAll()
,它将返回所有input
s:
var fields = document.querySelectorAll('#parent input');
并使用循环将focus
事件附加到每个字段:
for (var i = 0; i < fields.length; i++) {
fields[i].addEventListener('focus', emptyField, false);
}
希望这能有所帮助。
如果您想在没有显式循环的情况下将事件附加到多个元素,可以使用一个辅助函数:
function attachEvents(elementList, eventName, handlerFunction) {
if(typeof elementList == "string")
elementList = document.querySelectorAll(elementList);
for(var i = 0; i < elementList.length; i++)
elementList[i].addEventListener(eventName, handlerFunction);
}
你这样称呼它:
attachEvents("#area button", "click", function(event) {
this.style.backgroundColor = "red";
});
或者像这样:
attachEvents(document.getElementById("area").getElementsByTagName("button"), "click", function(event) {
this.style.backgroundColor = "red";
});
你并不总是想要document.querySelectorAll
——自己做意味着你也可以做some_element.querySelectorAll
之类的事情,这在处理尚未成为文档一部分或没有唯一选择器的事情时非常好。
但是不管怎样,把循环放在一个helper函数中可以得到jquery风格的一行代码,而不需要一个巨大的库,它只是几行简单的代码。