Komputery, Windows i masa kompletnego bałaganu. Tak, to mój dziennik.

ktos.jogger


Nie rozumiem

10 stycznia 2008, 21:07:53. Kodowanie , 0.

Od dobrych 10 minut zastanawiam się co mam nie tak. I jak dotąd doszedłem do tego, że po prostu Firefox jest głupi, bo inaczej tego nie mogę wytłumaczyć.

Mam sobie formularz, w którym jest textarea. Chcę, aby nie dało się wpisać więcej znaków niż określoną długość (z pewnymi modyfikacjami). Więc sobie muszę zaprząc do tego JavaScript.

Obecnie mam takie przypisywanie zdarzenia:

addEvent(document.getElementById('comment'), 'keypress', function (e) { return false; });

Gdzie addEvent() to znana funkcja Johna Resiga. Na zdrowy rozsądek to przy czymś takim nie powinno się dać wpisać, każdego znaku, prawda? A może się mylę i gdzieś głęboko wpadłem w dziwne myślenie?

Niemniej IE respektuje zachowanie jakie bym chciał, a Firefox nie.

Podobna sytuacja występuje przy onsubmit formularza.

Komentarze

  1. Wasacz
    10 stycznia 2008 21:14:00

    Dorzucić e.preventDefault() próbowałeś?

  2. Mouser
    10 stycznia 2008 21:21:16

    Spróbuj może na ten sposób. Ja zawsze się uczyłem sposobu cośtam.onkeyup, tak jak w wymienionym wyżej linku, i jakoś nigdy nie miałem z tym większych problemów.

  3. Wasacz
    10 stycznia 2008 21:22:04

    @Mouser: wszystko, co jest inline, ssie.

  4. Marcin / Ktos
    10 stycznia 2008 21:27:39

    e.preventDefault() przed return false; w funkcji sprawdza się mniej więcej jak powinno. Jednak wymaga to dodania dodatkowych dwóch linii w każdej funkcji obsługującej zdarzenie.

    Porzucenie addEvent() na rzecz po prostu document.getElementById('comment').onkeypress = function (e) { return false; } działa. I tak samo zaczyna działać wszystko w innych zdarzeniach.

    Nie wiem czy w drugim rozwiązaniu jest coś złego, ale mam wrażenie, że jest dla mnie wygodniejsze nieco. I się ku prostemu przypisywaniu zdarzeń skłaniam.

    Ech, nie lubię JS.

  5. Wasacz
    10 stycznia 2008 21:29:29

    (e.preventDefault) ? e.preventDefault() : (e.returnValue = false); – 1 linia ;)

    Nie wiem czy w drugim rozwiązaniu jest coś złego, (…)

    Jest coś bardzo złego :P

  6. lato_p
    10 stycznia 2008 21:33:20

    Jest coś bardzo złego, czyli drugie rozwiązanie nie trzyma się standardów i do jednego zdarzenia w elemencie w ten sposób przypiszesz tylko jedną funkcję.
    Lepiej skorzystaj z jQuery :-)

  7. Marcin / Ktos
    10 stycznia 2008 21:35:07

    Akurat nie potrzebuję więcej niż jednej funkcji do zdarzenia. I nie mogę użyć jQuery, to ma być prosty projekt na uczelnię, a ja tylko lekko wydziwiam nie chcąc używać zdarzeń bezpośrednio w kodzie HTML.

  8. Marcin / Ktos
    10 stycznia 2008 21:36:29

    I spójrzcie na to:

    function askBeforeReset() { return confirm('Czy jesteś pewien, żeby wykasować dane?'); }

    oraz addEvent(document.getElementById('reset'), 'click', askBeforeReset);.

    Oczywiście nie działa w Firefoksie, w IE bez problemu. Szału można dostać.

  9. Wasacz
    10 stycznia 2008 21:39:42

    Zapis typu el.onevent w gruncie rzeczy daje taki sam efekt, jakbyś dopisał w HTML atrybut onevent dla elementu el. IMO jQuery (czy też jego brak) nie ma tutaj żadnego znaczenia. W każdym razie podana przeze mnie metoda jest chyba najbardziej polecana i teoretycznie powinna być cross-browser.

  10. Wasacz
    10 stycznia 2008 21:43:10

    function askBeforeReset(e) {
    confirm('Czy jesteś pewien, żeby wykasować dane?');
    (e.preventDefault) ? e.preventDefault() : (e.returnValue = false);
    }

    addEvent(document.getElementById('reset'), 'click', askBeforeReset);

  11. riddle
    11 stycznia 2008 19:49:39

    Nie używaj el.onclick, źli ludzie Cię podpuszczają. ;) To co zapostował Wąsacz powinno zadziałać, jeśli naprawdę wykorzystujesz addEvent Resiga.

Zostaw komentarz

W komentarzach dozwolona jest składnia Markdown do formatowania.