17

ページに複数のフォームが含まれているという非常に正当な理由で、入力フィールドのいずれかでリターンを押す通常の機能が無効になっている Web アプリケーションを継承しました。 ) どのフォームからアクションへ。このアプリケーションは、送信ボタン (input type="submit" など) がないように設計されており、代わりに設計者はオンクリック処理を行っています。説明のために含まれている、ページの 1 つで定義されている 2 つのボタンを次に示します。

<input type="button" value="LOGIN"  name="btnLoginOk" onclick="submit(); />"

<input type="button" class="button-click-grey" value="Find Link Partners"  
    onclick="raiseEvent('SubmitForm','',this);" style="cursor:pointer;" />

しかし、ユーザーが必要に応じてリターンを押すことができるようにしたいと本当に思っています。

おそらくjQueryで解決策があるでしょう。

4

4 に答える 4

37

ページには複数のフォームが含まれており、アプリケーションはどのフォームを実行するかを判断できません (または、そう言われています)。

入力コントロールで Enter キーを押すと、ブラウザーはそのフォームの最初の送信ボタンを探し、そのクリックをシミュレートします。複数のボタンの場合、キーボード入力時に最初のボタンが押されます (これは決して石で書かれたものではなく、ブラウザーはこれから逸脱する可能性があります)。

フォームが 2 つある場合、キーを押した方のフォームで最初に送信ボタンが押されます。したがって、これを特別に処理する必要はありません。邪魔するのはやめればいいだけです。

これをフォームのコードでシミュレートできます。

 $( 'form' ).bind('keypress', function(e){
   if ( e.keyCode == 13 ) {
     $( this ).find( 'input[type=submit]:first' ).click();
   }
 });

またはウィンドウ(大まかに何が起こっているかのデモンストレーション用):

 $( window ).bind('keypress', function(e){
   if ( $( e.originalTarget ).is( ':input' ) && e.keyCode == 13 ) {
     $(  e.originalTarget )
       .closest( 'form' )
         .find( 'input[type=submit]:first' )
           .click();
   }
 });

.preventDefault()もちろん、イベントで呼び出されていないと仮定します。

結論: イベントがあれば、それがどの要素から来たのか、したがってどのフォームに属しているかを推測できます。この場合でも:

<input type="button" value="LOGIN" name="btnLoginOk" onclick="submit();">

submit()これはグローバル関数ですが、これが呼び出されると、そのコンテキスト ( this) が要素になり、 を実行できますsubmit(e){ this.form.submit(); }

このアプリケーションは、送信ボタン (input type="submit" など) がないように設計されており、代わりに設計者はオンクリック処理を行っています。

これは、デザイナーがDOM /フォームイベントを完全に理解しておらず、問題を回避しているように思えます。もう 1 つの考えられる理由は、プログラムが古く、これらが現在ほど安定しておらず、適切に文書化されていなかったときに設計されたものである可能性があります。

これを置き換えます:

<form action="/login/" method="POST">
  [...]
  <input type="button" value="LOGIN" name="btnLoginOk" onclick="submit();">
</form>

これとともに:

<form action="/login/" method="POST">
  [...]
  <input type="submit" value="LOGIN" name="btnLoginOk">
</form>

次に、それを必要とするすべてのフォームにキーハンドラーを追加します。これは、何らかの条件が満たされた場合に入力を検出して抑制します (実際にこれを無効にしたいフォームの場合)。

// for all forms that POST that have 2+ submit buttons
$( 'form[method=post]:has(:submit:eq(1))' ).bind('keydown', function(e){
  // if target is an enter key, input element, and not a button
  if ( e.keyCode == 13 && e.target.tagName == 'INPUT' && 
       !/^(button|reset|submit)$/i.test( e.target.type ) ) {
    return false;  // kill event
  }
});

またはさらに良いこと: これを行う方法を知っているフォーム検証ライブラリ (または jQuery プラグイン) を使用します。

于 2009-04-19T02:52:52.040 に答える
4

jquery で Enter キーのキー押下イベントをバインドできます。

$("form").bind("keypress", function(e) {
   if (e.keyCode == 13) {
      your_custom_submit_function();
      return false; // ignore the default event
   }
});
于 2011-07-26T15:41:09.467 に答える
3

指が交差したこれはうまくいくでしょう

$(document).ready(function() {
  var focussed_form;
  $('input').focus(focus_form);
  $('input').blur(unfocus_form);
  $('textarea').focus(focus_form);
  $('textarea').blur(unfocus_form);
  $('select').focus(focus_form);
  $('select').blur(unfocus_form);

  $(document).keypress(function(e) {
    if(e.keyCode == 13) 
    {
      $(focussed_form).trigger('submit'); 
    }
  });

  function focus_form(){
    focussed_form = $(this).closest('form');
  }

  function unfocus_form(){
    focussed_form = NULL;
  }

});
于 2009-04-18T23:33:45.827 に答える
2

これにはjQueryやjavascriptは必要ないと思います。実際、ユーザーが送信を押したフォーム、またはどの送信ボタンが押されたかを検出できます(フォームごとに複数の送信ボタンがある場合)。

使用するコードは次のとおりです。

<form action="http://foo.com/uri" method="POST">
  <input type="submit" name="action1a" value="add" />
  <input type="submit" name="action1b" value="delete" />
</form>
<form action="http://foo.com/uri" method="POST">
  <input type="submit" name="action2a" value="add" />
  <input type="submit" name="action2b" value="delete" />
  <input type="submit" name="action2c" value="someOtherAction" />
</form>

次に、フォーム処理スクリプトの場合、送信ボタンの名前を確認するだけです。次に例を示します。

if (isset($_POST['action1a'])) ... // PHP syntax

または、画像を送信ボタンとして使用し、すべての送信ボタンに同じ名前を使用して値を確認することもできます。すべてのボタンに一意のvalue属性がある場合は、通常の送信ボタンでもこれを行うことができます。


編集:もう1つの方法は、POST値とGET値を組み合わせることです。

<form action="http://foo.com/uri?form=1" method="POST">
  <input type="submit" name="action" value="add" />
  <input type="submit" name="action" value="delete" />
</form>
<form action="http://foo.com/uri?form=2" method="POST">
  <input type="submit" name="action" value="add" />
  <input type="submit" name="action" value="delete" />
</form>
于 2009-04-18T23:40:42.223 に答える