4

jquery日付イベントUIが機能するのと同様の方法で、ドロップダウン要素のように動作する入力要素がいくつかあります。アプリケーションの性質上、これはこのままにしておく必要があります。要素を編集不可に設定しました。これにより、ユーザーが直接操作することを防ぎながら、アプリがその下にオプションのリストを含む疑似ドロップダウン メニューを作成できるようになります。いずれかがクリックされると、jQuery プラグインはその値をその入力に割り当てます。

問題は、トリガーされる検証チェッカーがあるonblurため、バリデーターが時期尚早に検証しているように見えますが、もちろん正常に動作しています。バリデータプラグインを書き直すのは嫌です。

その特定のクリック イベントでフォーカス イベントまたはブラー イベントが一緒に発生するのを防ぐ方法はありますか?

これは、チャレンジのjsフィドルです

http://jsfiddle.net/powerphillg5/YHgKQ/

リンク#law-abidingcitizenを提供するときにここにコードを配置する必要があるため、ここにあるコードは次のとおりです。

<input type="text" id="my_input" value="Click me." />
<script>
$('#my_input').blur(function(){
    alert("Prevent me without removing the blur() and function that caused me!");
});

$("#my_input").click(function(){
    $(this).after("<ul>\
                  <li data-value='value1' class='click_me'>Now, click me,</li>\
                  <li data-value='value1' class='click_me'>or me!</li>\
                   </uL>");

    $(".click_me").click(function(){
        $("#my_input").val($(this).data("value"));
        $(this).parent().remove();
        $("#my_input").after("<img src='http://harrisongreetingcards.net/images/1316_thank_you_for_your_time_note_card.png' />");
    })

}); 
</script>
4

2 に答える 2

0

私にはアイデアがありますが、醜いですがうまくいきます。

  1. 元のぼかしを保持します。
  2. 新しいぼかしリスナーを変更して、setTimeout で元のぼかしを呼び出すようにします。
  3. タイムアウト発火前に、.click_me 要素がクリックされた場合はキャンセルします。それ以外の場合は、手放してください。

コードは次のようになります

var blurTimeout = false;
var inputObject = $('#my_input');
var inputBlur = $._data(inputObject[0], 'events').blur[0].handler;
inputObject.off('blur').blur(function(e) {
    blurTimeout = setTimeout(function() {
        inputBlur.apply(inputObject, e);//call original blur.
    }, 500);
});

クリック機能にキャンセルタイムアウトを追加します。

$(".click_me").click(function(){
    clearTimeout(blurTimeout);
    ...

そしてフィドルはここにあります。

それでも、ぼかしも直接変更することをお勧めします。

于 2013-08-13T12:08:27.623 に答える
0

やりたいことは、そのイベントからぼかしハンドラーをアンバインドすることだと思うので、ハンドラーを追加した後にこれを追加します。

// Add this after the handlers you want to prevent are added
$('#my_input').unbind('blur');   

または、ハンドラーをアンバインドできない場合 (まだ追加されていないため)、追加された場所に応じて、後で追加された他のハンドラーがオフになるのを防ぐ独自のハンドラーを追加できます。

// Add this before the handlers you want to prevent are added
$("#my_input").blur(function(event) {
   event.stopImmediatePropagation();
});

これらのイベントの発生を本質的に防止したため (そして何かがそれらに依存している可能性があるため)、これは全体的な機能に影響を与える可能性があることに注意してください。そのため、ある時点で機能を再バインドしてイベントを偽造するか、特定の関数を呼び出すだけで済みます。

編集:あなたの質問をもう一度読んだ後。ぼかしイベントはクリック イベントの前に発生しているため、クリック イベント内からオフにすることはできません。そのため、他の状況でぼかしイベントを発生させたい場合 (たとえば、箱から出してタブで移動したとき) は、より賢い操作を行う必要があります。その場合、何をすべきかを決定する独自のぼかしハンドラーを作成するか、別のフィールドがフォーカスを取得したときに、意図的にぼかしイベントを強制する他のハンドラーを追加する必要がある場合があります。

私はあなたのアプリケーションを知らないので、あなたが何を必要としているのかを知るのは難しいですが、うまくいけば、それがあなたがそれを機能させるのに役立つはずです.

于 2013-08-13T01:36:21.163 に答える