2014-06-25 133 views
0

對於SDK附加組件,我試圖通過右鍵單擊來檢測最接近的頁面錨點(如described here)。在SDK中首次獲取鼠標座標右鍵點擊

因爲JavaScript沒有先創建鼠標事件偵聽器,顯然沒有辦法查詢鼠標座標,因爲我不想在每個頁面上運行所有時間的昂貴的鼠標懸停偵聽器! (並且輪詢重建一個鼠標監聽器是醜陋的,反正也不完全準確),我希望我能從點擊事件中獲得鼠標座標。不幸的是,儘管self.on('click'不火:

  1. 此事件是在不離開鼠標座標可以得到
  2. 添加正常window.addEventListener('click',...聽衆實際上並不在SDK內容腳本被解僱與第一菜單事件對象因爲某種原因的選擇(然而,它隨後會發射)。

這裏是我的解決辦法,但我想火就目前確切座標,而不是節點的座標:

var x, y; 
window.addEventListener('click', function (e) { 
    if (e.button === 2) { 
     x = e.clientX; 
     y = e.clientY; 
    } 
}, true); 

self.on('click', function (node) { 
    if (!x) { // Since this is not showing the first time, we fire on the node (which is specifically an element, not a text node), though we really want the real clientX and clientY where the mouse is, not this simulation based on where the element is 
     node.dispatchEvent(new MouseEvent('click', { 
      button: 2 
     })); 
    } 
    // Use document.caretPositionFromPoint with x and y to determine location of text 

是否有任何其他的方式來獲得實際的鼠標座標?

+0

異步使用代碼我無法真正重現此問題。 'addEventListener(「click」,...)總是在self.on(「click」,...)之前觸發,當我嘗試它時。你能否詳細說明一下? – nmaier

+0

對我來說,這個問題只發生在加載頁面的第一次嘗試。重新加載頁面會導致同樣的情況再次發生:第一次嘗試未能正確檢測到(由於缺少點擊事件而需要通過if(!x)'解決方法來檢測過高),但後續的上下文菜單調用可以正常工作。使用FF 31.0對SDK 1.16進行測試。 –

+0

您正在使用https://github.com/brettz9/jump-to-anchor的代碼進行測試,對吧? – nmaier

回答

1

實際上,您可以在沒有鼠標偵聽器的情況下查詢鼠標座標。

這個頁面有一堆例子:https://developer.mozilla.org/en-US/docs/Mozilla/js-ctypes/Standard_OS_Libraries

它,因爲它使用JS-ctypes的要對每個操作系統的基礎上進行,雖然。如果你擔心表演,不要害怕。您可以通過ChromeWorker s

+0

迷人 - 如果它可能沒有操作系統依賴性,本來會很好,但是這很酷,謝謝! –

+0

:O @ ​​nmaier被一個新用戶帶走了!道具的人,可能是你第一次和最後一次tho:P – Noitidart

+0

FTR,雖然這個解決方案確實得到很好的座標,在我的情況下,我需要在用戶點擊時獲取菜單的座標,而不是在用戶點擊特定項目(就像加載項腳本可以得到通知的時間一樣)。我通過將pageMod關聯到cm(根據http://stackoverflow.com/a/11768820/271577)解決了該問題,並且pageMod對'click'事件沒有任何問題。 –