6

这是脚本: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>在单节点元素上无法正常工作。

你会帮忙吗?非常感谢

4

1 回答 1

6

表单元素有一个长度属性(告诉表单中的字段数)。您使用的代码无法准确检测元素是否为 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);
    }
}
于 2013-08-15T00:52:36.543 回答