2011-09-19 65 views
1

我正在通過內容腳本創建一個使用鍵綁定(即將使用javascript keydown和keyup事件處理程序)的Chrome擴展。不過,我試圖讓這個與GMail合作,但我碰到了一個麻煩。使用Gmail的Chrome擴展內容腳本中的鍵盤綁定

中下面的代碼(內容腳本)的處理函數似乎只觸發,當我通過的GChat聊天的人:

$(window).bind('keydown', function(e){console.log('yay!');}); 

不幸的是,它似乎並沒有激活其他地方,包括我的時候我正試圖發送一封電子郵件。我看着在Gmail網頁源,和原來所有的內容實際上與ID canvas_frame一個iFrame顯示所在,所以我想這:

$('#canvas_frame').content().live('keydown', function(e){console.log('yay!');}); 

這:

$('#canvas_frame').content().find('body').live('keydown', function(e){ 
    console.log('yay!'); 
}); 

不幸的是,那也沒用。

manifest.json看起來是這樣的:

{ 
    "name": "extension", 
    "version": "1.0", 
    "description": "description", 
    "background_page": "background.html", 
    "content_scripts": [ 
    { 
     "matches": ["http://*/*", "https://*/*"], 
     "css": [], 
     "js": [ 
       "main.js" 
      ] 
    } 
    ], 
    "all_frames": true, 
    "permissions": [ 
    "http://*/*", "https://*/*" 
    ] 
} 

我想知道是否有人曾經做過一個關於發生了什麼線索,什麼是使用Gmail這樣做的正確的方式,如果$('#canvas_frame').content().live(...)是正確的方式去關於它。

謝謝!

回答

3

all_frames參數清單中放錯了地方,它應該是:

"content_scripts": [ 
    { 
     "matches": ["http://*/*", "https://*/*"], 
     "all_frames": true, 
     "js": ["main.js"] 
    } 
], 

我會通過內容腳本注入到iframe自己,做所有的鍵綁定有解決這個問題。識別這些iframe的URL並將各個內容腳本注入其中每個腳本。例如:

"content_scripts": [ 
    { 
     "matches": ["http://gmail.com/*"], 
     "all_frames": false, 
     "js": ["main.js"] 
    }, 
    { 
     "matches": ["http://gmail.com/iframe1.html"], 
     "all_frames": true, 
     "js": ["iframe1.js"] 
    }, 
    { 
     "matches": ["http://gmail.com/iframe2.html"], 
     "all_frames": true, 
     "js": ["iframe2.js"] 
    } 
], 
+1

哦,哇。謝謝你的收穫。 每個框架都有一個內容腳本的問題是GMail目前動態地編輯iFrames,這意味着不同的iFrames最初可能具有相同的'src'屬性,但功能不同。不過,我想出瞭如何將鍵綁定到特定iFrame內的元素。像'document.getElementById('canvas_frame')。contentDocument.onkeydown = handler'這樣的東西可以工作,如果我想用'jQuery.live'來觀察特定的元素,它也可以工作。 – yuzeh

相關問題