2011-10-14 36 views
23

所以,就像問題指定的那樣,是否有辦法在jQuery中觸發mousemove事件,並將鼠標座標發送到事件Object?有沒有辦法觸發mousemove並獲取event.pageX,event.pageY?

到目前爲止,我的代碼可以使用.trigger(event)函數觸發mousemove,但event.pageX和event.pageY未定義。

+0

這是測試嗎? – airportyh

+0

一旦你可以做的事情是從最後一個真正的mousemove事件中保存事件數據,那麼如果沒有新的事件數據存在,那麼當你以編程方式觸發它時重用它。如果真正的鼠標移動事件沒有被觸發,這意味着鼠標沒有移動,所以最後一個真正的鼠標移動的eventData應該保持當前位置。 – Mahn

回答

3

我不相信通過JavaScript/jQuery按需獲得鼠標座標;但是如果你的位置綁定到一個全局變量,你就可以隨時訪問它們在整個文件是這樣的:

$(document).ready(function(){ 
    $().mousemove(function(e){ 
     window.xPos = e.pageX; 
     window.yPos = e.pageY; 
    }); 
}); 

一少的CPU密集型選項,你可以添加一個暫停,但你有輕微的貿易業績在明知延遲鼠標的位置:

function getMousePosition(timeoutMilliSeconds) { 
    $(document).one("mousemove", function (event) { 
     window.xPos = event.pageX; 
     window.yPos = event.pageY; 
     setTimeout("getMousePosition(" + timeoutMilliSeconds + ")", timeoutMilliSeconds); 
    }); 
} 
getMousePosition(100); 

您現在應該能夠從任何地方訪問window.xPos和window.yPos使用這兩種解決方案在文件中,而無需觸發事件人造。

+7

-1這沒有解決涉及手動觸發事件的問題。 – zzzzBov

+0

我知道如何通過在對象上綁定mousemove來獲得鼠標的座標。但是,說鼠標不動,但我想在jQuery中使用觸發器功能來觸發虛擬鼠標移動並仍然獲得座標。 –

+2

@ geossj5 - 如果您已經在跟蹤鼠標,並且鼠標不再移動,那麼無論最後一次記錄的座標是什麼樣子,情況依然如此......? –

0

我不確定我完全理解這個問題。你可以這樣做:

$('.someClass').mousemove(function(event){ 
    console.log(event.pageX); 
    console.log(event.pageY); 
}); 

現在,只要在someClass鼠標移動時,將註冊XY cordinates。以下是jsfiddle以查看它的行動和jQuery documentation

+1

我知道如何通過在元素上綁定mousemove來獲取鼠標的座標。但是,說鼠標不動,但我想在jQuery中使用觸發器功能來觸發虛擬鼠標移動並仍然獲得座標。 –

+0

你是怎樣用Javascript移動鼠標的? – Ryre

0

如果這是你要求的,你不能移動鼠標。但是你可以用你想要的任何上下文和參數來調用一個函數。例如:

function foobar(e) 
{ 
    this.className = 'whatever'; // this == element 
} 

someElement.onmousemove = foobar; 

var obj = {whatever:'you want'}; 
foobar.call(someElement, obj); // calls foobar(obj) in context of someElement 
0

想想我知道你的問題。您正在嘗試以編程方式查詢鼠標位置。也許你有這樣的代碼:

$(document).one('mousemove.myModule', function (e) { 
    // e.pageY and e.pageX is undefined. 
    console.log('e.pageY: ' + e.pageY + ', e.pageX: ' + e.pageX); } 
     ).trigger('mousemove.myModule'); 

那麼你是絕對正確的。事件對象的屬性pageY和pageX將不會被定義。實際上,事件對象中有很多東西不會存在,不僅僅是.pageY.pageX。可能是jQuery中的一些錯誤。無論如何,只是不要鏈接該電話觸發而不是觸發$(窗口)上的事件。不要問我爲什麼它的工作原理雖然但對我來說做的:

$(document).one('mousemove.myModule', function (e) { 
    console.log('e.pageY: ' + e.pageY + ', e.pageX: ' + e.pageX); }); 

// Now e.pageY and e.pageX will be defined! 
$(window).trigger('mousemove.myModule'); 
37

您需要直接觸發事件之前設置pageXpageY。要設置這些屬性,請創建一個jQuery.Event對象。

// create a jQuery event 
e = $.Event('mousemove'); 

// set coordinates 
e.pageX = 100; 
e.pageY = 100; 

// trigger event - must trigger on document 
$(document).trigger(e); 

See it in jsFiddle

+0

這不起作用,因爲jQuery在調用觸發器時會忽略pageX和pageY參數。 –

+0

什麼使你得出這個結論?看看[這個jsfiddle](http://jsfiddle.net/yPgnp/)。 – tenedor

+0

我同意,這種方法對我來說是最好的,很容易自己定義事件,只是自己改變pageX/pageY的道具 – CatalinBerta

0

這是我能想到的最好的,這並沒有解決你設置全局變量。點擊事件仍然會捕獲座標,因此您可以將該事件傳遞給您的鼠標移動。

$(element).click(function(e){ 
    $(element).trigger('mousemove',e); 
}); 

然後,該事件對象將是您的mousemove函數中的第二個參數;第一個是實際的mousemove事件或jQuery創建的事件。

$(element).mousemove(function(e,clickEvent){ 
    if typeof e.pageX === 'undefined' e = clickEvent; 
    // or if you prefer, clickEvent.pageX; 
}); 
相關問題