1

我正在爲Chrome瀏覽器的vimperator插件中的一些功能編寫擴展。如何避免將焦點移至Chrome擴展中的Google搜索欄?

目前我在捕捉網頁前的擊鍵時遇到了一些麻煩。 「最簡單」的例子是google.com。當我在搜索字段中輸入某些內容時,該字段會自動選中,並且我輸入的任何文本都會輸入到該字段中。

基本上我想停止這種行爲,以便當我按下按鈕焦點不會移動到搜索字段。 (之後,我希望擴展根據按下的鍵進行響應,但是如果我可以停止焦點移動,我已經有了這個工作。)

到目前爲止,我嘗試過removeEventListener ()和jquery unbind()以及一些其他的東西(或者瘋狂的猜測,如果你喜歡的話),在我的擴展的內容腳本中,但目前還沒有運氣。當按下字母數字鍵時,焦點仍移至搜索欄。有沒有人有任何建議可以做到這一點或我可以尋找答案?

我對此事表示歉意,但之前我已經提出過任何問題,但無法獲得任何幫助。 PS:如果你應該對更多的上下文感興趣,那麼到目前爲止我已經可以找到代碼here。但我應該認爲,這個問題是可以回答的,任何人都不必因爲看到這個(混亂)而頭疼。

回答

0

讀完element.focus() method之後,我編寫了下面的代碼來模糊focus()調用返回到事件循環之前由文檔聚焦的元素。

這個想法是我們爲每個元素添加一個焦點偵聽器,然後在onload之後刪除焦點偵聽器,以便在用戶事件(如jsfiddle.com或Google結果頁面)之後調用focus()的網站仍然可以工作在頁面加載後正確。

警告:我一直無法弄清楚如何讓Chrome禁用autofocus fields

內容的腳本(稱之爲unfocus.js):

document.addEventListener('DOMNodeInsertedIntoDocument', onInsertedIntoDocument, true); 
document.addEventListener('DOMNodeRemovedFromDocument', onRemovedFromDocument, true); 
window.addEventListener('load', function(e) { 
    setTimeout(function() { 
    removeOnFocus(document.documentElement); 
    document.removeEventListener('DOMNodeInsertedIntoDocument', onInsertedIntoDocument, true); 
    document.removeEventListener('DOMNodeRemovedFromDocument', onRemovedFromDocument, true); 
    }, 1); 
}, false); 


// Whenever an element is inserted into document, listen for 
// simple event named 'focus'. 
function onInsertedIntoDocument(e) { 
    var elt = e.target; 
    if (elt.nodeType === 1) 
    elt.addEventListener('focus', onfocus, false); 
} 
function onRemovedFromDocument(e) { 
    var elt = e.target; 
    if (elt.nodeType === 1) 
     removeOnFocus(elt); 
} 
function onfocus(e) { 
    // In Chrome, caller is null if the user initiated the focus, 
    // and non-null if the focus was caused by a call to element.focus(). 
    var causedByUser = (onfocus.caller == null); 

    console.log('onfocus ' + e.target.nodeName + 
     ': caused by user? ' +causedByUser + 
     (e.target.autofocus ? ' autofocus' : '')); 

    if (! causedByUser) { 
    e.target.blur(); 
    } 
} 
// Clean up by removing all the 'focus' event listeners. 
function removeOnFocus(elt) { 
    elt.removeEventListener('focus', onfocus, false); 
    for (var i = 0; i < elt.children.length; i++) 
    removeOnFocus(elt.children[i]); 
} 

這manifest.json的:

{ 
    "name": "unfocus", 
    "version": "1.0", 
    "content_scripts": [ 
    { 
     "matches": ["http://*/*"], 
     "js": ["unfocus.js"], 
     "run_at": "document_start" 
    } 
    ] 
} 
+0

感謝您的回答。我看到有很多事情我不瞭解js中的事件。我沒有時間去測試這些,我可能暫時沒有時間,但是當我看到它的時候我會報告回來。 – inconvergent

相關問題