簡單說,懂chrome插件開發的人都知道,chrome插件主要有三層(姑且這么稱謂)。這三層經緯可謂明確,可以從功能和權限的角度去理解他們:
1、background層,chrome插件底層,控制整個chrome插件的大腦,具有最高權限;
2、content層,content-script腳本工作平台,本質上是chrome插件腳本注入層,權限最低只能影響頁面DOM,不能跨域操作,但是可以通過chrome.runtime.sendMessage與background層交互;
3、popup/option層,UI交互層,權限中等,可以直接使用background的實例對象,也可以通過消息與content層交互。
實際開發中,經常會遇到在content層獲取數據,提交到后台server的情況,后台server與content頁面存在跨域問題。
chrome插件中解決跨域問題是比較簡單,當然,可以直接在content腳本中使用jsonp的方式跨域,也可以將需要提交的數據發送給background層,由background提交后台服務。
我采取的方式是后者,通過消息與background通信,坑兒也是在發送消息的時候碰到的。
發送消息:
chrome.runtime.sendMessage({data: "hello world!"}, function(response) {
console.log(response);
});
坑兒:總是報錯Uncaught Error: chrome.runtime.connect() called from a webpage must specify an Extension ID (string) for its first argument
后來,通過測試發現是我調用chrome.runtime.sendMessage的時機問題,不要在content腳本注入的時候就調用該函數,換句話說就是:要在頁面加載完畢時調用該方法:
$(function(){
chrome.runtime.sendMessage({data: "hello world!"}, function(response) {
console.log(response);
});
});
這是搞原型測試時,發現的坑,一些函數的調用(時機)沒有結合業務,所以,實際結合業務開發中可能自然就越過了該坑兒,但是,還是留個印記吧。