2013-08-15 2 views
6

Здесь есть сценарии: http://jsbin.com/itusut/6/editJavaScript: как отличить выбранный список элементов и форму

Привет, у меня есть функция:

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

Вы можете добавить проверку для тега имя, но ответ @zzzzBov кажется немного более подходящим. – dc5

+0

'if (e.length &&! E.nodeName) {' –

+0

@ crazy-train: e.nodeName - это точный ответ, почему бы не сделать ответ? –

ответ

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); 
    } 
} 
+0

что я должен писать вместо 'e.length' :(спасибо за ответ –

+2

Вам не нужно. Просто нужно, чтобы вызывающий всегда проходил массив или NodeList. – Barmar

+0

@zzzzBov: да, я думаю, это лучше чтобы передать их в массив/объект, подобный массиву.Я бы попробовал это 'always for()' вместо 'if else' –

Смежные вопросы