2009-06-16 13 views
6

Mam do czynienia z problemem z tekstem wejściowym (np. Text Box).JavaScript Textbox Event

Napisałem funkcję używaną przez zdarzenie onkeyup w polu tekstowym. Linia wygląda następująco:

<input type='TEXT' value='abc' onkeyup='changeSomething(this);'> 

Ale teraz jestem w obliczu problemu, że gdy użytkownik wybiera wartości z wcześniej wprowadzonych wartości, ja nie dostaję żadnego zdarzenia, gdy użytkownik wybierze jakieś uprzednio wprowadzone wartości z listy rozwijanej (edytuj: wierzę, że odnosi się do autouzupełniania przeglądarki tutaj).

Czy ktoś ma rozwiązanie tego? :)

Odpowiedz

11

zastosowanie onchange zamiast onkeyup w tym przypadku

patrz: http://www.w3schools.com/jsref/event_onchange.asp

np

<input type='text' value='abc' onchange='changeSomething(this);' /> 

aby ominąć ten

EDIT dwie rzeczy:
1) wartości autouzupełniania można wybrać za pomocą klawiszy strzałek i wprowadź/kartę, i za pomocą myszy. Klawisze strzałek/enter.tab wywołują zdarzenia onkeyup ... kliknięcie w polu autouzupełniania nie uruchamia jednak zdarzenia onclick.
2) Zdarzenie onchange jest wywoływane natychmiast po utracie ostrości, jeśli zawartość uległa zmianie. Ostrość nie jest tracona podczas wybierania wartości autouzupełniania.

Zasadniczo nie wydaje się, aby istniała jakakolwiek rozsądna gwarancja, że ​​zdarzenie zostanie przetworzone zgodnie z oczekiwaniami.

Po pierwsze, czy naprawdę musisz słuchać każdego naciśnięcia klawisza? Po drugie, czy lepiej Ci pomóc, wyłączając autouzupełnianie? (np <input type='text' value='abc' autocomplete='off' onkeyup='changeSomething(this);' />)

+1

+1 najważniejsze wydarzenia są notorycznie kruche i nie będzie obsługiwać mysz oparciu kopiuj/wklej na przykład – annakata

+0

doskonały punkt. keyup/keypress są jednak bardzo dobre, jeśli zapewniasz interfejs oparty na klawiaturze/dozwolonym. Poza tym ... nie tak przydatne. –

+0

Widzę to tak: jeśli kluczowe wydarzenie samo w sobie jest tym, co cię interesuje, użyj kluczowych wydarzeń. Jeśli interesuje Cię efekt * kluczowego wydarzenia, użyj czegoś innego. – annakata

3

Oto rozwiązanie, które ankiety element okresowo wszelkich zmianach

<script type="text/javascript"> 

var changeWatcher = { 
    timeout: null, 
    currentValue: '', 
    watchForChange: function(el) { 
     if(el.value != this.currentValue) { 
      this.changed(el); 
     } 
     this.timeout = setTimeout(function() { 
      changeWatcher.watchForChange(el) 
     }, 200); 
    }, 
    cancelWatchForChange: function() { 
     clearTimeout(this.timeout); 
     this.timeout = null; 
    }, 
    changed: function(el) { 
     this.currentValue = el.value; 
     // do something with the element and/or it's value 
     //console.log(el.value); 
    } 
} 

</script> 
<input type='text' value='abc' onfocus='changeWatcher.watchForChange(this)' onblur='changeWatcher.cancelWatchForChange()' onchange='changeWatcher.changed(this)' /> 
+0

Nie dostaniemy żadnego z wydarzeń w tym przypadku ... To nie zadziała .. przepraszam za to .. –