chrome extension(2)

39 篇文章 2 订阅
23 篇文章 0 订阅

可以直接参考http://chromeextensionsdocs.appspot.com/extensions/getstarted


开发第一个chrome扩展

转自:http://blog.csdn.net/tango991820/article/details/8129702

如何开始

第一步

根据使用的用途和产品特征,来选择扩展的表现形式:

接口 表现 介绍
page action 地址栏图标,点击打开新tab页面或内容注入 适用于只对少数页面有意义的特征(比如RSS订阅)。
browser action 工具栏图标,点击打开一个popup层或新tab页面 适用于多数页面有意义的特征(比如我常用代码格式化工具jsbeautifier)。
app 应用程序列表,点击打开内置tab页面或任意域名的新网页 为了获得最佳体验(比如全屏、桌面快捷方式、任务栏图标),或者兼容其他浏览器(部署到自己的服务器上,比如'wordsquared.com'应用)。

* 关于google官方推荐用browser action的原因是如果把扩展脚本注入到所有页面,将会显著影响原有页面的性能。

** 另外,更主要的原因是,chrome扩展目前没有提供没有类似于firefox的,可以上所有页面上悬浮的widget层。

*** browser action的popup.html限制了展示大小,只能约为800x600像素。

第二步

建立扩展所需的文件夹,在下面放置manifest.json文件——里面申明插件的表现形式,依赖文件等等。

page action的示例:

{
  "name": "My Extension",
  "version": "0.4.0",
  "icons" : {
      "16": "icon.png",
      "48": "icon48.png",
      "128": "icon128.png"
  },
  "description": "My first chrome extension.",
  "page_action": {
      "default_title": "在些页面启用",
      "default_icon": "foo.png",
      "default_popup": "html/popup.html"
  },  
  "background_page": "html/background.html",
  "options_page": "options/index.html",
  "content_scripts": [
    {
      "matches": ["http://*/*", "https://*/*"],
      "run_at": "document_idle",
      "css": ["css/style.css"],
      "js": ["js/foo.js","js/bar.js"]
    }
  ],
  "permissions": [
    "tabs",
    "notifications",
    "idle",
    "http://*/",
    "https://*/"
  ]
}

你的目录对应的是浏览器中的 'chrome-extension://{extensionId}/'根目录。

content scripts是page action将注入到特定页面中的脚本,permissions授权它可以在哪些条件下执行。

options page是扩展的设置页面。

对于扩展,background page 定义的html页面必须的并且是最重要的。在浏览器开启后,扩展本身在这个后台页面上运行。

backgroun page可以使用所有的chrome.* api,在它之外的扩展页面需要使用 chrome.extension.getBackgroundPage() 来与它通讯;而浏览器中页面不能访问它,只有content scripts可以通过chrome.extension.sendRequest()与它通讯。

图示1:page action、browser action与content scripts的区分


* content scripts被注入了原有页面中,修改了DOM。

图示2:dom、原有脚本与content scripts联系示意

 
* 原有脚本与content scripts在不同的环境中,不能直接通讯;可能存在多个content scripts(不同扩展注入的),它们互相也是隔离的;但是DOM是共享的,因此可以由DOM来共享数据、共享事件通知。

第三步

搭建完扩展的基础结构之后,就可以在chrome中测试它。

点击chrome的“选项/工具/扩展程序”,在新打开的页面中,打开“开发人员模式”,然后就出现了:“载入正在开发的扩展程序...”按钮,点击它即可选择你的扩展目录以开始测试。

Snippets

  • 如何保持打开的tab唯一

    [javascript]  view plain copy
    1. <code class="chili-lang-javascript" style="margin:0px; padding:0.5em; font-family:Monaco,'Bitstream Vera Sans Mono',Consolas,'Lucida Console',monospace; color:rgb(101,123,131); border:none; font-size:14px; line-height:1.4; display:block"><span class="keyword" style="margin:0px; padding:0px; color:rgb(133,153,0)">var</span> option_url = chrome.extension.getURL(<span class="string" style="margin:0px; padding:0px; color:rgb(42,161,152)">'options/index.html'</span>);  
    2. chrome.tabs.getAllInWindow(<span class="literal" style="margin:0px; padding:0px">null</span>,<span class="function" style="margin:0px; padding:0px"><span class="keyword" style="margin:0px; padding:0px; color:rgb(133,153,0)">function</span><span class="params" style="margin:0px; padding:0px">(tabs)</span>{</span>  
    3.     <span class="keyword" style="margin:0px; padding:0px; color:rgb(133,153,0)">var</span> option_tab = tabs.filter(<span class="function" style="margin:0px; padding:0px"><span class="keyword" style="margin:0px; padding:0px; color:rgb(133,153,0)">function</span><span class="params" style="margin:0px; padding:0px">(t)</span> {</span> <span class="keyword" style="margin:0px; padding:0px; color:rgb(133,153,0)">return</span> t.url === option_url });  
    4.     <span class="keyword" style="margin:0px; padding:0px; color:rgb(133,153,0)">if</span>(option_tab.length){  
    5.         <span class="comment" style="margin:0px; padding:0px; color:rgb(147,161,161); font-style:italic">// 已经打开,直接激活</span>  
    6.         chrome.tabs.update(option_tab[<span class="number" style="margin:0px; padding:0px; color:rgb(42,161,152)">0</span>].id,{selected:<span class="literal" style="margin:0px; padding:0px">true</span>});  
    7.     }<span class="keyword" style="margin:0px; padding:0px; color:rgb(133,153,0)">else</span>{  
    8.         chrome.tabs.create({url:option_url,selected:<span class="literal" style="margin:0px; padding:0px">true</span>})  
    9.     }  
    10. });  
    11. </code>  
  • 回到指定窗口的指定tab:

    [javascript]  view plain copy
    1. <code class="chili-lang-javascript" style="margin:0px; padding:0.5em; font-family:Monaco,'Bitstream Vera Sans Mono',Consolas,'Lucida Console',monospace; color:rgb(101,123,131); border:none; font-size:14px; line-height:1.4; display:block"><span class="comment" style="margin:0px; padding:0px; color:rgb(147,161,161); font-style:italic">// todo: 保存一个tab引用,或者仅仅是tabId和windowId</span>  
    2. <span class="keyword" style="margin:0px; padding:0px; color:rgb(133,153,0)">var</span> tab = foo;  
    3. chrome.windows.get(tab.windowId,<span class="function" style="margin:0px; padding:0px"><span class="keyword" style="margin:0px; padding:0px; color:rgb(133,153,0)">function</span><span class="params" style="margin:0px; padding:0px">(win)</span> {</span>  
    4.   chrome.windows.update(win.id,{focused:<span class="literal" style="margin:0px; padding:0px">true</span>});  
    5.   chrome.tabs.update(tab.id,{selected:<span class="literal" style="margin:0px; padding:0px">true</span>});    
    6. })  
    7. </code>  

    前台tab页面通知backgroundPage:

    var key = 'some_method',parameters = {};
    chrome.extension.sendRequest({ report : key, parameters : parameters }, callback);
    
  • backgroundPage通知tab页面方式,脚本注入:

    // 执行一个文件
    chrome.tabs.executeScript(tabId, { file: 'foo.js' });
    // 一段代码
    chrome.tabs.executeScript(tabId, { code: 'alert(1)'} );
    // 另,插入CSS方法,参数与上面类似
    chrome.tabs.insertCSS(tabId, { file: 'foo.css' });
    
  • 通过localStorage存储扩展配置

    localStorage['member'] = JSON.stringify({username:'ambar'})
    
  • 往特定tab页中的扩展发送一个请求:

    // 第二个参数完全自定义
    chrome.tabs.sendRequest(tab.id, { foo:true, any_other_params:'' });
    
  • 桌面通知有两种格式:HTML和纯文件,具体API

    [javascript]  view plain copy
    1. <code class="chili-lang-javascript" style="margin:0px; padding:0.5em; font-family:Monaco,'Bitstream Vera Sans Mono',Consolas,'Lucida Console',monospace; color:rgb(101,123,131); border:none; font-size:14px; line-height:1.4; display:block"><span class="comment" style="margin:0px; padding:0px; color:rgb(147,161,161); font-style:italic">// html式,可以简单的用查询变量传递参数</span>  
    2. <span class="keyword" style="margin:0px; padding:0px; color:rgb(133,153,0)">var</span> notify_html = <span class="function" style="margin:0px; padding:0px"><span class="keyword" style="margin:0px; padding:0px; color:rgb(133,153,0)">function</span><span class="params" style="margin:0px; padding:0px">(icon,title,message)</span> {</span>  
    3.     <span class="keyword" style="margin:0px; padding:0px; color:rgb(133,153,0)">var</span> encode = encodeURIComponent;  
    4.     <span class="keyword" style="margin:0px; padding:0px; color:rgb(133,153,0)">var</span> notification = webkitNotifications.createHTMLNotification(  
    5.         chrome.extension.getURL(  
    6.             <span class="string" style="margin:0px; padding:0px; color:rgb(42,161,152)">'html/notification.html?message='</span>+encode(message)  
    7.             +<span class="string" style="margin:0px; padding:0px; color:rgb(42,161,152)">'&title='</span>+encode(title)  
    8.             +<span class="string" style="margin:0px; padding:0px; color:rgb(42,161,152)">'&icon='</span>+encode(icon)  
    9.         )  
    10.     );  
    11.       
    12.     notification.show();  
    13. };  
    14.   
    15. <span class="comment" style="margin:0px; padding:0px; color:rgb(147,161,161); font-style:italic">// 文本格式,可以设置一个图标和标题</span>  
    16. <span class="keyword" style="margin:0px; padding:0px; color:rgb(133,153,0)">var</span> notify_plain = <span class="function" style="margin:0px; padding:0px"><span class="keyword" style="margin:0px; padding:0px; color:rgb(133,153,0)">function</span><span class="params" style="margin:0px; padding:0px">(icon,title,message)</span> {</span>  
    17.     <span class="keyword" style="margin:0px; padding:0px; color:rgb(133,153,0)">var</span> notification = webkitNotifications.createNotification(  
    18.         chrome.extension.getURL(<span class="string" style="margin:0px; padding:0px; color:rgb(42,161,152)">'notification.png'</span>)  
    19.         ,title  
    20.         ,message  
    21.     );  
    22.     notification.show();  
    23.     <span class="comment" style="margin:0px; padding:0px; color:rgb(147,161,161); font-style:italic">// 显示完之后5秒关闭</span>  
    24.     notification.ondisplay = <span class="function" style="margin:0px; padding:0px"><span class="keyword" style="margin:0px; padding:0px; color:rgb(133,153,0)">function</span><span class="params" style="margin:0px; padding:0px">(e)</span> {</span>  
    25.         setTimeout(<span class="function" style="margin:0px; padding:0px"><span class="keyword" style="margin:0px; padding:0px; color:rgb(133,153,0)">function</span><span class="params" style="margin:0px; padding:0px">()</span> {</span> notification.cancel(); }, <span class="number" style="margin:0px; padding:0px; color:rgb(42,161,152)">5000</span>);  
    26.     }  
    27. }</code>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值