2009-04-25 11 views
16

私はJSで動的なWebページを持っています。 テキストエリアボタンを送信しますが、フォームタグはありません。どのように私は提出ボタン火災やを入力したときにがクリアされテキストエリアがテキストエリアに押されて?作るのですか"Enter"を押してテキストエリアからデータを送信

+0

誤解を招いて申し訳ありません。私はテキストエリアを読むが、入力タイプ= "テキスト"と思う......私の愚かな答えを削除しました:) –

+0

人々はなぜテキストエリアの代わりに入力[テキスト]を使わないのか質問しています。私にとっては、ユーザーが1行のテキストだけを入力できるようにしたいのですが、テキストを複数の行に折り返したいとします。入力[テキスト]は、 "不適切な"段落のために –

答えて

26

テキストエリア用のキーアップハンドラを使用できます(ただし、私はそれに反対します*)。

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

*これにテキスト入力フィールドを使用してみませんか? Textareaは、1行入力用のテキスト入力フィールドである複数行入力には特に適しています。入力ハンドラを使用すると、複数行の入力をまとめることができます。 XHR(別名AJAX)チャットアプリケーション(これはテキストエリアがMSN入力エリアのように動作するように)を一度使用したことを覚えていますが、CTRL-Enterキーを使用して複数行の入力を再度有効にしました。それはあなたのためのアイデアかもしれない?

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

いいね、ありがとう。何が必要ですか?* e = e ||イベント; *? – Alex

+7

@Alex:firefox、opera、およびsafari(およびWebkitを組み込んだ他のブラウザ)は、イベントハンドラへの引数としてイベントを渡しますが、IEではそうではありません。 IEでは、イベントはグローバルオブジェクトのプロパティです。幸いなことに、|| JSでは、これを回避するためには本当にきれいです。 JSでは、式 'a || bは 'a'の値になり、' a'が偽とみなされた場合、結果は 'b'になります。したがって、この場合、e = e || event'は、イベントが引数として渡された場合に 'e'を代入するか、' event'の 'e'を' e'に設定して、このコードをすべてのブラウザで動作させます。 – olliej

15

ヒット入力textareaに入力すると、親フォームを送信するのではなく改行が挿入されます。これは通常のフォームタグでもその方法では機能しません。

この動作を回避することは、他のWebサイトとそのプラットフォーム上の他のアプリケーションの両方で、テキスト領域コントロールがどのように動作するかというユーザーの期待に反するため、避けてください。

+4

++をラップしません。ウェブサイトのテキストエリアでエンターキーが何をするかを常に知っていることは、他のGUIを使用するときに見落とす多くの小さな一貫性の1つです。 – Shog9

+1

私はあなたのアドバイスに完全に同意しますが、手元の質問は非常に正確に定式化されており、良いアドバイスよりも本当の答えが必要です。 +1がまだありますが、あなたが入力したフォームを提出するためにkeyListenerをテキストエリアに接続する方法についてアドバイスできませんでしたか?私はむしろ興味があります... –

+5

私はこの回答を長い間前倒ししましたが、ユーザーが実際に彼がテキストエリアに入力していることを知らないケースがあります。たとえば、facebookのチャットの入力行を考えてみましょう。これは、1行として開始し、ユーザーがより多くのタイプを入力すると、垂直方向に拡張されます。ユーザーが入力時に提出することを期待するのは絶対に理にかなっています。 – hasen

1

ここに私のソリューションです:JavaScriptで

:HTMLで

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

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

Shog9私は私をコピーすることが示唆@リスナーは次のように拡張されるだろうこの質問の重複したバージョンへの回答: この無視する1つの問題は、ユーザーの実行です入力方法(エディタ) - 例えば。非ラテン文字入力。私がよく知っているIMEは、OSX上のKotoeri Hiragana IMですが、ハングルのためのモードに加えて、日本語のための多くのものがあります(Kotoeriだけで複数の異なる入力モードがあり、ATOKと呼ばれる少なくとも1つの主要なモードがあります)繁体字中国語、簡体字中国語、その他のあまり知られていない言語があります。これらの入力方法は、すべての主要なプラットフォーム(特に、Win、Mac、Linux)に存在します。

あなたが試みているのと同じようなコードの観点から導入する問題は、正確な物理的なキーの押下が、ユーザーが入力している実際の入力と必ずしも一致しないことです。文字列とうきょうが生成されますデフォルトではひらがなの下の文字toukyou<enter>のシーケンスを入力する例えば

は、変換テキストを確認し、入力したため、結果として得られるテキストには<enter>が存在しないことに注意してください。しかし、入力が入力されると、変更を表示されますこの文字に加えて、実際の配列:

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

メモリが提供している場合、私はWebKitの中でこれを実装するとき、のkeyCodeが入力されたすべてのキーのKeyDownイベントに229可能にする必要がありました(IEとの互換性のための)IMEで - しかし、私はkeyUpの動作が何であるか思い出すことができません。

一部のIMEでは、必ずしもキーダウン、キー押下、キーアップを受信するとは限りません。または、複数を受け取ることになります。または、入力の最後にすべてが一緒に送信されます。

これは、現在、DOMイベント実装の非常に不潔な部分です。

+2

++頻繁に見落とされる落とし穴... – Shog9

+2

これは、多くの人々が、彼らが話す言語が、キーストロークあたり1文字を当然としているという事実を示していることを示しています。それが私のしたことです。 – Alex

-1

テキストエリアは、複数行のテキストを入力できるようにするため、Enterキーを押すとテキストに新しい行が挿入されます。その動作を希望する場合は、代わりに通常のテキストフィールドを使用してください。

1

フォームラッパーを使用しない理由はありますか?

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