2011-01-17 2 views
2

ユーザーがドラッグして要素インデックスを保存したいときなど、特定のイベントが発生したときに私が保持したい値があります。この値は、別のイベントが発生する場合に必要です。私はそれがいつまで発射されるかわからない。Javascriptイベント間でパラメータを渡すためのきれいな方法はありますか?

グローバル変数を使用してこれらの値を保持しています。名前空間を持つオブジェクトにこれらの値を入れるのと同じようにこれを行うより良い方法があるようです。利点?その他の提案はありますか?

+0

名前空間は常に良好です。しかし、それはあなたの "アプリケーション"に依存します。サイト専用に作成する場合(環境を管理する場合など)は、グローバルで作業することができます。 –

+0

名前空間の変数はまだグローバルで、閉じ込められています... –

答えて

3

各値の関連するコンテナである親要素にデータをバインドできます。例えばドラッグ&ドロップ可能なアイテムが多い#dragAndDropContainerがあるとすると、ドラッグイベントが発生すると(ドラッグが開始されるとすぐに)、次のように実行できます:

$('#dragAndDropContainer').data('lastDragged', $(this).attr('id')); 

そして、必要なときに毎回$('#dragAndDropContainer').data('lastDragged')を照会してください。

1

私はdavinのソリューションが好きですが、それがあなたに合っていない場合は、ここに別の方法があります。次のように、イベントハンドラの周りにクロージャを作成することができます。

var data = { x: 1, y: 2 }; 
var handler = function() { 
    console.log(data); 
} 

if (node.addEventListener) { 
    node.addEventListener('mousedown', handler, false); 
} else { 
    node.attachEvent('onmousedown', handler); 
} 
+1

hehe、attachEventを意味すると思いますが、attackEventも試してみることができます:) – davin

+0

@davinこれは私が長い間作った最高のタイプです。私はそれを修正することはほとんど嫌いです。 – Hemlock

+0

私はあなたの痛みを感じます。私のコメントは記憶を永続させるだろう – davin

4

いつも私のお気に入りはイベントハンドラに変数をカリングしています。カレーは、関数プロトタイプで、機能に呼び出されたときには、プリセットの引数を持つ関数のバージョンを返します。

Function.prototype.curry = function curry() { 
    var fn = this, args = Array.prototype.slice.call(arguments); 
    return function curryed() { 
     return fn.apply(this, args.concat(Array.prototype.slice.call(arguments))); 
    }; 
}; 

node.addEventListener('mousedown', handler.curry(var1,var2,etc)); 
0

(時々カレーとして知られている)Function.bindを使用する代わりに:あなたはのスコープを制御することができます共有変数。ここにそれを示すjQuery疑似コードがあります。共有は2つのハンドラにアクセス可能で、他の誰にもアクセスできません。

$(function(){ 
    var shared = {a:1, b:2}; 
    $('#id-1').click(function() { 
     alert(shared.a); 
    }); 

    $('#id-2').click(function() { 
     alert(shared.b); 
    }); 
}); 

jQueryプロシージャコードを記述している場合は、クロージャのアプローチがはるかに簡単です。私が書いたほとんどのものはオブジェクトなので、あまりにも多くのレベルの内部クロージャーに陥ることはないので、ハンドラーが共有変数にアクセスする必要がある場合は、バインディング/カリング(Martinの例のような)

関連する問題