相关文章推荐
淡定的小摩托  ·  谷歌翻译API ...·  4 月前    · 
老实的灭火器  ·  c# .net core ...·  10 月前    · 
逼格高的凉面  ·  jquery - ...·  1 年前    · 

Chrome 插件 0基础开发实战课

目录

第一章:介绍Chrome插件开发

1.1 什么是Chrome插件,它们有哪些优势和用途

1.2 Chrome插件的基本架构和组成部分

1.3 Chrome插件开发环境的准备和配置

1.4 Chrome开发者工具的介绍和使用方法

第二章:HTML、CSS和JavaScript基础

2.1 HTML基础知识,如标签、属性、文本和图像

2.2 CSS基础知识,如样式、布局、选择器和动画

2.3 JavaScript基础知识,如变量、函数、流程控制和DOM操作

第三章:开发一个简单的Chrome插件

3.1 确定插件需求和功能

3.2 创建和配置manifest.json文件

3.3 编写和调试popup页面

3.4 使用content script实现页面注入和交互

3.5 测试和优化插件的功能和用户体验

第四章:进阶Chrome插件开发技巧

4.1 使用Chrome API实现更复杂的插件功能,如Tabs、Storage和Notifications

4.2 使用第三方库和框架,如jQuery、Bootstrap和Vue.js

4.3 增加插件的安全性和隐私保护,如跨站点脚本攻击和用户数据保护

4.4 优化插件的性能和响应速度,如异步操作和缓存

第五章:发布和维护Chrome插件

5.1 准备发布Chrome插件的必要文件和信息

5.2 注册Chrome开发者账号并上传插件到Chrome Web Store

5.3 处理插件审核和更新申请 5.4 监测和解决插件的用户反馈和bug报告

5.5 更新插件以适应新的Chrome浏览器版本和需求

第六章:高级Chrome插件开发技术

6.1 使用Chrome Native Messaging与本地应用程序进行通信

6.2 使用Chrome Runtime API开发后台脚本

6.3 实现多语言支持和国际化

6.4 实现自动化测试和代码覆盖率分析

6.5 集成第三方服务和API,如Google Analytics和OAuth2

第七章:Chrome插件开发案例分析

7.1 实现一个简单的网页翻译插件

7.2 实现一个密码管理器插件

7.3 实现一个广告屏蔽插件

7.4 实现一个批量下载插件

7.5 实现一个社交媒体插件

第八章:Chrome插件市场和商业化

8.1 分析Chrome插件市场的趋势和机会

8.2 制定Chrome插件的商业化策略和计划

8.3 推广和营销Chrome插件,如SEO和社交媒体营销

8.4 监测和分析Chrome插件的用户数据和行为

8.5 实现Chrome插件的付费模式和增值服务


第一章:介绍Chrome插件开发

1.1 什么是Chrome插件,它们有哪些优势和用途

Chrome插件是一种基于Google Chrome浏览器的扩展程序,它们可以为浏览器添加额外的功能和特性。Chrome插件具有以下优势:

  • 方便的安装和卸载:用户可以从Chrome Web Store上轻松找到、安装和卸载Chrome插件,不需要任何额外的软件或设置。
  • 增强浏览器的功能和性能:Chrome插件可以为浏览器添加各种实用的工具和功能,如广告屏蔽、网页翻译、密码管理和下载管理等。
  • 提高用户的生产力和体验:Chrome插件可以帮助用户更加高效地使用浏览器和互联网,提高其工作效率和用户体验。

常见的Chrome插件用途包括但不限于:

  • 提高网页浏览体验:如广告屏蔽、网页翻译、截图工具、页面美化等。
  • 管理和保护个人信息:如密码管理、隐私保护、网页阅读模式等。
  • 增强工作效率:如To-Do List、待办事项提醒、时间管理工具、自动化脚本等。

1.2 Chrome插件的基本架构和组成部分

Chrome插件的基本架构和组成部分包括:

  • Background Script:后台脚本,用于处理插件的主要逻辑和功能,可以访问Chrome API。
  • Content Script:内容脚本,用于在特定的网页上注入自定义的JavaScript和CSS,以实现与网页的交互。
  • Popup Page:弹出页面,用于显示插件的主要用户界面和交互操作,通常由HTML、CSS和JavaScript组成。
  • Options Page:选项页面,用于显示插件的设置选项和用户偏好,通常由HTML、CSS和JavaScript组成。
  • Manifest File:清单文件,用于描述插件的基本信息、权限和组成部分,以及与Chrome浏览器的交互方式。

1.3 Chrome插件开发环境的准备和配置

Chrome插件开发需要一些基本的软件和工具,包括:

  • Google Chrome浏览器:作为Chrome插件的主要运行环境和测试平台,需要安装和更新到最新版本。
  • 文本编辑器:用于编写和编辑插件的HTML、CSS和JavaScript代码,推荐使用支持代码高亮、语法检查和自动补全的编辑器。
  • Chrome开发者工具:作为Chrome插件开发的重要调试工具和辅助工具,可以用于查看和修改网页和插件的代码和样式,以及检测和修复错误和问题。
  • Chrome插件开发文档和示例:作为学习和参考的重要资源和工具,可以帮助开发者了解Chrome插件开发的基本概念、技术和最佳实践,以及快速上手和开发插件。

安装和配置Chrome插件开发环境需要以下步骤:

  1. 安装Google Chrome浏览器,并将其更新到最新版本。
  2. 安装文本编辑器,推荐使用Sublime Text、Visual Studio Code等支持插件和代码高亮的编辑器。
  3. 打开Chrome浏览器,进入“更多工具”菜单,点击“扩展程序”选项。
  4. 开启“开发者模式”,即可使用Chrome插件开发和测试工具。

1.4 Chrome插件的开发流程和步骤

Chrome插件的开发流程和步骤包括:

  1. 确定插件的功能和用途,并根据需求进行设计和规划。
  2. 创建清单文件manifest.json,描述插件的基本信息、权限和组成部分。
  3. 编写和编辑Background Script、Content Script、Popup Page和Options Page等组成部分的代码和样式。
  4. 在Chrome浏览器中加载和测试插件,使用Chrome开发者工具进行调试和优化。
  5. 完成插件开发和测试后,提交到Chrome Web Store上线和发布,供用户下载和使用。

第二章:HTML、CSS和JavaScript基础

2.1 HTML基础知识,如标签、属性、文本和图像

HTML(Hyper Text Markup Language)是用于创建网页的标准语言,是前端开发的基础。在这一章节中,我们将介绍HTML的基础知识,包括标签、属性、文本和图像等方面。

  • 标签:HTML使用标签(tag)来定义网页中的各种元素,例如标题、段落、列表、链接等。标签通常由一对尖括号(< >)包围,其中第一个尖括号中是标签名称,第二个尖括号中是结束标记(/),例如 <p>...</p> 。
  • 属性:标签可以包含属性(attribute)来描述元素的特性,例如颜色、大小、位置等。属性通常包含一个名称和一个值,用等号(=)连接,例如:<p class="text">...</p>,其中class就是一个属性,其值为"text"。
  • 文本:HTML中的文本内容可以直接嵌入标签中,例如:<p>这是一个段落</p>。同时也可以使用特殊的字符实体来表示一些特殊符号,例如 < 表示小于号。
  • 图像:在HTML中可以使用<img>标签来添加图像,需要指定图像的路径和一些属性,例如:<img src="image.jpg" alt="图像描述">

2.2 CSS基础知识,如样式、布局、选择器和动画

CSS(Cascading Style Sheets)是用于控制网页样式的语言,可以通过CSS来定义网页中的各种元素的样式和布局。在这一章节中,我们将介绍CSS的基础知识,包括样式、布局、选择器和动画等方面。

  • 样式:CSS可以通过样式(style)来控制元素的外观,例如颜色、大小、字体等。样式可以直接在HTML标签中定义,也可以通过<style>标签或外部样式表来定义。
  • 布局:CSS可以通过盒模型(box model)来控制元素的布局,盒模型由内容区、内边距区、边框区和外边距区组成。同时也可以使用浮动(float)、定位(position)等方法来实现元素的布局。
  • 选择器:CSS使用选择器(selector)来选中需要样式化的元素,选择器可以根据元素的标签名、类名、ID等来进行匹配,例如:p、.text、#header等。
  • 动画:CSS可以通过动画(animation)来实现元素的动态效果,例如渐变、旋转、缩放等。动画可以通过@keyframes规则来定义,也可以使用CSS预设的动

2.3 JavaScript基础知识,如变量、函数、流程控制和DOM操作

JavaScript是一种面向对象、动态、弱类型的编程语言,常用于网页中实现交互效果和动态效果。在这一章节中,我们将介绍JavaScript的基础知识,包括变量、函数、流程控制和DOM操作等方面。

  • 变量:JavaScript使用变量(variable)来存储数据,变量可以存储数字、字符串、布尔值等各种类型的数据。在JavaScript中,变量需要先声明再使用,可以使用var、let或const关键字来声明变量。
  • 函数:JavaScript中的函数(function)是一段可重复使用的代码块,可以接收参数并返回值。函数可以通过function关键字来定义,例如:function add(a, b){ return a + b; }。
  • 流程控制:JavaScript中可以使用流程控制语句来实现程序的分支和循环,常用的流程控制语句包括if语句、for循环、while循环等。
  • DOM操作:DOM(Document Object Model)是HTML文档的对象表示,可以通过JavaScript来操作DOM元素,例如获取元素、修改元素的内容和属性、添加和删除元素等。在JavaScript中,可以使用document对象来访问和操作DOM元素,例如:document.getElementById("myDiv").innerHTML = "Hello World";。

第三章:开发一个简单的Chrome插件

3.1 确定插件需求和功能

在本节中,我们将介绍如何确定插件的需求和功能,并思考如何实现这些功能。

我们假设我们要开发一个自动填写表单的Chrome插件,该插件可以在用户登录网站时自动填写用户名和密码,并自动提交表单。

对于这个需求,我们可以考虑以下功能:

  • 显示一个popup窗口,让用户输入用户名和密码。
  • 当用户登录网站时,自动填写用户名和密码,并自动提交表单。
  • 如果用户在popup窗口中勾选“记住密码”,则下次登录时不需要再输入用户名和密码。

3.2 创建和配置manifest.json文件

在本节中,我们将介绍如何创建和配置manifest.json文件,以实现插件的需求和功能。

首先,我们需要在插件目录下创建一个manifest.json文件,并在其中指定插件的名称、描述、版本号、图标、权限等信息。下面是一个示例的manifest.json文件:

{
  "manifest_version": 3,
  "name": "AutoFill",
  "description": "Automatically fill in login form",
  "version": "1.0",
  "icons": {
    "128": "icon.png"
  "permissions": [
    "activeTab",
    "storage"
  "action": {
    "default_popup": "popup.html"
  "content_scripts": [
      "matches": ["http://*/*", "https://*/*"],
      "js": ["content_script.js"]

在这个manifest.json文件中,我们指定了插件的名称为“AutoFill”,描述为“Automatically fill in login form”,版本号为“1.0”,图标为“icon.png”,需要的权限为“activeTab”和“storage”,popup窗口为“popup.html”,content script为“content_script.js”。

3.3 编写和调试popup页面

在本节中,我们将介绍如何编写和调试popup页面,以实现插件的需求和功能。

首先,我们需要创建一个popup.html文件,并在其中添加表单元素和按钮。下面是一个示例的popup.html文件:

<!DOCTYPE html>
    <meta charset="UTF-8">
    <title>AutoFill</title>
    <script src="popup.js"></script>
  </head>
    <h1>AutoFill</h1>
    <form id="login-form">
        <label for="username">Username:</label>
        <input type="text" id="username" name="username">
      </div>
        <label for="password">Password:</label>
        <input type="password" id="password" name="password">
      </div>
        <input type="checkbox" id="remember-me" name="remember-me">
        <label for="remember-me">Remember me</label>
      </div>

3.4 使用content script实现页面注入和交互

Content script是一种在网页上下文中注入脚本的机制,可以通过它在网页上执行JavaScript代码,操作网页元素和与用户交互。在本节中,我们将介绍如何使用content script实现页面注入和交互。

3.4.1 创建content script

我们首先需要在manifest.json文件中定义一个content script,指定它要注入的网页和注入的脚本文件。具体地,我们在manifest.json文件中添加以下代码:

{
  "name": "My Chrome Extension",
  "version": "1.0",
  "manifest_version": 3,
  "description": "A simple Chrome Extension",
  "action": {
    "default_popup": "popup.html",
    "default_icon": {
      "16": "icon16.png",
      "32": "icon32.png",
      "48": "icon48.png",
      "128": "icon128.png"
  "content_scripts": [
      "matches": ["https://www.google.com/*"],
      "js": ["content.js"]

在这个例子中,我们定义了一个content script,它将会被注入到所有以 https://www.google.com/ 开头的网页中,注入的脚本文件为 content.js

3.4.2 编写content script

现在,我们需要编写 content.js 文件,实现我们需要的功能。下面是一个简单的例子,当用户点击页面上的按钮时,弹出一个提示框。

// content.js
console.log("Hello, world!");
function handleClick() {
  alert("Button clicked!");
const button = document.createElement("button");
button.textContent = "Click me!";
button.addEventListener("click", handleClick);
const container = document.createElement("div");
container.appendChild(button);
document.body.appendChild(container);

在这个例子中,我们创建了一个按钮元素,并添加了一个点击事件处理函数。然后,我们将按钮添加到页面中。

注意,在content script中不能直接使用Chrome扩展API,必须通过消息传递机制与background script通信。

3.4.3 调试content script

要调试content script,我们可以使用Chrome浏览器的开发者工具。在开发者工具中,我们可以在网页的Elements面板中查看和编辑注入的DOM元素,在Console面板中查看和调试注入的JavaScript代码。同时,我们可以在background script中使用 chrome.runtime.sendMessage chrome.tabs.sendMessage 方法向content script发送消息,从而测试和调试content script的功能。

3.4.4 实现页面注入和交互

现在我们已经定义了content script和编写了注入的JavaScript代码,下面让我们看看如何在网页上注入content script,并实现交互功能。

首先,我们需要在background script中监听tab切换事件,以便在用户切换到目标网页时注入content script。我们可以使用chrome.tabs.onUpdated方法来监听tab更新事件,并在回调函数中检查当前网页是否匹配我们的content script。

接下来,我们需要在content script中实现与用户交互的功能。由于content script是在网页上下文中运行的,因此我们可以使用普通的JavaScript代码来操作网页元素和与用户交互。如果我们需要使用Chrome扩展API,需要通过chrome.runtime.sendMessage方法向background script发送消息,让background script代为执行API调用。

下面是一个示例代码,演示了如何在网页上注入content script,并实现一个简单的交互功能。

{
"name": "My Chrome Extension",
"version": "1.0",
"manifest_version": 3,
"description": "A simple Chrome Extension",
"action": {
"default_popup": "popup.html",
"default_icon": {
"16": "icon16.png",
"32": "icon32.png",
"48": "icon48.png",
"128": "icon128.png"
"content_scripts": [
"matches": ["https://www.google.com/*"],
"js": ["content.js"]
}

background.js文件:

chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
if (changeInfo.status === "complete" && tab.url.includes("https://www.google.com/")) {
chrome.scripting.executeScript({
target: { tabId: tabId },
files: ["content.js"]

content.js文件中的代码:

console.log("Content script loaded.");
function handleClick() {
const input = document.querySelector("input[name='q']");
const value = input.value;
chrome.runtime.sendMessage({ action: "search", query: value });
const button = document.createElement("button");
button.textContent = "Search";
button.addEventListener("click", handleClick);
const container = document.createElement("div");
container.appendChild(button);
const form = document.querySelector("form[role='search']");
form.parentNode.insertBefore(container, form);

注意,在content script中我们通过chrome.runtime.sendMessage方法向background script发送了一个消息,让background script代为执行API调用。具体地,我们在点击按钮时,向background script发送了一个搜索请求,将搜索关键词作为参数传递给background script。然后,background script通过chrome.tabs.query方法获取当前活动的tab,并使用chrome.tabs.update方法更新tab的URL,从而实现了搜索功能。

现在,我们已经成功地开发了一个简单的Chrome插件,并实现了页面注入和交互功能。下一步,我们需要测试和优化插件的功能和用户体验。


3.5 测试和优化插件的功能和用户体验

完成插件的开发之后,最后一步就是进行测试和优化。在测试和优化过程中,我们需要关注以下几个方面:

  1. 测试功能是否正常:在安装和启用插件后,需要确保所有功能都正常工作。特别是在开发content script时,需要确保它能正确地注入到目标网站中,并与页面进行交互。
  2. 用户体验优化:优化插件的用户体验,可以使得用户更加愿意使用你的插件。例如,可以考虑增加一些提示信息,使得用户更容易理解插件的功能和使用方法。此外,还可以考虑增加一些动画效果和交互效果,让插件看起来更加生动有趣。
  3. 性能优化:插件的性能对用户体验也有很大影响。优化插件的性能可以让插件更加流畅和快速响应用户操作。例如,可以减少不必要的计算和网络请求,尽量避免在主线程上进行耗时操作等等。

第四章:进阶Chrome插件开发技巧

4.1 使用Chrome API实现更复杂的插件功能,如Tabs、Storage和Notifications

Chrome浏览器提供了丰富的API,开发者可以使用这些API实现更复杂的Chrome插件功能。下面介绍一些常用的API及其使用方法。

4.1.1 Tabs API

Tabs API用于管理Chrome浏览器的标签页,开发者可以使用这些API获取当前标签页、打开新标签页、关闭标签页、更新标签页内容等。以下是一些常用的Tabs API及其说明:

  • chrome.tabs.query:查询标签页,可以使用url、title等条件进行查询;
  • chrome.tabs.create:创建新标签页,可以指定url、active等参数;
  • chrome.tabs.update:更新指定标签页的url、title等信息;
  • chrome.tabs.executeScript:在指定标签页中注入JavaScript代码;
  • chrome.tabs.sendMessage:向指定标签页发送消息。

下面是一个示例代码,演示如何使用Tabs API实现打开新标签页和更新标签页:

background.js文件:

javascriptCopy code
// 打开新标签页
chrome.tabs.create({ url: "https://www.google.com/" });
// 更新指定标签页
chrome.tabs.query({ url: "https://www.google.com/*" }, (tabs) => {
  if (tabs.length > 0) {
    const tabId = tabs[0].id;
    chrome.tabs.update(tabId, { url: "https://www.baidu.com/" });

4.1.2 Storage API

Chrome提供了Storage API,可以让我们在插件中存储和读取数据。Storage API支持同步和异步的存储方式,同时也支持不同作用域(local、sync和managed)的存储。

local存储是指将数据存储在本地的Chrome浏览器中,只能被当前插件访问。sync存储是指将数据存储在Google服务器上,可以被当前用户的所有Chrome浏览器和插件访问。managed存储是指将数据存储在管理后台上,可以被管理员和被授权的用户访问。

以下是Storage API的一些常用方法:

  • chrome.storage.local.get:从local存储中获取数据;
  • chrome.storage.local.set:将数据存储到local存储中;
  • chrome.storage.local.remove:从local存储中删除数据;
  • chrome.storage.sync.get:从sync存储中获取数据;
  • chrome.storage.sync.set:将数据存储到sync存储中;
  • chrome.storage.sync.remove:从sync存储中删除数据;
  • chrome.storage.managed.get:从managed存储中获取数据;
  • chrome.storage.managed.set:将数据存储到managed存储中;
  • chrome.storage.managed.remove:从managed存储中删除数据。

以下是一个简单的示例代码,演示了如何使用Storage API在插件中存储和读取数据:

javascript Copy code

// 存储数据到local存储中
chrome.storage.local.get(["name", "age"], (data) => {
console.log(Name: ${data.name}, Age: ${data.age});
chrome.storage.local.get(["name", "age"], (data) => { 
console.log(Name: ${data.name}, Age: ${data.age}); 
// 删除local存储中的数据 
chrome.storage.local.remove(["name", "age"], () => { 
console.log("Data removed from local storage."); 

4.1.3 Notifications API

Chrome提供了Notifications API,可以让我们在插件中弹出桌面通知。通过Notifications API,我们可以控制通知的标题、消息、图标和声音等属性,并可以为通知添加点击事件或按钮操作。

以下是Notifications API的一些常用方法:

  • chrome.notifications.create:创建一个新的桌面通知;
  • chrome.notifications.clear:清除指定的桌面通知;
  • chrome.notifications.getAll:获取所有的桌面通知;
  • chrome.notifications.onClicked:处理桌面通知的点击事件;
  • chrome.notifications.onButtonClicked:处理桌面通知的按钮点击事件。

以下是Notifications API的基本用法:

  1. 创建通知:
javascriptCopy code
chrome.notifications.create("notificationId", {
  type: "basic",
  iconUrl: "icon.png",
  title: "Title",
  message: "Message"
}, function() {
  console.log("Notification created!");
  1. 更新通知:
javascriptCopy code
chrome.notifications.update("notificationId", {
  type: "list",
  iconUrl: "icon.png",
  title: "Title",
  message: "Message",
  items: [{ title: "Item 1", message: "Message 1" }, { title: "Item 2", message: "Message 2" }]
}, function() {
  console.log("Notification updated!");
  1. 关闭通知:
javascriptCopy code
chrome.notifications.clear("notificationId", function() {
  console.log("Notification cleared!");

需要注意的是,在创建通知时,我们需要传递一个唯一的notificationId参数,以便后续更新和关闭通知时使用。

下面是一个完整的示例代码,演示了如何在插件中使用Notifications API创建和更新通知:

manifest.json文件:

jsonCopy code
  "name": "My Chrome Extension",
  "version": "1.0",
  "manifest_version": 3,
  "description": "A simple Chrome Extension",
  "action": {
    "default_popup": "popup.html",
    "default_icon": {
      "16": "icon16.png",
      "32": "icon32.png",
      "48": "icon48.png",
      "128": "icon128.png"
  "permissions": ["notifications"]

popup.js文件:

javascriptCopy code
chrome.notifications.create("notificationId", {
  type: "basic",
  iconUrl: "icon.png",
  title: "Title",
  message: "Message"
}, function() {
  console.log("Notification created!");
document.querySelector("#updateBtn").addEventListener("click", function() {
  chrome.notifications.update("notificationId", {
    type: "list",
    iconUrl: "icon.png",
    title: "Title",
    message: "Message",
    items: [{ title: "Item 1", message: "Message 1" }, { title: "Item 2", message: "Message 2" }]
  }, function() {
    console.log("Notification updated!");
document.querySelector("#clearBtn").addEventListener("click", function() {
  chrome.notifications.clear("notificationId", function() {
    console.log("Notification cleared!");

popup.html文件:

htmlCopy code
<!DOCTYPE html>
    <meta charset="UTF-8">
    <title>My Chrome Extension</title>
  </head>
    <h1>Notifications API Demo</h1>
    <button id="updateBtn">Update Notification</button>
    <button id="clearBtn">Clear Notification</button>
    <script src="popup.js"></script>
  </body>
</html> 

4.2 使用第三方库和框架,如jQuery、Bootstrap和Vue.js

Chrome插件开发过程中,我们不仅可以使用Chrome扩展API,还可以使用各种第三方库和框架,来简化开发过程并提升用户体验。以下是一些常用的第三方库和框架:

  • jQuery:一个广泛使用的JavaScript库,提供了便捷的DOM操作、事件处理、动画效果等功能。
  • Bootstrap:一个流行的前端框架,提供了丰富的UI组件和样式,能够快速构建美观的响应式网页。
  • Vue.js:一个轻量级的前端框架,提供了数据绑定、组件化、路由等功能,能够构建高效的单页应用。

以下是一个示例代码,演示了如何使用jQuery和Bootstrap来构建一个简单的Chrome插件:

manifest.json文件:

jsonCopy code
  "name": "My Chrome Extension",
  "version": "1.0",
  "manifest_version": 3,
  "description": "A simple Chrome Extension",
  "action": {
    "default_popup": "popup.html",
    "default_icon": {
      "16": "icon16.png",
      "32": "icon32.png",
      "48": "icon48.png",
      "128": "icon128.png"
  "content_scripts": [
      "matches": ["https://www.google.com/*"],
      "js": ["content.js"],
      "css": ["style.css"]

popup.html文件:

htmlCopy code
<!DOCTYPE html>
    <meta charset="UTF-8">
    <title>My Chrome Extension</title>
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.3.1/css/bootstrap.min.css">
  </head>
    <div class="container">
      <h1>Hello, world!</h1>
      <button id="btn" class="btn btn-primary">Click me</button>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <script src="popup.js"></script>
  </body>
</html>

popup.js文件:

javascriptCopy code
$(function() {
  $('#btn').click(function() {
    $('h1').text('Hello, Chrome!');

style.css文件:

cssCopy code