2009-04-25 21 views
16

Ho una pagina Web dinamica con JS. C'è uno area di testo e un Invia pulsante, ma non modulo tag. Come faccio Invia pulsante di fuoco e la textarea ottenere eliminato quando Enter viene premuto nel textarea?Invio di dati da textarea premendo "Invio"

+0

Mi dispiace per ingannarti. Ho letto textarea ma penso input type = "text" ...... Rimosso la mia risposta schifosa :) –

+0

Le persone si stanno chiedendo perché non usare un input [testo] invece di textarea. Per me, il motivo è che voglio consentire all'utente di inserire solo una riga di testo, ma voglio che il testo si sovrapponga a più righe. L'input [testo] non avvolge –

risposta

26

È possibile utilizzare un gestore keyup per l'area di testo (sebbene io sconsiglierei di farlo *).

[SomeTextarea].onkeyup = function(e){ 
    e = e || event; 
    if (e.keyCode === 13) { 
    // start your submit function 
    } 
    return true; 
} 

* Perché non utilizzare un campo di immissione testo per questo? Textarea è particolarmente adatto per input multilinea, un campo di immissione testo per input a linea singola. Con un gestore di inserimento si cripta l'input multilinea. Ricordo di averlo usato una sola volta per un'applicazione di chat XHR (aka AJAX) (quindi la textarea si comportava come un'area di input per MSN), ma ha riattivato l'input multiline usando il tasto di invio CTRL per le nuove linee. Potrebbe essere un'idea per te? L'ascoltatore sarebbe estesa in questo modo:

[SomeTextarea].onkeyup = function(e){ 
    e = e || event; 
    if (e.keyCode === 13 && !e.ctrlKey) { 
    // start your submit function 
    } 
    return true; 
} 
+0

Sembra carino, grazie. Di cosa hai bisogno la linea * e = e || evento; * per? – Alex

+7

@Alex: firefox, opera e safari (e altri browser che incorporano il webkit) passano gli eventi come argomento al gestore eventi, ma IE no. In IE l'evento è una proprietà sull'oggetto globale. Fortunatamente la semantica di || in JS rendilo davvero pulito per aggirare questo problema. In JS il risultato dell'espressione 'a || b' sarà o il valore di 'a', o se' a' è considerato falso, il risultato sarà 'b'. Quindi in questo caso 'e = e || event' assegnerà 'e' a se stesso se l'evento viene passato come argomento, o imposterà' e' a 'evento', consentendo così a questo codice di funzionare in tutti i browser. – olliej

15

Colpire Inserire in un textarea inserisce un'interruzione di riga, anziché inviare il modulo principale; questo non funzionerebbe in quel modo anche con tag regolari.

Sarebbe inopportuno tentare di aggirare questo comportamento, in quanto violerebbe le aspettative dell'utente su come si comportano i controlli dell'area di testo, sia in altri siti Web, sia in altre applicazioni sulla loro piattaforma.

+4

++ per il paragrafo "sconsigliabile". Sapere sempre cosa farà la chiave di invio in un'area di testo del sito Web è una delle tante piccole imperfezioni che mi mancano quando uso altre GUI. – Shog9

+1

anche se sono completamente d'accordo con il tuo consiglio, la domanda in questione è formulata in modo molto preciso e richiede piuttosto una risposta reale che un buon consiglio. +1 ancora, ma non potresti consigliare come allegare una sorta di keyListener alla textarea per inviare il modulo su Invio come richiesto? Sono piuttosto interessato ... –

+5

Ho svalutato questa risposta molto tempo fa, ma ci sono casi in cui l'utente non è realmente consapevole che sta scrivendo in una textarea. Ad esempio, considera la linea di input della chat di Facebook. Inizia come una singola riga e si espande verticalmente quando l'utente digita di più. È assolutamente ragionevole che gli utenti si aspettino che invii l'invio. – hasen

1

Ecco la mia soluzione:

in JavaScript:

function isEnterPressed(e){ 
var keycode=null; 
if (e!=null){ 
    if (window.event!=undefined){ 
     if (window.event.keyCode) keycode = window.event.keyCode; 
     else if (window.event.charCode) keycode = window.event.charCode; 
    }else{ 
     keycode = e.keyCode; 
    } 
} 
return (keycode == 13);} 

in HTML:

<input type="text" onkeyup="if(isEnterPressed(event)){/*do something*/}" /> 
13

@ Shog9 mi ha suggerito di copiare il mio rispondi a una versione duplicata di questa domanda: Un problema che ignora è l'esecuzione degli utenti metodo di input (editor) - es. immissione di testo non latina. L'IME con cui ho familiarità è il Kotoeri Hiragana IM su OSX, ma ce ne sono molti altri sia per il giapponese (Kotoeri da solo ha diverse modalità di input, e ce n'è almeno un'altra importante chiamata ATOK), oltre alle modalità per hangul, cinese tradizionale e semplificato, nonché numerose altre lingue meno conosciute. E questi metodi di input esistono su tutte le principali piattaforme (specialmente Win, Mac e Linux).

Il problema che introducono dal punto di vista del codice simile a quello che si sta tentando è che l'esatta pressione fisica del tasto non corrisponde necessariamente all'ingresso effettivo che l'utente sta inserendo.

Per esempio digitando la sequenza di caratteri toukyou<enter> sotto hiragana di default produrrà la stringa とうきょう, notare che non v'è <enter> nel testo risultante poiché immettere conferma il testo composto. Ma oltre a questo l'effettiva sequenza di caratteri che appare cambia come l'ingresso è digitato:

t // t 
と // to 
とう // tou 
とうk // touk 
とうky // touky 
とうきょ // toukyo 
とうきょう // toukyou 

Se la memoria non serve quando ho implementato questo in WebKit è stato necessario per rendere la keyCode essere 229 su keyDown per tutti i tasti digitati in un IME (per compat con IE) - ma non riesco a ricordare quale sia il comportamento di keyUp.

Vale anche la pena notare che in alcuni IME non si riceveranno necessariamente keydown, keypress o keyup. O riceverai più. Oppure vengono inviati tutti insieme alla fine dell'input.

In generale questa è una parte molto ... sporca ... delle implementazioni degli eventi DOM al momento.

+2

++ Una trappola spesso trascurata ... – Shog9

+2

Mostra che molte persone prendono il fatto che le lingue che parlano hanno un carattere per battuta per scontato. Questo è quello che ho fatto. – Alex

-1

L'area di testo consente agli utenti di immettere più righe di testo in modo che premendo Invio venga inserita solo una nuova riga nel testo. Utilizzare invece il campo di testo normale se si desidera tale comportamento

1

È possibile che non si utilizzi un wrapper di moduli?

$('#input_id').keypress(function(e){ 
    if(e.which == 13){ 
     $('#form_id').submit(); 
     return false; //prevent duplicate submission 
    } 
});