5

入力フィールドの値をチェックするフォームがあり、タイプウォッチ プラグインを使用して Ajax 呼び出しを行います (定義済みの間隔の後にユーザーが入力を停止したことを検出する小さなもの)。それはうまくいきます。

このフィールドは注文フォームの「クーポン割引」なので、メールなどから「クーポン コード」をコピーして値を入力できます。また、コピーと貼り付けのために Ctrl+C - Ctrl+V でも機能しますが、ユーザーがマウスでテキストを選択し、コンテキスト メニューからコピーをクリックしてから、このメニューから貼り付けた場合には機能しません。

jQueryで何らかの形でこの種の動作をチェックする方法はjQueryにありますか?

4

3 に答える 3

1

前回のチェック以降に値が変更されたことをチェックする低タイムアウト(1秒)を設定できます。

また、単に無視して、フォームが送信されたら、このクーポン割引入力の内容を取得して処理することもできます。

于 2010-05-14T19:09:37.613 に答える
0

以前にも同様の問題がありました。私の知る限り、ユーザーが右クリックして貼り付けたとき、または以前に使用した値のリストから選択したときに、ブラウザーはイベントを発行しません。

イベントハンドラーをさらにblurイベントにバインドすることで、十分に解決することができました。これがキャッチされなかった唯一のケースは、マウスで値を貼り付け、Enter キーを押して送信した場合です。ちょっとしたハッカーでこれを回避できました:

$(element)
  .bind('keydown blur', handlerFunction)
  .keydown(function(event) {
    if (event.keyCode === 13 /* Enter Key */) {
      event.preventDefault();
      event.stopPropagation();
    }
  })
  .keyup(function(event) {
    if (event.keyCode === 13 /* Enter Key */) {
      $(this).closest('form').submit();
    }
  });

基本的に、jQuery はバインドされた順序でイベントを実行するため、これは機能します。通常、フォームの送信は、Enter キーを押してキーを押したときに行われます。keyup ハンドラーにマジックを実行する時間を与えるには、keyup イベントが発生するまでフォームの送信を遅らせる必要があります。これにより、他の keyup ハンドラーが最初に実行できるようになります。

さて、あなたは、ユーザー イベントに反応する前に遅延を追加するプラグインを使用していると言いました。つまり、この手法を逐語的に使用できない場合があります。代わりに機能する可能性のある方法の 1 つは、フォームの送信を許可する前にハンドラー関数を直接呼び出すことです。これを行うには、最後の keyup ハンドラーを次のように変更します。

  .keyup(function(event) { // Part 2
    if (event.keyCode === 13 /* Enter Key */) {

      handlerFunction.call(this, event); // force it to happen now

      $(this).closest('form').submit();
    }
  });

Josh K が前に述べたように、何かをフォームの送信イベントに単純にバインドして、同様のことを行うことができます。ただし、そこで Ajax を実行している場合はasync: false、渡されたオプションを必ず設定してください。そうしないと、呼び出しが完了するのを待たずにフォームが先に進み、送信されてしまうからです。

于 2010-05-20T02:12:07.570 に答える
0

(この解決策はテストされていませんが!) 私は次のようなことを試してみます:

var keys_pressed = 0; // count the number of key press events
var required_keys_pressed = 10;
$('#yourinputElement').keydown ( function () {
  keys_pressed++; // add one
}); 
$('#yourform').submit (function () {
  if (keys_pressed < required_keys_pressed)
  {
     // not enough keys pressed or was a CTRL + v
  }
  else
  {
     // required number of keys pressed for your code
  }
});

ただし、ブラウザーのプラグインを使用していつでもこれを回避できるため、意図したとおりに動作するという保証はありません。何らかのサーバー側の検証も常に実行する必要があります

于 2010-05-28T21:01:27.477 に答える