2013-08-15 13 views
6

Oto skrypty: http://jsbin.com/itusut/6/editjavascript: jak odróżnić wybranego elementu listy i formy

Cześć, mam funkcję:

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

jeśli robimy var handle = document.getElementsByClassName('some-class'); następnie handle jest lista węzłów.

jeśli wykonamy var handle = document.getElementById('an-id');, wtedy handle jest pojedynczym węzłem.

Problem polega na tym, że gdy wybieram <form id="login-form">, to zwracam tablicę nie pojedynczy element.

Moja funkcja on kończy się niepowodzeniem. Funkcja wykorzystuje filtr elm.length. Wszystko jest ok, z wyjątkiem <form>. Jak to naprawić? Wiem, że elm.length nie działa poprawnie na pojedynczym węźle element <form>.

Czy możesz pomóc? Bardzo dziękuję

+0

Można dodać czek dla tagu nazwisko, ale odpowiedź @zzzzBov wydaje się bardziej odpowiednia. – dc5

+0

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

+0

@ crazy-train: e.nodeName jest dokładną odpowiedzią, dlaczego nie udzielić odpowiedzi? –

Odpowiedz

6

Elementy formularza mają właściwość length (określającą liczbę pól w formularzu). Kod, którego używasz, nie wykrywa dokładnie, czy element jest węzłem DOM, więc zakłada, że ​​formularz jest zbiorem węzłów DOM.

Jeśli chcesz powiązać elementy, prawdopodobnie lepiej jest zawsze przekazywać tablicę lub obiekt podobny do tablicy, aby funkcja zawsze była iterowana nad kolekcją.

To może być tak proste, jak owijanie parametru w tablicy:

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

Zaktualizowana wersja on gdzie są obsługiwane tylko listy:
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

co powinieneś napisać zamiast 'e.length' :(dziękuję za odpowiedź –

+2

Nie musisz, po prostu wymagaj, aby wywołujący zawsze przekazywał tablicę lub NodeList – Barmar

+0

@zzzzBov: tak, myślę, że jest lepiej przekazać je w tablicy/tablica-obiekt.Spróbuj to 'zawsze for()' zamiast 'if else' –

Powiązane problemy