2009-07-15 29 views

Trả lời

44

Không thể. Tuy nhiên, bạn có thể sử dụng cùng một cách tiếp cận trong hướng dẫn để lưu trữ vị trí trong một biến toàn cầu và đọc nó bên ngoài sự kiện.

Như thế này:

jQuery(document).ready(function(){ 
    $().mousemove(function(e){ 
     window.mouseXPos = e.pageX; 
     window.mouseYPos = e.pageY; 
    }); 
}) 

Bây giờ bạn có thể sử dụng window.mouseXPoswindow.mouseYPos từ bất cứ nơi nào.

+0

Đó có phải là giới hạn jQuery hoặc JavaScript không? – pbz

+4

@pbz Đó là giới hạn JavaScript. –

+4

Tôi chỉ cần thiết lập một jQuery.one ('mousemove', function() {}); vì mục đích này. Delay nó với một setTimeout, nắm bắt vị trí chuột trong thời gian tới nó di chuyển, thì đấy. – aceofspades

29

này bắt đầu như là một lời nhận xét trên Chetan Sastry's answer, nhưng tôi nhận ra nó cũng có thể là giá trị đăng như một câu trả lời:

Tôi muốn cẩn thận về việc có một tài liệu cấp, luôn luôn chạy mousemove sự kiện, ngay cả khi bạn chỉ đang thăm dò ý kiến ​​cho vị trí con trỏ. Điều này là rất nhiều chế biến và có thể bog xuống bất kỳ trình duyệt, đặc biệt là những người chậm hơn như IE.

Một vấn đề như thế này gần như chắc chắn đặt ra câu hỏi về quyết định thiết kế: nếu bạn không cần xử lý sự kiện chuột để thăm dò vị trí con trỏ, bạn có thực sự cần vị trí con trỏ không? Có cách nào tốt hơn để giải quyết vấn đề bạn đang cố giải quyết không?

Chỉnh sửa: ngay cả trong Safari 4, đó là (cách nói) rất nhanh, sự kiện mousemove đơn lẻ này làm cho mọi tương tác với trang hướng dẫn đó trở nên đáng chú ý đối với tôi. Hãy nghĩ về điều đó sẽ ảnh hưởng đến nhận thức của người dùng về trang web hoặc ứng dụng của bạn như thế nào.

+3

+1: Tôi có cùng mối quan tâm. – Joel

+0

Không hoàn toàn đúng. Một sự kiện chuột luôn luôn được tạo ra. Tức là, khi chuột di chuyển, trình duyệt sẽ tính toán (thông qua mã gốc) một sự kiện chuột lên đến nhưng không bao gồm việc thực hiện các hàm gọi lại JS; đó là nền tảng cho tất cả người nghe sự kiện liên quan đến chuột. Nó chỉ đơn giản là trình duyệt không cung cấp lịch sự phổ biến của lộ thông tin đó ngoại trừ thông qua 'document.onmousemove'. Điều này, như xa như tôi đang quan tâm, là một thiển cận của ES5/ES6. Thật vậy, vị trí chuột bỏ phiếu có thể đơn giản hóa các sự kiện 'onmousemove' bị loại bỏ, chẳng hạn như khi di chuyển các phần tử DOM bằng chuột. – codechimp

10

Chức năng này sẽ làm giảm ảnh hưởng đến hiệu suất UI bằng cách chỉ nhận vị trí chuột ở một khoảng thời gian: "Bây giờ bạn có thể sử dụng window.mouseXPoswindow.mouseYPos từ bất cứ nơi nào"

function getMousePosition(timeoutMilliSeconds) { 
    // "one" attaches the handler to the event and removes it after it has executed once 
    $(document).one("mousemove", function (event) { 
     window.mouseXPos = event.pageX; 
     window.mouseYPos = event.pageY; 
     // set a timeout so the handler will be attached again after a little while 
     setTimeout(function() { getMousePosition(timeoutMilliSeconds) }, timeoutMilliseconds); 
    }); 
} 

// start storing the mouse position every 100 milliseconds 
getMousePosition(100); 

Cũng giống như trong câu trả lời khác

Bạn mất một chút chính xác khi di chuyển chuột sẽ không được phát hiện trong các khoảng thời gian.

+6

Bạn nên tránh sử dụng các cấu trúc giống như eval. Chúng kém hiệu quả hơn và là những rủi ro bảo mật tiềm ẩn. 'setTimeout (function() {getMousePosition (timeoutMilliSeconds)}, timeoutMilliseconds);' –

1

Tôi đã thử tính linh hồn của @Chetan Sastry, nhưng nó không hoạt động. (Tôi đang sử dụng jQuery 1.6.4). Tôi thay đổi mã và sau đó tôi làm việc ngay bây giờ. Đây là mã của tôi. Hy vọng điều này có thể giúp cho bạn.



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

+0

Đã xác minh. Thay đổi này cũng sửa lỗi cho jQuery 1.4.4 – Emperorlou

Các vấn đề liên quan