javascript:如何区分所选元素列表和表单

时间:2013-08-15 00:48:55

标签: javascript

以下是脚本: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>元素上无法正常工作。

你会帮忙吗?非常感谢你

1 个答案:

答案 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);
    }
}