以下是脚本:http://jsbin.com/itusut/6/edit
嗨,我有功能:
function on(t, e, f) {
if ( e.length ) {
var l = e.length,
n = 0;
for ( ; n < l; n++ ) {
e[n].addEventListener(t, f, false)
}
} else {
e.addEventListener(t, f, false);
}
}
如果我们var handle = document.getElementsByClassName('some-class');
,则handle
是节点列表。
如果我们执行var handle = document.getElementById('an-id');
,则handle
是单个节点。
问题是,当我选择<form id="login-form">
时,它会返回数组而不是单个元素。
所以,我的on
函数失败了。该函数使用elm.length
过滤器。一切都很好,除了<form>
。如何解决这个问题?我知道 elm.length 在单个节点<form>
元素上无法正常工作。
答案 0 :(得分:6)
表单元素具有length属性(表示表单中的字段数)。您正在使用的代码无法准确检测该元素是否为DOM节点,因此它假定该表单是DOM节点的集合。
如果你需要绑定元素,你最好总是传入一个数组或类似数组的对象,这样函数总是遍历集合。
这可以像在数组中包装参数一样简单:
on('click', [formElement], callback);
on
的更新版本,其中仅支持列表:
function on(type, elements, callback) {
var length,
i;
length = 0;
if (elements && elements.length) {
length = elements.length;
}
for (i = 0; i < length; i += 1) {
elements[i].addEventListener(type, callback, false);
}
}