2012-04-25 4 views
7

bir parametrenin nasıl iletileceği bir olayın işleyicisine nasıl parametre geçirilir?Bir olayın işleyicisine

burada yapmaya çalıştığım buydu çalışmaz:

for (var i = 0; i < myobj.length; i++) { 
myobj[i].onmouseover = myfun(myobj[i]); 
} 

aşağıdaki hiçbiri çalışmıyor.

myobj[i].onmouseover = myfun.call(myobj[i]); 
myobj[i].onmouseover = function() {myfun(myobj[i]);}; 
myobj[i].onmouseover = function() {myfun.call(myobj[i]);}; 

Öncelikle neden çalışmadığı ve çözümün aynı stilde ilgilendiği ile ilgileniyorum.

Teşekkürler.

cevap

9

Verilecek olan parametrelerin kapsüllenmesi için işleyicileriniz için bir içerik oluşturucu işlevini kullanın.

function createHandler(param) { 
    return function() { 
    myfun(param); 
    } 
} 

for (var i = 0; i < myobj.length; i++) { 
    myobj[i].onmouseover = createHandler(myobj[i]); 
} 

Yaklaşımınızın çalışmadığı nedeni, bir işlev çağrısından geçmediğiniz, ancak bir işlev çağrısının sonucu olduğu için. Böylece ilk örneğinizde myfun(myobj[i]) değerlendirilir ve sonuç olay işleyicisi olarak iletilir.

Sanırım, gerçekten kastettiğiniz şey, olayın gerçekleşmesi durumunda fonksiyonun değerlendirilmesi. Bunu yapmak için ya parametreyi global varyasyon yoluyla ya da dataset property olarak geçirmelisiniz. Bununla birlikte, daha temiz bir çözüm, yukarıda gösterildiği gibi bir jeneratör fonksiyonuna sahip olmaktır.

+0

çok teşekkürler. Tam olarak ihtiyacım olan şey. –

+0

PS takip eden soru. Ne yapıyorum, bunu yapmak için deyimsel bir yol var mı? temelde bir grup span.xyz elemanım var, bunların hepsinin bir mouseover davranışına sahip olmasını istiyorum. (fakat JQuery'yi veya başka birini kullanmazsınız) –

+1

@XahLee Herhangi bir kütüphane kullanmadığınız sürece, bence, bu en iyi uygulama. – Sirko

3

başka bir yaklaşım, onmouseover olayı harekete DOM elemanı üzerinde yöntem (bir fonksiyonu) olarak getirilebilir gerçeğini kullanmaktır.

başka deyişle

, bunu yapmak için birini beklendiği gibi kod yazmak:

for (var i = 0; i < myobj.length; i++) { 
    myobj[i].onmouseover = function() { myFun(this) }; 
} 

Ben more complete example yükledim: Burada

obj = xahlees(); 
obj.onmouseover(); 

bir çözümdür.

+0

biraz geç, ama aynı zamanda harika bir çözüm. Teşekkür Leonel. –