2009-07-23 4 views
3

私はそれに複数のテキストボックス(Autopostback = False)と保存ボタンを持つ標準asp.net webformを持っています。
テキストボックス内でEnterキーを押すと、保存ボタンのサーバー側のクリックイベントが呼び出されます。コールスタックを壊して見ると、clickイベントだけがリストされます。フォームのデフォルトボタンが設定されていません。 保存ボタンの上に別のボタンを置くと、テキストボックスにenterを押すとクリックイベントが発生します。任意のテキストボックスでEnterキーを押すと、保存ボタンのクリックイベントが呼び出されますか?

なぜこのようなことが起こっているのか、どのように停止するのですか?

答えて

3

これはテキストエリアを除くほとんどのフィールドのデフォルトの動作であるにする必要があります、と述べました。

フォームを送信する前に、キー入力を確認する前にjavascript関数を呼び出すことができます。

<script type="text/javascript"> 
    function allowSubmission() { 
    return !(window.event && window.event.keyCode == 13); } 
</script> 

フォームを送信する唯一の方法は、実際に送信することです。しかし、多くの人が言及しているように、フォームを提出するEnterキーは予想される動作なので、フィールドの基本的な検証を行うために関数を変更することができ、必要なフィールドがすべて入力された場合にEnterキーでフォームを送信できます。

<script type="text/javascript"> 
    function allowSubmission() { 
    return !(window.event && window.event.keyCode == 13) || validateInput(); } 
</script> 

編集:この機能は、送信ボタンのOnClientClickメソッドで呼び出します。何かのように:

<asp:Button id="SubmitBtn" runat="server" OnClientClick="return allowSubmission()"/> 
+0

私がマウスのユーザーでなく、タブをタップしてEnterキーを押したければどうなりますか?私はスペースバーを打つことができると知っていますが、私のエンドユーザの99%がスペースバーを使うことを考えていないと考えています。 –

+0

フォームの検証が合格している限り、あなたはできます。私はOPが何をしたいのか分からないのでvalidateInput関数を書きませんでしたが、必要なフィールドに記入しておけばチェックが合格します。 – Brandon

2

テキストボックスがTextModeとして複数行に設定されていることを確認します。入力しない場合は、コマンドボタンを実行してポストバックを戻します。

<asp:TextBox ID="TextBox1" runat="server" TextMode="MultiLine"></asp:TextBox> 

テキストボックスを複数行にしたくない場合は、JavaScriptでキープレスコマンドをインターセプトして、入力時に何もしないでください。あなたが入力フィールドにフォーカスがあるときにEnterキーを押すと、フォームは(テキストエリアを除く)に提出されます。

これはこれは、任意のWebフォームのために真であるか

function hookUpToEnterKey() 
{ 
    // Hook up to read enter key 
    document.onkeydown = processEntryKey; 
} 

function processEntryKey(e) 
{ 

    if(!e) 
    { 
     if(window.event) 
     { 
     //Internet Explorer 
     e = window.event; 
     } 
     else 
     { 
     // Cannot get the even return. 
     return; 
     } 
    } 

    if(typeof(e.keyCode) == 'number' ) 
    { 
     //DOM 
     e = e.keyCode; 
    } 
    else 
     if(typeof(e.which) == 'number') 
     { 
      //NS 4 compatible 
      e = e.which; 
     } 
     else 
      if(typeof(e.charCode) == 'number' ) 
      { 
       //also NS 6+, Mozilla 0.9+ 
       e = e.charCode; 
      } 
      else 
      { 
       //total failure, we have no way of obtaining the key code 
       return; 
      } 

     if(e == 13) 
     { 
     // Do nothing 
     return false; 
     } 
} 
+0

多くの人がEnterキーを押してフォームを送信してくれると期待しています。フォームが未完了状態で送信されないようにするには、コントロールのクライアント側の検証が必要です。 –

+0

あなたは正しいです。私は通常それをしませんが、質問をしている人がEnterキーが何もしないようにしたかったようです。 –

+0

あなたは確信しています。実際、理想的には、タブを実行したいと思います。 – tbone

3

例です。それを止めるには、イベントをキャプチャしてフォームが送信されないようにするためのJavaScriptが必要です。しかし、入力を押すと、多くのユーザーの期待される動作がわかります。

0

あなたが「デフォルト」(入力時にフォームの最初のボタンを「クリック」します)に設定していない場合でも、ブラウザは素敵な人になり、ボタンをクリックしようとしています。あなたがテキストボックスに改行を引き起こすキーを入力したい場合は

同様ダビデは、それが複数行

1

私は正確に同じ問題を抱えていた:私は、データバインドされたGridViewコントロール、テキストボックスとボタンを持っていました。テキストボックスは、グリッドの内容を検索ボックスとしてフィルタリングするために使用されました。このボタンはまったく異なるアクションに使用されました。ボタンを押す前に、テキストボックスのEnterキーを押すとグリッドがフィルタリングされ、これが予期された動作でした。しかし、私はボタンを置くとすぐに、テキストボックスにフォーカスしながらenterを押すと、ボタンのonclickイベントが呼び出されました。テキストボックスのautopostbackプロパティをtrueに設定するだけで解決しました。私は理由を理解していないが、何とかそれはテキストボックスのフォーム提出動作をオーバーライドする。期待してください。

+0

ボタン上でボタンのメッセージを印刷します(ラベルのテキストプロパティを設定します)。このメッセージは、テキストボックスにフォーカスしている間にEnterキーを押したときに表示されないので、テキストボックスに入力するとブラウザーや他の人がボタンをクリックしないようにしていません。 – fabigato

+0

これをアップしました。私はこのテクニックの使用にはまったく同意できませんが、ユーザーが私の正確な問題を説明し、解決策が働いていました。私は多数の方法でエンターキーをインターセプトしようとしましたが、これは成功した唯一のものでした。ちょうど私が感謝を言うだろうと思った –

関連する問題