我需要跟蹤相對於我的應用中的<canvas>
元素的鼠標位置。目前,我有一個mousemove
事件監聽器附加到<canvas>
,它在發生火災時更新我的鼠標位置,使用offsetX
/offsetY
(/layerY
),當offsetX/Y
不可用時。使用offsetX/Y
或layerX/Y
可以給我鼠標座標,相對於我的<canvas>
,這正是我想要的。當我的應用程序發揮它的魔力時,各種CSS 3d轉換將應用於<canvas>
,即使<canvas>
進行了非常大的轉換,offsetX/Y
仍然在<canvas>
的局部變換座標空間內給出了精確的座標。在沒有鼠標移動事件的情況下跟蹤相對鼠標位置
這有點令人困惑,所以我會嘗試說明一個例子。如果我的<canvas>
的寬度和高度均爲100px,並且位於相對於瀏覽器視口的(0,0)處,並且單擊(50,50)(在視口座標系中),對應於(50,50)in我的<canvas>
和50是通過offsetX
和offsetY
(正確)返回的值。如果我然後將transform: translate3d(20px,20px,0px)
應用於我的<canvas>
並單擊(50,50)(在視口座標系中),由於我的畫布已向下移動20px和20px,實際上相當於(30,30)相對於<canvas>
, 30是通過offsetX
和offsetY
(正確)返回的值。
我面臨的問題是當用戶沒有物理移動鼠標時要做什麼,但<canvas>
正在轉換。我只更新了mousemove
事件上的鼠標位置,所以如果沒有mousemove
,我該怎麼辦?
例如。我的鼠標位於(50,50),並且沒有轉換應用於<canvas>
。我的this.mouseX
和this.mouseY
都等於50;當我將鼠標移動到(50,50)時,他們被保存在最後的mousemove
事件中。根本沒有移動鼠標,我將上面的轉換(transform: translate3d(20px,20px,0px)
)應用於我的<canvas>
。現在,我需要this.mouseX
和this.mouseY
每個等於30,因爲這是我的鼠標相對於當前轉換<canvas>
的新位置。但this.mouseX
和this.mouseY
仍然等於50.因爲我從來沒有移動過鼠標,所以沒有發生mousemove
事件,而且這些被保存的座標也不會被更新。
我該如何面對呢?我想創建一個新的jQuery事件,根據我的舊/舊鼠標位置手動分配一些屬性(pageX
和pageY
?),然後觸發該事件,但我不認爲這會導致瀏覽器重新計算offsetX
和offsetY
屬性。我也一直在考慮採用已知的舊/舊鼠標位置並將其乘以我的轉換矩陣,但由於我的鼠標座標位於2d空間中,所以這會變得非常複雜,但我應用於<canvas>
的轉換是所有3d轉換。
我想真的,我想要做的就是將我已知的2d頁面位置和光線投射到3d空間中,並找出我在點擊轉換的<canvas>
,所有的javascript(jQuery都可用)。
這可能嗎?這甚至有意義嗎?
如果您想在不移動鼠標的情況下獲得「新的」鼠標座標 - 那麼我認爲您必須從最後一個mousemove事件中獲取「舊」座標,並將這些轉換應用於這些值自己來計算正確的「新」座標應該是什麼。 – CBroe 2014-09-24 08:40:19
@CBroe我真的希望避免這種情況,但你可能是對的... – 2014-09-24 18:17:36