Google Chrome 拡張でページ内リンク変更イベントを取得する
追記
onhashchange をとれば以下のものは必要ありません。
動機
URL が http://hoge.com/index.html#a から http://hoge.com/index.html#b に変わったことを知りたい。この URL 変更では onload イベントは発生しない。
ポイント
- background.html で chrome.tabs.onUpdated.addListener してタブの onUpdated イベントを受け取る
- Content Script から sendRequest でイベントを受け取りたいとリクエスト
- background.html は sendRequest をしたタブの id を取得してそれをキーに callback を登録
- onTabUpdated で callback を呼び出して Content Script 側に通知
意外と面倒。
コード
background.html
<!DOCTYPE html> <html> <head> </head> <body> <script> function onTabUpdated(tabId, changeInfo, tab) { if (tabCallbacks[tabId] && changeInfo.url && changeInfo.url.match(/^http:\/\/localhost\//)) { tabCallbacks[tabId]({param : "hoge"}); } } var tabCallbacks = {}; function onRequest(request, sender, callback) { if (request.action == 'notifyTabUpdated') { chrome.tabs.getSelected(null, function(tab) { tabCallbacks[tab.id] = callback; }); } }; function init() { chrome.extension.onRequest.addListener(onRequest); chrome.tabs.onUpdated.addListener(onTabUpdated); chrome.extension.onRequest.addListener(onRequest); } window.addEventListener('load', init, false); </script> </body> </html>
tab.js
function registerCallback() { chrome.extension.sendRequest({'action' : 'notifyTabUpdated'}, onTabUpdated); } function onTabUpdated(param) { alert('hage' + (param ? param.param : 'null')); // we have to re-register the callback, after it is called. registerCallback(); } registerCallback();
注意
- sendRequest を介して送られた callback を background.html から2回呼ぶことは出来ないようだ。
- manifest.json に permissions で tabs を書くのを忘れない