[关闭]
@forestsheep 2019-11-25T10:49:37.000000Z 字数 4543 阅读 189

Chrome扩展开发的简介与实战(3)

学习

优秀扩展介绍

save to pocket 商店地址

tips

多看google官方的sample

学习开发扩展,除了查阅Api之外,还有一个很重要的方法就是研究官方提供的sample。

有时候为了实现一个功能费了半天劲,查了各种网上的问题。最后解决是解决了,但是后来发现在sample中早就有很好的方案了。如果前期就浏览过一遍sample的话,很多问题都可以迎刃而解。

官方sample虽然都是些很简单功能的演示,但是其中却有着能体现从设计者初衷的逻辑在内。如果了解了这些逻辑,后期会少走很多弯路。

content script

上一讲,我们的实战中,改变了网页的一些元素。我们用的方法是先在background里注册了icon button按下去的事件,然后在触发里面写如何改变页面的元素。

  1. chrome.pageAction.onClicked.addListener(function(tab) { // 点击icon执行
  2. chrome.tabs.executeScript({
  3. code: 'document.body.style.backgroundColor="gray";document.getElementsByClassName("gaia-header-header")[0].style.backgroundColor="gray";'
  4. }); // 这里也可以是file来指定js,css文件
  5. })

这里我们其实已经用到了content script,只是用到了它的一种方式:程序式

今天要介绍的是另外一种方式: 申明式
详见谷歌官方文档

  1. {
  2. "name": "My extension",
  3. ...
  4. "content_scripts": [
  5. {
  6. "matches": ["http://*.nytimes.com/*"],
  7. "css": ["myStyles.css"],
  8. "js": ["contentScript.js"]
  9. }
  10. ]
  11. }

其实从底层逻辑上说,这两者没什么差别,即使有差别也是写法上的。随着后面的学习这一点会渐渐显露出来,现在不必理会。

特性

content script的工作原理是在页面加载完后,对页面上的DOM进行加工。有一点比较特殊,他有自己的作用域。(作用域将在后面章节做详细介绍)它既不属于页面自身所带js所在的域,也不属于扩展的background域。

content script可以使用所有的js自带功能,但是只能使用一部分的chrome提供的api,如果想使用全部的api,就得把消息传给background,在background中实现。这就牵涉到消息传递机制(也在稍后介绍)。

实战 3-1

去除 Announcement

manifest.json

  1. {
  2. "description": "invisible kintone announcement",
  3. "manifest_version": 2,
  4. "name": "sample 3-1 content script",
  5. "content_scripts": [{
  6. "matches": [
  7. "https://*.cybozu.com/k/*",
  8. "https://*.cybozu.cn/k/*"
  9. ],
  10. "js": [
  11. "inject.js"
  12. ]
  13. }],
  14. "version": "1.0"
  15. }

inject.js

  1. window.onload = function () {
  2. let ann = this.document.getElementsByClassName("ocean-portal-announcement")
  3. console.log(ann)
  4. if (ann.length > 0) {
  5. setTimeout(() => {
  6. ann[0].style.display = "none"
  7. }, 1000)
  8. }
  9. }

获取页面元素的方法

这些内容属于js范畴,不是chrome extension范围的知识。但是由于比较常用,在这里还是做一些介绍。将来也起到一个查阅的作用。
可以不必强行掌握,在运用的同时边查边用,效果更好。

了解DOM

DOM (Document Object Model)

MDN上的解释如下

文档对象模型 (DOM) 是HTML和XML文档的编程接口。它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档的结构,样式和内容。DOM 将文档解析为一个由节点和对象(包含属性和方法的对象)组成的结构集合。简言之,它会将web页面和脚本或程序语言连接起来。

上述解释不理解也没关系,一般只要理解为节点或元素即可。

然后我们需要去操作DOM

javascript原生方法

https://www.w3schools.com/js/js_htmldom.asp

getElementById()

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h2>Finding HTML Elements by Id</h2>
  5. <p id="intro">Hello World!</p>
  6. <p>This example demonstrates the <b>getElementsById</b> method.</p>
  7. <p id="demo"></p>
  8. <script>
  9. var myElement = document.getElementById("intro");
  10. document.getElementById("demo").innerHTML =
  11. "The text from the intro paragraph is " + myElement.innerHTML;
  12. </script>
  13. </body>
  14. </html>

getElementByTagName()

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h2>Finding HTML Elements by Tag Name</h2>
  5. <p>Hello World!</p>
  6. <p>This example demonstrates the <b>getElementsByTagName</b> method.</p>
  7. <p id="demo"></p>
  8. <script>
  9. var x = document.getElementsByTagName("p");
  10. document.getElementById("demo").innerHTML =
  11. 'The text in first paragraph (index 0) is: ' + x[0].innerHTML;
  12. </script>
  13. </body>
  14. </html>

getElementsByClassName()

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h2>Finding HTML Elements by Class Name</h2>
  5. <p>Hello World!</p>
  6. <p class="intro">The DOM is very useful.</p>
  7. <p class="intro">This example demonstrates the <b>getElementsByClassName</b> method.</p>
  8. <p id="demo"></p>
  9. <script>
  10. var x = document.getElementsByClassName("intro");
  11. document.getElementById("demo").innerHTML =
  12. 'The first paragraph (index 0) with class="intro": ' + x[0].innerHTML;
  13. </script>
  14. </body>
  15. </html>

getElementsByName()

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. First Name: <input name="fname" type="text" value="Michael"><br>
  5. First Name: <input name="fname" type="text" value="Doug">
  6. <p>Click the button to get the tag name of the first element in the document that has a name attribute with the value "fname".</p>
  7. <button onclick="myFunction()">Try it</button>
  8. <p id="demo"></p>
  9. <script>
  10. function myFunction() {
  11. var x = document.getElementsByName("fname")[0].tagName;
  12. document.getElementById("demo").innerHTML = x;
  13. }
  14. </script>
  15. </body>
  16. </html>

querySelectorAll()

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h2>Finding HTML Elements by Query Selector</h2>
  5. <p>Hello World!</p>
  6. <p class="intro">The DOM is very useful.</p>
  7. <p class="intro">This example demonstrates the <b>querySelectorAll</b> method.</p>
  8. <p id="demo"></p>
  9. <script>
  10. var x = document.querySelectorAll("p.intro");
  11. document.getElementById("demo").innerHTML =
  12. 'The first paragraph (index 0) with class="intro": ' + x[0].innerHTML;
  13. </script>
  14. </body>
  15. </html>

css selector

教材

选择符
类型 符号
tag none
id #
class .
group ,
运算符
类型 符号
descendant(后裔) space(空格)
child(儿女 隔代无效) >
adjacent sibling(邻居 紧挨) +
general sibling(邻居 同一层) ~

jquery

我们也可以用jquery库提供的方法来选择元素

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>find demo</title>
  6. <style>
  7. span {
  8. color: blue;
  9. }
  10. </style>
  11. <script src="https://code.jquery.com/jquery-3.4.1.js"></script>
  12. </head>
  13. <body>
  14. <p><span>Hello</span>, how are you?</p>
  15. <p>Me? I'm <span>good</span>.</p>
  16. <div>Did you <span>eat</span> yet?</div>
  17. <script>
  18. var spans = $( "span" );
  19. $( "p" ).find( spans ).css( "color", "red" );
  20. </script>
  21. </body>
  22. </html>
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注