2016-07-28 15 views
0

私はホバー上のマウスイベントを呼び出すためのjQuery each機能を使用します。各機能内で機能付きの値を送信する方法は?

$('.entry .post-entry a').each(function(){ 
    root.setDimensions(this); 
    $(this).on("mouseenter", root.mouseEnter); 
    $(this).on("mousemove", root.mouseMove); 
    $(this).on("mouseleave", root.mouseLeave); 
    $(this).on("click", root.onClick); 
}); 

これは素晴らしい作品が、私は、これらの機能にアイテムのインデックスを送信する必要があります。問題は、各機能の最後に()の機能マークを追加すると、ページ読み込み後に関数が呼び出されますが、これは必要ありません。

パラメータを使用して関数に変数を送信する方法がわかりました。しかし、これらを使用するには、そのような中括弧を利用する必要があります。

$('.entry .post-entry a').each(function(index){ 
    var index = index; 
    root.setDimensions(this); 
    $(this).on("mouseenter", root.mouseEnter(index)); 
    $(this).on("mousemove", root.mouseMove(index)); 
    $(this).on("mouseleave", root.mouseLeave(index)); 
    $(this).on("click", root.onClick(index)); 
}); 

がどのように値を送ることができる関数を直接呼び出すことなく?

答えて

1

bind()を使用してみてください:あなたが実行したとき、それは(第二および前方のparam)を受け取ります機能(第一パラメータ)と、その後のパラメータの範囲を(当たり前)に結合することができます

$('.entry .post-entry a').each(function(index){ 
    var index = index; 
    root.setDimensions(this); 
    $(this).on("mouseenter", root.mouseEnter.bind(this, index)); 
    $(this).on("mousemove", root.mouseMove.bind(this, index)); 
    $(this).on("mouseleave", root.mouseLeave.bind(this, index)); 
    $(this).on("click", root.onClick.bind(this, index)); 
}); 

bind()で。


実際、@ RoryMcCrossanが言ったことは:ループ内のイベントをバインドするのは良いことではありません。ベストプラクティスは、1つの選択肢にバインドすることです。 しかし、と彼は、イベントの中でindex()を使用するように提案しました。良いイデアであるかどうかは、イベントが呼び出される頻度によって異なります。そのために、あなたはbind()とtogheter index()を使用して、それらを繰り返していない、両方の方法を混在させることができます:

$.fn.onWithIndex = function(eventType, callback) { 
    $(this).on(eventType, function(e) { 
    var $el = $(this), 
      index = $el.data("index") ? $el.data("index") : $el.index(); 

    $el.data("index", index); 
    callback.call(this, index, e); 
    }); 
}; 

// Use 
$(".posts a").onWithIndex("mouseenter", root.mouseEnter); 

この関数は、それを行う方法のサンプルです。そうした種類のイベントがたくさん必要な場合は、いい方法です。イベントラッパーを実行して、エレメントのデータ内の保管索引が見つからない場合は、index()を実行します。この関数はサンプルであり、元のon()などのセレクタパラメータでは機能しません(例:$('...').on("mouseenter", "another-selector", function() { .. });)。これは動作しません。

Demo

+0

mouseEnterのような機能はどうですか?同様に: 'mouseEnter:function(event、index){}'? – Caspert

+0

@Caspert no。バインドされたargsが最初に配置されるので、 '(index、event)'になります。どのような引数が関数内にあるのか分からないときは、 'console.log(arguments)'を使ってそれをチェックしてください。 – DontVoteMeDown

+0

さて、いいですね。だから、あなたはいつも 'console.log(arguments)'を使うことができます。そして多分愚かな質問ですが、あなたはあなたの方法や@ RoryMcCrossanからのものを好むのですか? – Caspert

1

部分的に適用されたパラメータを持つ関数を返しますバウンド関数を作成します。

$('.entry .post-entry a').each(function(index){ 
    var index = index; 
    root.setDimensions(this); 
    $(this).on("mouseenter", root.mouseEnter.bind(root, index)); 
    $(this).on("mousemove", root.mouseMove.bind(root, index)); 
    $(this).on("mouseleave", root.mouseLeave.bind(root, index)); 
    $(this).on("click", root.onClick.bind(root, index)); 
}); 

続きを読むFunction.prototype.bind property hereを参照してください。

0

イベントハンドラをループ内に割り当てることは、各インスタンスがイベントを発生させた要素から現在の要素インデックスを取得できるため、冗長です。これを試してください:

+0

それは複数のイベントを束縛するための素晴らしい方法ですが、いつも 'index()'を呼び出すのはそれほど費用がかかりません。 – DontVoteMeDown

+0

@DontVoteMeDownおそらく、イベントが発生する頻度とOPのHTML構造がどのように見えるかによって異なります。あなたは初期ループを維持し、 'a'要素に' data'属性を設定し、ロード時にインデックスをそこに格納して、イベント内でそれを読み戻すことができます。私が避けようとしている主なことは、ループ内にイベントハンドラを作成することです:) –

+0

あなたが提案したこの2番目のオプションはおそらく最高です。 – DontVoteMeDown