17

選択要素が変更されたときに関数をトリガーしようとしています。

Ipad は on('change') に問題があるため、Ipad で正常に動作する 'blur' にもバインドしたいと考えています。

ただし、両方のイベントで関数が 2 回トリガーされるのは望ましくないため、変更ぼかしの両方がトリガーされた場合に、基礎となる関数が 1 回だけ起動されるようにするための何らかのフックが必要です。

これは私が今やっていることですが、... あまり良くありません:

// make sure binding is only assigned once
var compSel = $('#my_select');
if ( compSel.jqmData('bound') != true ){
    console.log("bound");
    compSel.jqmData('bound', true)
        .on( $.support.touch ? 'blur' : 'change', function(){
            console.log("trigger");
            // run function xyz
        })
    }               

これは、すべてのタッチ可能なデバイスがblurで間に合わせられる場合に機能します。

質問:
ぼかしと変更が関数を1回だけトリガーするようにするためのより良いアイデアを誰かが持っていますか?

手伝ってくれてありがとう!

4

6 に答える 6

29

両方のイベントにバインドされた関数を作成し、タイムアウトを追加して関数を呼び出してみてください。このように、関数が複数回呼び出された場合でも、一度だけ実行されます。

このようなもの(必要に応じてタイムアウトを調整できます):

function blurChange(e){
    clearTimeout(blurChange.timeout);
    blurChange.timeout = setTimeout(function(){
        // Your event code goes here.
    }, 100);
}

$('#my_select').on('blur change',blurChange);
于 2012-07-05T14:43:08.503 に答える
4

iPadについてはわかりませんが、ブラウザではおそらくこのようなものです

$("#dataTable tbody").on("click blur", "tr", function(event){
        if (event.type == "click")
        { 
        //do stuff
        }
        else
        {
        //do nothing
        }
});
于 2012-07-05T14:30:13.800 に答える
0

いいことではありませんが、 を関数に呼び出してchangeblur関数内ですべてのことを行うことができchangeます。

...
$(document).on("change", "#yourelement", function(){
    //do your stuff
});
....
$(document).on("blur", "#yourelement", function(){
    $("#yourelement").change();
    //alternatively, you can trigger the change event
    //$("#yourelement").trigger("change");
});

見栄えはよくありませんが、うまくいくはずだと思います。

編集: ブラウザが両方のイベント (blur と change) を起動する場合、このコードはchange機能を 2 回呼び出します。ある種のフラグでその動作を実現できると思います:

var executed = false;
...
$(document).on("change blur", "#yourelement", function(){
    if(!executed){
        executed = true;
        //do your stuff
    }
});
于 2012-07-05T14:30:06.873 に答える
-4

同時に複数のイベントにバインドできます。

$(document).on('blur change','#mySelector',function(){
    // this is called on either
});
于 2012-07-05T14:37:17.537 に答える