2017-05-30 21 views
0

現在、私は、コードのこの部分がありますは一度だけ

var tracked = false; 
$('.button').on('click', function(e){ 
    e.preventDefault(); 
    // do stuff on each click 
    if(!tracked) { 
     // track interaction just once 
     tracked = true; 
    } 
}); 

を..しかし、私はそれがよりエレガントな原因私は、各インタラクティブのためにどこでもtracked VARを持つことができないようにしたいです。だから私はこれを考えている:

$('.button').on('click', function(e){ 
    e.preventDefault(); 
    // do stuff on each click 
    $('.button').one('click', function(e){ 
     // track interaction just once 
    }); 
}); 

...しかしそれはとてもいいとは思わない。それは良いことができますか?

編集済み:ボタンは、各クリックで必要な要素をトグルしますが、各クリックではなく、1回だけインタラクションをトラッキングします。

+1

正直に言うと、それはあなたが必要とするものは不明だ - あなたは、ユースケースを説明することができます - コードの2番目のビットは、ボタンが、私はそれを行う必要があるのdivをトグル最初 –

+0

@JaromandaXと同じように動作しません1回のクリックではなく、1回の操作だけを追跡します。 – 3zzy

+0

その場合、 '.one'は2回目のクリックだけに適用されるので、2番目のコードブロックは間違いなく正しいですか? –

答えて

2

.one()すべてが必要です。これを.on()と同時に使用して複数のイベントリスナーを同じボタンに追加すると、異なるイベントを発生させたり、いくつかのイベントを無効にしたり、無効にすることができます。

.one()イベントは一度発生し、それ自体を削除すると、追加の.on()クリックイベントは残り、発火し続けます。

// add a listener that will only fire once 
 
$('.button').one('click', function(e){ 
 
    console.log('one click event'); 
 
}); 
 

 
// add another listener that will continue to fire 
 
$('.button').on('click', function(e){ 
 
    console.log('regular click event'); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button class="button">Click Me</button>

あなたはできるだけコンパクトにしたい場合は、いくつかのjqueryのチェーンを使用することができます。

$('.button').one('click', function(e){ 
    // tracking code 
}).on('click', function(e){ 
    // toggling code 
}); 
+0

ボタンは、各クリックで必要なdivをトグルしますが、各クリックではなく、1回だけインタラクションをトラッキングします。 – 3zzy

+0

@ 3zzy私は複数のイベントリスナーでこれに対処するために私の答えを更新しました。あなたはあなたの質問でこれを明確にすべきです。 – Soviut

+0

@ 3zzy私はまた、コードのよりコンパクトなバージョンを含めるように更新しました。 – Soviut

0

これは基本的に.one()関数のコードと同じですが、コールバックが1つ少なくなります。私はそれがよりエレガントなように感じる。

$('#selector').bind('click', function() { 
 
     $(this).unbind('click'); 
 
     console.log('Clicked!'); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button id='selector'>Click Me</button>

1

オプションは

function oneTime(el) { 
 
    console.log("ok"); 
 
    el.onclick = null; 
 
}
<button onclick="oneTime(this);">test</button>

ようなものになるだろう。しかし、私は.one()最良の選択肢であると考えてい

0
$('.button').data("tracked", false).on('click', function(e){ 
    e.preventDefault(); 
    if($(this).data("tracked") !== true) { 
     $(this).data("tracked", true); 
     // do stuff on each click 
    } 
});