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

javascript:如何区分所选元素列表和表单,javascript,Javascript,以下是脚本: 您好,我有以下功能: 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);

以下是脚本:

您好,我有以下功能:

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);
    }
}
功能开启(t、e、f){
如果(如长度){
var l=e.长度,
n=0;
对于(;n
如果我们执行
var handle=document.getElementsByClassName('some-class')然后
句柄
是一个节点列表

如果我们执行
var handle=document.getElementById('an-id')然后
句柄
是单个节点

问题是,当我选择
时,它返回数组而不是单个元素

因此,我的
on
函数失败。函数使用
elm.length
filter。除了
,一切正常。如何解决这个问题?我知道elm.length在单个节点
元素上无法正常工作


你能帮忙吗?非常感谢

表单元素有一个length属性(告诉表单中字段的数量)。您使用的代码无法准确检测元素是否为DOM节点,因此它假定表单是DOM节点的集合

如果需要绑定元素,最好始终传入数组或类似数组的对象,以便函数始终在集合上迭代

这可以简单到将参数包装在数组中:

on('click', [formElement], callback);

仅支持列表的
上的更新版本: 函数(类型、元素、回调){ 变量长度, 我 长度=0; if(elements&&elements.length){ 长度=元素长度; } 对于(i=0;i
我应该写什么来代替
e.length
:(感谢您的回答您不需要这样做。只需要求调用方始终以数组或节点列表的形式传递即可。@zzbov:是的,我认为最好是以数组/类似数组的对象的形式传递它们。我会尝试此
始终用于()
而不是
if else
@zzzzBov:太好了……我尝试了你更新的脚本。但它仍然取决于
元素。长度
,这意味着,在单个选定的
element@SlametBedjo,我明确表示“仅支持列表”,这意味着您应该在数组中封装单个元素。您可以添加标记名检查,但@zzzzBov的答案似乎更合适。
如果(e.length&&!e.nodeName){
@crazy train:e.nodeName是正确答案,为什么不回答呢?
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);
    }
}