0

だから、私はここにこれの動作バージョンを持っています:http: //jsfiddle.net/yEmvm/19/

最初のアドレスブロックの会社をクリックしてから名前をクリックすると、イベントが発生し、無効なアドレスが表示されます。2番目のアドレスブロックまたはその最初のアドレスブロックの外側のどこかで会社に連絡するまで、そのイベントを発生させたくありません。これをトリガーする別のイベントを理解できません。

これは単なる例です。このページには、3から99までの不明な数のアドレスブロックが含まれます。また、完全なアドレスのフィールドがさらに多く含まれます。ユーザーはボタンでさらに追加し続けることができます。ただし、クラスとIDの名前の構造には一貫性があります。

4

2 に答える 2

4

タイムアウトでコードを実行し、フォーカスでタイマーをキャンセルする必要があります。

$('.address').each(function()
{
    var timer;

    $(this).find('input').blur(function()
    {
        timer = setTimeout(function()
        {
            var verified = false; // run your verification here

            if ( ! verified )
            {                
                // run code here to display error
            }
        }, 0);
    })
    .focus(function()
    {
        timer && clearTimeout(timer);
    });
});​

これが非常に基本的な例です:http://jsfiddle.net/U6TRj/3/


説明:

基本的に、input別の要素にフォーカスしているときに要素をクリックするinputと、ブラウザは最初blurに古い要素でイベントを発生させ、次にfocus新しい要素でイベントを発生させます。

ここでtimeout(遅延は不要)で行っているのは、コードの実行をスタックにプッシュして、focusイベントハンドラーの後に実行されるようにすることです。そうすれば、focusコールバック内から実行をキャンセルできます。

于 2012-07-17T20:23:14.720 に答える
1

これは、.focusout()のjQueryAPIドキュメントに記載されている動作です http://api.jquery.com/focusout/#dsq-comment-108827731

おそらくプラグインはあなたの問題を助けることができると示唆しました:http: //archive.plugins.jquery.com/project/focus

于 2012-07-17T20:34:58.703 に答える