2011-06-01 18 views
1

我有這個例程,它被稱爲onmouseover某個元素。我希望在那裏稍微延遲一點 - 即在效果發生之前給用戶時間mouseout。該效果使用event.clientX值。但是,在回調被調用的時候看起來 - 在500ms之後--對象不再存在。我如何整齊地堅持event.clientX的狀態?在setTimeout回調函數中持久event.clientX值

function showTip(sDivID){ 
    SHOW_TIP_TIMEOUT_ID = setTimeout(function(){ 
     var div = $('#'+sDivID).show()[0]; 
     div.style.left = event.clientX; 
    } ,500) 
} 
+0

我沒有看到該代碼中定義的事件,它的範圍是什麼,它來自哪裏? – Robert 2011-06-01 15:34:40

+0

@Robert我相信它是DOM的一部分,但不同於瀏覽器和瀏覽器。我正在開發主要用於Internet Exploder 8. [參考 - 事件](http://www.w3schools.com/jsref/dom_obj_event.asp) – 2011-06-01 15:40:17

+0

不,它不是DOM的一部分;它是IE瀏覽器中的'window'屬性,但不包含任何其他瀏覽器。 – Pointy 2011-06-01 15:41:41

回答

2

如果你靠這個只在Internet Explorer中工作,你可以保存設置超時前值:

function showTip(sDivID) { 
    var x = event.clientX; 
    SHOW_TIP_TIMEOUT_ID = setTimeout(function() { 
    var div = $('#' + sDivId).show()[0]; 
    div.style.left = x; 
    }, 500); 
} 

如果你想這對其他工作瀏覽器,你必須在事件處理程序本身中抓取事件,並將其傳遞給它,否則將其存儲在全局(ick)中。由於您使用的是jQuery,它已經可以讓所有的瀏覽器規範化工作,所以您應該利用這一點。

+0

當一個瀏覽器成爲目標時,看到網絡開發正在進行,當創建更通用的軟件並不難。 – Pointy 2011-06-01 15:45:32

+0

我知道,這很令人傷心 - 但我在一家只有IE瀏覽器(和IE6直到幾個月前)的組織中工作 - 而且我們的計算機上的其他瀏覽器的安裝被阻止。 Whadoesaguydo? – 2011-06-01 15:55:28

+1

是的,我知道你的意思。儘管如此,這是一種普遍的方式。我個人不怪你:-) – Pointy 2011-06-01 16:00:08

1

事件對象在IE中是全局的。所有瀏覽器的潛在快速解決方案 - 如果您只是使用clientX整數而不是完整的事件對象,則只存儲整數。喜歡的東西:

function showTip(sDivID, savedClientX){ 
    SHOW_TIP_TIMEOUT_ID = setTimeout(function(){ 
     var div = $('#'+sDivID).show()[0]; 
     div.style.left = savedClientX; 
    } ,500) 
} 
+1

事件對象僅在Internet Explorer中是全局的,而不在其他瀏覽器中。 – Pointy 2011-06-01 15:37:13

+0

我希望能夠在不改變'showTip()'的呼叫簽名的情況下做到這一點... – 2011-06-01 15:41:34

+0

@Pointy:謝謝澄清的IE使用。 @E Ronnoco:我會讓其他人在不改變信號的情況下創建一個關於如何去做的答案,並將留下我的答案留給子孫後代。 – 2011-06-01 15:55:18