2010-09-18 36 views
1

我想的onclick調用的函數,事件對象傳遞給函數:由封閉對象(YT),然後調用progressBarClicked然後分配onclick事件的功能

progressBarOuter.onclick = function(e) { 
    var x; if (!e) { 
     x=window.event.clientX; 
    } 
     else { 
      x = e.clientX 
    } 

    yt.clickedOffset = x; yt.progressBarClicked 
} 

所以我分配到clickedOffset使用clickedOffset var。但我實際上寧願做的是這樣的:

progressBarOuter.onclick = yt.progressBarClicked(e); 

因爲它更加緊湊。問題是,即使用戶點擊了或沒有執行這一點的代碼... yt.progressBarClicked(e)。

有沒有辦法解決這個問題?

回答

6

您:

progressBarOuter.onclick = yt.progressBarClicked(e); 

不會產生預期的結果,因爲你並沒有使用功能yt.progressBarClickedonclick處理程序。你實際上正在調用該函數,因此將其返回值分配給onclick

最短的工作的事情你可以不破壞任何東西是這樣的:

progressBarOuter.onclick = function(e){ 
    yt.progressBarClicked((e || window.event).clientX); // pass the x position as a parameter 
}; 

如果你不把它包起來,yt.progressBarClicked將從window對象調用並因此this裏面的函數值將也要設置爲window對象。

當然,你也可以處理函數中的x位置的計算,只是事件傳遞給它:

progressBarOuter.onclick = function(e){yt.progressBarClicked(e);}; 
+0

嗨,是的,我完全理解發生了什麼,只是想知道是否有一種不同的方法,我可以用來避免額外的匿名函數......但是,這progressBarOuter.onclick = function(e){yt.progressBarClicked(e);}; 似乎是一個足夠優雅的解決方案。謝謝! – 2010-09-18 08:07:21

+0

實際上只是在做進度BarOuter.onclick = yt.progressBarClicked;已經足夠了...... progressBarClicked接收了該事件 – 2010-09-22 19:48:42

1

嘗試

progressBarOuter.onclick = yt.progressBarClicked; 

但在技術上,這是不一樣的原密碼。鼠標位置(clientX)的計算完全丟失。

+0

是啊,這是我的問題。我想要完全按照上面所寫的內容進行,但我需要通過事件......只是認爲可能有辦法做到這一點,但我不知道 – 2010-09-18 07:39:40

+0

事件將自動傳遞到您的' progressBarClicked'函數,因爲它是鼠標事件的回調函數。 – Anurag 2010-09-18 07:41:42

+0

這將破壞'yt.progressBarClicked'內的'this',因爲該函數是從'window'對象調用的。 – 2010-09-18 07:45:56