Chrome插件开发入门

chrome 插件开发入门 阅读详情
AI摘要

本文详细介绍Chrome插件开发过程,涵盖基本配置、JavaScript交互、存储使用、消息通知等功能,并通过具体案例如金额计数器、翻译插件等展示实际应用场景。

视频作者:猿伙伴的个人空间_哔哩哔哩_bilibili

源码:https://pan.baidu.com/s/1EUOUo6QwHezyddmslyFsJQ   提取码:xtex 

目录

一、第一个插件helloWorld

二、JavaScript的基本用法

三、storage的用法

四、设置插件参数option_page

五、消息通知notifications

六、右键菜单contextMenus

七、徽章Badge

八、针对特定页面的插件pageAction

九、向页面注入代码content_scripts

十、重写浏览器页面chrome_url_overrides

十一、谷歌翻译案例

十二、 语音朗读案例

十三、content_scripts简介

十四、更便捷地注入代码executeScript

十五、设置背景图web_accessible_resources

十六、修改页面样式insertCSS

十七、 长连接消息connect

十八、百度翻译案例

十九、 插件调试Debug

二十、插件打包


一、第一个插件helloWorld

  • 1、首先新建文件夹helloWorld,用于放入插件代码,并将文件夹拖入vscode内;

  • 2、在vscode内该文件夹中,创建manifest.json文件,进行插件信息的配置;
{
    "manifest_version":2,//版本号,由google指定为2
    "name": "helloWorld",//插件名称
    "version":"1.0",//插件版本
    "description":"hello world 插件",//插件描述
    "icons":{//插件图标
        "128":"img/logo.png",
        "48":"img/logo.png",
        "16":"img/logo.png"
    },
    "browser_action":{
        "default_icon":"img/logo.png",//插件图标
        "default_popup":"popup.html"//点击图标后弹出的html互动文件
    }
    
}
  • 3、创建popup.html文件,进行点击图标后弹出窗口的配置;
<html>
    <head>
        <title>helloWorld</title>
        <meta charset="utf-8"/>
    </head>
    <body style="width: 200px;height: 200px;">
        <h1 id ="message">你好</h1>
    </body>
</html>
  • 4、将插件图标文件移入到插件根目录文件夹下;

  • 5、进入Chrome浏览器,输入chrome://extensions/进入扩展程序界面,找到位于右上角的开发者模式,打开;
  • 6、点击加载已解压的扩展程序,找到刚才的helloWorld文件夹,选择即可加载插件;

问题:此处疑似需要使用原生的png图片,我用了jpg图片转png图片后,插件图标一直显示不出来,不太清楚是什么原因,后来换成原生的png图片就可以显示了。

  • 7、点击右上角的扩展程序按钮,找到对应的helloWorld插件,点击固定按钮,将插件固定在Chrome主界面上;

  • 8、点击右上角的helloWorld插件按钮,插件开发完毕。


二、JavaScript的基本用法

  • 目的:为了给插件添加一个输入框,并实现随着输入框的输入不同,插件弹出的语句也不同的功能。
  • 1、在上一节的基础上,在根目录下创建js包;

  • 2、在js包中,首先引入jquery库简化JavaScript代码,jquery库可以从jquery包全版本下载网址下载,将下载好的jquery文件放入到js文件夹下;

  • 3、在js包中,创建popup.js文件,写入JavaScript代码,实现插件的逻辑功能;
$(function(){
    $('#input1').keyup(function(){
        $('#message').text('你好'+$('#input1').val())
    })
})
  •  4、进入popup.html文件,在<head>标签内更改html代码,导入jquery.js及popup.js;
<html>
    <head>
        <title>helloWorld</title>
        <meta charset="utf-8"/>
        <script src="js/jquery-3.3.1.min.js"></script>
        <script src="js/popup.js"></script>
    </head>
    <body style="width: 200px;height: 200px;">
        <h1 id ="message">你好</h1>
        <input id="input1" type="text"/>
    </body>
</html>
  • 5、在Chrome上传插件,即可完成插件开发。


三、storage的用法

  • 目的:为了在第3节中实现一个金额计数器的功能插件,需要使用到chrome的storage存储功能,该功能可以将插件中需要保存的数据写入到本地磁盘,从而帮助存储每次累加的金额,而不至于下一次打开插件,金额就归0需要重新计算。
  • 1、首先在第2节的基础上,在manifest.json中加入下列语句,赋予chrome.storage的权限;
{
    "manifest_version":2,
    "name": "helloEverything",
    "version":"1.0",
    "description":"hello everything 插件",
    "icons":{
        "128":"img/logo.png",
        "48":"img/logo.png",
        "16":"img/logo.png"
    },
    "browser_action":{
        "default_icon":"img/logo.png",
        "default_popup":"popup.html"     
    },
    "permissions":[
        "storage"
    ]
}
  •  2、在popup.html文件中,在<body>标签内,写入以下html语句,实现金额计数器的UI界面;
<html>
    <head>
        <title>helloWorld</title>
        <meta charset="utf-8"/>
        <script src="js/jquery-3.3.1.min.js"></script>
        <script src="js/popup.js"></script>
    </head>
    <body style="width: 400px;height: 400px;">
        <h2>总金额:<span id="total"></span></h2>
        <h2>本次使用:<input type="text" id="amount"></h2>
        <input type="submit" id="add" value="添加"/>
    </body>
</html>

  • 3、在js文件夹内的popup.js文件内,写入JavaScript的逻辑代码,实现金额计数器的逻辑功能;
$(function(){
    //在第一次运行时,如果总金额为0,也不会留空,而是有值显示
    chrome.storage.sync.get('total',function(budget){
        $('#total').text(budget.total);
    });
    $('#add').click(function(){
        //1、从浏览器获取存储的金额
        chrome.storage.sync.get('total',function(budget){
            var totalAmount = 0;
            if(budget.total){
                totalAmount = parseFloat(budget.total);
            }
            //2、将本次金额加到总金额中
            var amount = $('#amount').val();
            if(amount){
                totalAmount += parseFloat(amount);
                chrome.storage.sync.set({'total':totalAmount});
            }
            //3、更新显示ui
            $('#total').text(totalAmount);
            $('#amount').val('');
        })
    })
})
  • 4、在Chrome上传插件,即可完成插件开发,金额加入前后如下。

 →


四、设置插件参数option_page

  • 目的:为了给金额计数器插件,添加限制金额及总金额清除的功能,第4节引入了options_page功能配置插件参数.
  • 1、首先进入到manifest.json中,添加下列语句赋予插件options_page的权限;
{
    "manifest_version":2,
    "name": "optionsPage",
    "version":"1.0",
    "description":"optionsPage 插件",
    "icons":{
        "128":"img/logo.png",
        "48":"img/logo.png",
        "16":"img/logo.png"
    },
    "browser_action":{
        "default_icon":"img/logo.png",
        "default_popup":"popup.html"     
    },
    "permissions":[
        "storage"
    ],
    "options_page":"options.html"
}
  •  2、创建options.html,实现options页面的UI设计;
<html>
    <head>
        <title>budget manager options</title>
        <meta charset="utf-8"/>
        <script src="js/jquery-3.3.1.min.js"></script>
        <script src="js/options.js"></script>
    </head>
    <body>
        <h1>预算管理选项</h1>
        <h2>预算限制:<input type="text" id="limit"/></h2>
        <input type="submit" id="setLimit" value="保存限制"/>
        <input type="submit" id="resetTotal" value="清除总金额"/>
    </body>
</html> 

  • 3、进入js文件夹,创建options.js文件,实现了options.html中按钮的互动逻辑;
$(function(){
    chrome.storage.sync.get('limit',function(budget){
        $('#limit').val(budget.limit);
    })

    $('#setLimit').click(function(){
        var limit = $('#limit').val();
        if(limit){
            chrome.storage.sync.set({'limit':limit},function(){
                close();
            })
        }
    })

    $('#resetTotal').click(function(){
        chrome.storage.sync.set({'total':0});
    })
})
  • 4、更新popup.html,加入限制金额的UI;
<h2>限制金额:<span id="limit"></span></h2>
  • 5、更新popup.js,加入限制金额的初始化代码;
chrome.storage.sync.get(['total','limit'],function(budget){
    $('#total').text(budget.total);
    $('#limit').text(budget.limit);
});
  • 6、将插件上传到Chrome,完成插件开发。

五、消息通知notifications

  • 目的:为了让金额计数器在总金额超过限制金额及总金额清零的时候发送chrome通知,第5节引入notifications消息通知
  • 1、首先在manifest.json中添加下列语句,为金额计数器添加消息通知权限;
"permissions":[
    "storage",
    "notifications"
],
  •  2、修改popup.js及options.js,为其添加消息通知逻辑功能;
$(function(){
    //在第一次运行时,如果总金额为0,也不会留空,而是有值显示
    chrome.storage.sync.get(['total','limit'],function(budget){
        $('#total').text(budget.total);
        $('#limit').text(budget.limit);
    });
    $('#add').click(function(){
        //1、从浏览器获取存储的金额
        chrome.storage.sync.get('total',function(budget){
            var totalAmount = 0;
            if(budget.total){
                totalAmount = parseFloat(budget.total);
            }
            //2、将本次金额加到总金额中
            var amount = $('#amount').val();
            if(amount){
                totalAmount += parseFloat(amount);
                chrome.storage.sync.set({'total':totalAmount},function(){
                    if(totalAmount > parseFloat(budget.limit)){
                        var notifyOptions = {
                            type:'basic',
                            title:'提示!',
                            iconUrl:'img/logo.png',
                            message:'您消费的总金额已经超出限制!'
                        }
                        chrome.notifications.create('limitNotify',notifyOptions);
                    }
                });
            }
            //3、更新显示ui
            $('#total').text(totalAmount);
            $('#amount').val('');
        })
    })
})
$(function(){
    chrome.storage.sync.get('limit',function(budget){
        $('#limit').val(budget.limit);
    })

    $('#setLimit').click(function(){
        var limit = $('#limit').val();
        if(limit){
            chrome.storage.sync.set({'limit':limit},function(){
                close();
            })
        }
    })

    $('#resetTotal').click(function(){
        chrome.storage.sync.set({'total':0},function(){
            var notifyOptions = {
                type:'basic',
                title:'提示!',
                iconUrl:'img/logo.png',
                message:'您消费的总金额已经清0!'
            }
            chrome.notifications.create('limitNotify',notifyOptions);
        });
    })
})
  • 3、将插件上传至Chrome,插件开发完成,消息通知结果如下。


六、右键菜单contextMenus

  • 目的:为了可以将被鼠标直接右键点击的数字加入到金额计数器中计算总金额,第6节引入了contextMenus功能。
  • 1、首先进入manifest.json文件,在permission字条中添加contextMenus,并添加background字条关联event Page.js文件;
"background":{
    "scripts":["js/eventPage.js"],//关联的代码
    "persistent":false//是否在页面上一直运行
},
"permissions":[
    "storage",
    "notifications",
    "contextMenus"
],
    
  • 2、在js文件夹内,添加eventPage.js文件,创建右击后的contextMenus并为其添加事件监听;
//1、创建contextMenus
var contextMenu = {
    id:"addAmount",
    title:"添加消费",
    //contexts:page,video...
    contexts:["selection"]
}
chrome.contextMenus.create(contextMenu);
//2、为contextMenus添加事件监听
chrome.contextMenus.onClicked.addListener(function(clickData){
    //clickData.menuItemId:被点击的菜单选项卡的id
    //clickData.selectionText:选中的内容
    if(clickData.menuItemId == 'addAmount' && clickData.selectionText){
        var amount = parseFloat(clickData.selectionText);
        //1、从浏览器获取存储的金额
        chrome.storage.sync.get('total',function(budget){
            var totalAmount = 0;
            if(budget.total){
                totalAmount = parseFloat(budget.total);
            }
            //2、将本次金额加到总金额中
            if(amount){
                totalAmount += amount;
                chrome.storage.sync.set({'total':totalAmount},function(){
                    if(totalAmount > parseFloat(budget.limit)){
                        var notifyOptions = {
                            type:'basic',
                            title:'提示!',
                            iconUrl:'img/logo.png',
                            message:'您消费的总金额已经超出限制!'
                        }
                        chrome.notifications.create('limitNotify',notifyOptions);
                    }
                });
            }
        })
    }
})
  • 3、将插件上传至Chrome,则插件开发完成,对功能的演示如下。

→→


七、徽章Badge

  • 目的:为了实现将总金额直接显示在图标上,而不用每次都点开弹窗才能看得到总金额,第7节引入徽章badge功能。
  • 1、直接进入eventPage界面,添加如下代码实现功能;
//设置Badge徽章
chrome.storage.onChanged.addListener(function(changes,storageName){
    //changes.total.newValue:总金额变化后的值
    chrome.browserAction.setBadgeText({"text":changes.total.newValue.toString()});
    chrome.browserAction.setBadgeBackgroundColor({"color":[0,255,0,255]});
});
  • 2、将插件上传,完成插件开发,功能效果如下。


八、针对特定页面的插件pageAction

  • 目的:之前实现的browserAction插件,在任何界面上都可以使用,而为了实现仅针对特定页面的插件,第8节引入了pageAction功能。
  • 1、首先创建新的manifest文件,需要注意的是,这里的新增了page_action词条,并且permission词条中加入了tabs权限;
{
    "manifest_version":2,
    "name": "pageAction",
    "version":"1.0",
    "description":"pageAction 插件",
    "icons":{
        "128":"img/f.png",
        "48":"img/f.png",
        "16":"img/f.png"
    },
    "page_action":{
        "default_icon":"img/f.png",
        "default_title":"pageAction 插件",
        "default_popup":"popup.html"     
    },
    "background":{
        "scripts":["js/pageAction.js"],
        "persistent":false
    },
    "permissions":[
        "tabs"
    ]
}
  •  2、 创建popup.html,完成插件UI的编写;
<html>
    <head>
        <title>page action</title>
        <meta charset="utf-8"/>
    </head>
    <body>
        <h1>page action 插件</h1>
    </body>
</html>
  • 3、创建pageAction.js文件,完成针对特定网页启动插件的功能逻辑代码;
//chrome.tabs.query:查询当前的窗口是否为淘宝,如果是,则将当前的窗口存入到tabs中
//chrome.pageAction.show:将插件在之前传入到tabs的窗口中进行展示
chrome.tabs.query({currentWindow:true,url:"https://www.taobao.com/"},function(tabs){
    chrome.pageAction.show(tabs[0].id);
})
  • 4、将插件上传到Chrome,完成插件的开发,对于特定页面的识别功能如下。


九、向页面注入代码content_scripts

  • 目的:在第8节中,我们先通过匹配页面的url,再确定当前插件是否可在页面上可用,然而我们在实际操作中一般不这么做,在实际操作中,我们一般向特定的页面进行注入代码,然后动态地进行识别。
  • 1、首先在manifest.json中,加入"content_scripts"词条,匹配特定的页面,并向页面注入代码;同时在permission词条中,加入所需匹配的页面;
"permissions":[
    "tabs",
    "https://*.baidu.com/"
],
"content_scripts":[
    {
        "matches":["https://*.baidu.com/"],
        "js":["js/jquery-3.3.1.min.js","js/content.js"]
    }
]
  • 2、创建content.js作为向页面内注入代码的JavaScript文件,此时被注入的页面会发送消息;
//消息发送出去
chrome.runtime.sendMessage({todo:"showPageAction"});
  • 3、创建pageAction.js文件,用于接受由特定页面发送的消息,并判断当前打开的动态页面是否可以匹配上发送消息的页面,如果匹配成功,则让插件可以在该页面上使用;
//由content.js实现发送消息的逻辑后,通过pageAction实现接受消息的逻辑
chrome.runtime.onMessage.addListener(function(request,sender,response){
    //通过匹配接受到消息的todo是否为showPageAction,从而确定当前接受的消息是否是目标消息,
    //如果是,则使插件可以在当前页面使用
    if(request.todo=="showPageAction"){
        chrome.tabs.query({active:true,currentWindow:true},function(tabs){
            chrome.pageAction.show(tabs[0].id);
        });
    }
});
  • 4、将插件上传到Chrome,则插件开发完成,功能演示,如下,本章使用*.baidu.com作为特定页面,则插件仅可以在百度页面使用。


十、重写浏览器页面chrome_url_overrides

  • 目的:目前可以重写的页面包括:新标签页、历史记录页面和书签页面,通过引入chrome_url_overrides可以将这三个页面重写为我们想要的样子。
  • 1、创建manifest.json,添加chrome_url_overrides标签,指定需要重写的页面(新标签页:newtab,历史记录页面:history,书签页:bookmarks),需要注意的是,每个插件仅可以重写一个页面;
{
    "manifest_version":2,
    "name": "pageAction",
    "version":"1.0",
    "description":"pageAction 插件",
    "icons":{
        "128":"img/f.png",
        "48":"img/f.png",
        "16":"img/f.png"
    },
    "chrome_url_overrides":{
        "newtab":"new.html"
    }
}
  •  2、创建new.html,编写新页面的代码;
<html>
    <head>
        <title>CShadow7的博客</title>
        <meta charset="utf-8"/>
    </head>
    <body>
        <h1>CShadow7的博客</h1>
        <h2><a href="https://blog.youkuaiyun.com/CShadow7?spm=1000.2115.3001.5343/">
            https://blog.youkuaiyun.com/CShadow7?spm=1000.2115.3001.5343/</a></h2>
        <h2>视频讲解,源码分析,文字笔记,真正能学会的教程!!</h2>
    </body>
</html>
  •  3、上传插件到chrome,完成开发,页面如下。


十一、谷歌翻译案例

  • 目的:为了实现在任何页面上,随机选定一个单词,都可以右键使用google翻译的功能。
  • 1、创建manifest.json;
{
    "manifest_version":2,
    "name": "translation",
    "version":"1.0",
    "description":"谷歌翻译插件",
    "icons":{
        "128":"img/f.png",
        "48":"img/f.png",
        "16":"img/f.png"
    },
    "background":{
        "scripts":["js/translate.js"],
        "persistent":false
    },
    "permissions":[
        "contextMenus"
    ]
}
  • 2、创建translate.js文件;
var menuItem = {
    "id":"translate",
    "title":"使用谷歌翻译",
    "contexts":["selection"]
}
chrome.contextMenus.create(menuItem);

chrome.contextMenus.onClicked.addListener(function(clickData){
    //clickData.menuItemId:被点击的菜单选项卡的id
    //clickData.selectionText:选中的内容
    if(clickData.menuItemId == 'translate' && clickData.selectionText){
        //配置createData的参数
        var createData = {
            url:"https://translate.google.cn/?sl=zh-CN&tl=en&text="+clickData.selectionText+"&op=translate",
            type:"popup",
            top:5,
            left:5,
            width:screen.availWidth/2,
            height:screen.availHeight/2
        }
        chrome.windows.create(createData);
    }
})
  • 3、上传插件到Chrome,完成插件开发,功能如下。


十二、 语音朗读案例

  • 目的:为了实现在任何页面上,随机选定一个单词,都可以右键使用语音朗读的功能;
  • 1、创建manifest.json,在permission标签中加入tts权限,启用google自带的语音朗读功能;
{
    "manifest_version":2,
    "name": "tts",
    "version":"1.0",
    "description":"语音朗读插件",
    "icons":{
        "128":"img/f.png",
        "48":"img/f.png",
        "16":"img/f.png"
    },
    "background":{
        "scripts":["js/speak.js"],
        "persistent":false
    },
    "permissions":[
        "contextMenus",
        "tts"
    ]
}
  •  2、创建speak.js文件;
var menuItem = {
    "id":"tts",
    "title":"使用语音朗读",
    "contexts":["selection"]
}
chrome.contextMenus.create(menuItem);

chrome.contextMenus.onClicked.addListener(function(clickData){
    //clickData.menuItemId:被点击的菜单选项卡的id
    //clickData.selectionText:选中的内容
    if(clickData.menuItemId == 'tts' && clickData.selectionText){
        chrome.tts.speak(clickData.selectionText,{"rate":0.7});
    }
})
  •  3、上传插件到Chrome,完成插件开发,功能如下。


十三、content_scripts简介

  • content_scripts是在web页面运行的JavaScript脚本,通过使用标准的DOM,它可以获取浏览器访问页面的详细信息,并可以修改这些信息。
  • 可以做的事:
  • 1、获取DOM元素
  • 2、修改DOM元素
  • 3、修改样式
  • 不可以做的事:
  • 1、不能使用除了chrome.extension之外的chrome.*接口
  • 2、不能访问它所在扩展中定义的函数和变量
  • 3、不能访问web页面和其他content_scripts中定义的函数和变量
  • 4、不能做cross_site XMLHttpRsquest
  • 解决方案:
  • 1、content_scripts可以使用message机制与它所在的扩展通信,来间接使用chrome.*接口,或访问扩展数据
  • 2、content_scripts可以通过共享的DOM来与web页面通信。

十四、更便捷地注入代码executeScript

  • 目的:之前学习了在manifest.json文件中用content_scripts注入javascript或css文件到页面,这个方法有几个弊端:
  • 1、文件直接写在了manifest中,灵活性较差;
  • 2、即使只执行一行代码,也需要注入一个文件;
  • 3、执行的时机不好掌握。
  • 需求:当觉得网页字体较小的时候,右击页面,弹出菜单中点击增大字体,可以增大网页的字体字号。
  • 1、首先创建manifest.json,在permission标签中,添加了tabs及<all_urls>;
{
    "manifest_version":2,
    "name": "increase",
    "version":"1.0",
    "description":"增大字体插件",
    "icons":{
        "128":"img/f.png",
        "48":"img/f.png",
        "16":"img/f.png"
    },
    "background":{
        "scripts":["js/increase.js"],
        "persistent":false
    },
    "permissions":[
        "contextMenus",
        "tabs",
        "<all_urls>"
    ]
}
  •  2、创建increase.js文件;
var menuItem = {
    "id":"increase",
    "title":"增大字体",
    "contexts":["all"]
}
chrome.contextMenus.create(menuItem);

chrome.contextMenus.onClicked.addListener(function(clickData){
    chrome.tabs.executeScript(null,{code:"var old = window.getComputedStyle(document.body).fontSize;\
    var index = old.indexOf('p');\
    var size = parseInt(old.substring(0,index));\
    var newSize = size + 10+'px';\
    document.body.style.fontSize = newSize;"});
})
  •  3、将插件上传到Chrome,插件开发完成,放大字体功能前后对比如下。


十五、设置背景图web_accessible_resources

  • 目的:将页面的背景图设置成为其他图片
  • 1、创建manifest.json文件,添加了web_accessible_resources标签;
{
    "manifest_version":2,
    "name": "resources",
    "version":"1.0",
    "description":"设置背景图",
    "icons":{
        "128":"img/f.png",
        "48":"img/f.png",
        "16":"img/f.png"
    },
    "background":{
        "scripts":["js/increase.js"],
        "persistent":false
    },
    "permissions":[
        "contextMenus",
        "tabs",
        "<all_urls>"
    ],
    "web_accessible_resources":[
        "img/*"
    ]
}
  •  2、创建resources.js文件;
var menuItem = {
    "id":"resources",
    "title":"设置背景图",
    "contexts":["all"]
}
chrome.contextMenus.create(menuItem);

chrome.contextMenus.onClicked.addListener(function(clickData){
    var imgurl = chrome.extension.getURL("img/背景.png");
    chrome.tabs.executeScript(null,{code:"document.body.style.backgroundImage = 'url(\""+imgurl+"\")';\
    document.body.style.backgroundRepeat = 'repeat';"});
})
  • 3、上传插件到Chrome,插件开发完成,功能演示如下。


十六、修改页面样式insertCSS

  • 目的:将搜索结果块的背景设置成绿色
  • 1、创建manifest.json文件;
{
    "manifest_version":2,
    "name": "backcolor",
    "version":"1.0",
    "description":"设置背景块颜色",
    "icons":{
        "128":"img/f.png",
        "48":"img/f.png",
        "16":"img/f.png"
    },
    "background":{
        "scripts":["js/backcolor.js"],
        "persistent":false
    },
    "permissions":[
        "contextMenus",
        "tabs",
        "<all_urls>"
    ],
    "web_accessible_resources":[
        "img/*"
    ]
}
  • 2、创建backcolor.js文件;
var menuItem = {
    "id":"backcolor",
    "title":"设置背景颜色",
    "contexts":["all"]
}
chrome.contextMenus.create(menuItem);

chrome.contextMenus.onClicked.addListener(function(clickData){
    var imgurl = chrome.extension.getURL("img/背景.png");
    chrome.tabs.insertCSS(null,{file:"backcolor.css"});
})
  •  3、进入chrome开发者模式,观看网络源码,确定需要修改css代码的部分;

  • 4、根据第3步确定需要更改css代码的部分,创建backcolor.css文件;
.c-container{
    background-color: green;
}
  •  5、上传插件到Chrome,完成插件开发。背景搜索块颜色更改功能如下。


十七、 长连接消息connect

  • 长连接消息,我们使用connect,消息发送后,会等待消息的回复,使对话一直持续下去。
  • 目的:在content.js文件和background.js文件之间进行一次长消息对话。
  • 1、在第9节content_script的基础上,创建content.js;
//创建一个长连接port,用于首先发送消息
var port = chrome.extension.connect({name:"knock"});
port.postMessage({question:"你好,有人吗"});
//console.log可以在控制台看到消息
console.log("content_send:你好,有人吗");
port.onMessage.addListener(function(msg){
    if(msg.answer == "你好,我是CShadow7"){
        console.log("content_get"+msg.answer);
        port.postMessage({question:"哪个CShadow7"});
        console.log("content_send:哪个CShadow7");
    }else if(msg.answer == "写代码的CShadow7"){
        console.log("content_get"+msg.answer);
        port.postMessage({question:"有你的快递"});
        console.log("content_send:有你的快递");
    }
});
  • 2、创建background.js文件;
chrome.extension.onConnect.addListener(function(port){
    port.onMessage.addListener(function(msg){
        if(msg.question == "你好,有人吗"){
            port.postMessage({answer:"你好,我是CShadow7"});
        }else if(msg.question == "哪个CShadow7"){
            port.postMessage({answer:"写代码的CShadow7"})
        }
    })
})
  • 3、将插件上传到Chrome,完成插件开发,控制台界面如下。


十八、百度翻译案例

  • 目的:将网页中的中文通过谷歌翻译翻译成英文,但是在第11节中,我们使用的是打开新的浏览器窗口的方式,目前我们需要通过插件拿到翻译结果,这种需求在实际操作中更常见。
  • 需求:通过选中需要翻译的中文,右键选择百度翻译,并且直接通过alert弹出窗口显示翻译内容。
  • 基本思路:在background中创建右键菜单并监听,当菜单选项被点击后,获取选中的网页文字并调用百度翻译API进行翻译,翻译完成后将翻译结果通过消息传递机制传递给前台content_scripts,并由content_scripts调用alert弹窗显示。
  • 1、首先需要申请百度翻译的API权限,最终可以得到一个文件夹,内含一个index.html文件及md5.js文件;

  • 2、创建manifest.json文件;
{
    "manifest_version":2,
    "name": "bdtraslate",
    "version":"1.0",
    "description":"百度翻译插件",
    "icons":{
        "128":"img/f.png",
        "48":"img/f.png",
        "16":"img/f.png"
    },
    "background":{
        "scripts":["js/md5.js","js/jquery-3.3.1.min.js","js/translate.js"],
        "persistent":true
    },
    "permissions":[
        "contextMenus",
        "tabs",用于输出
        "http://api.fanyi.baidu.com/",将api的网址加入权限
    ],
    "content_scripts":[
        {
            "matches":["<all_urls>"],用于给所有网页进行代码注入
            "js":["js/content.js"]
        }
    ]
}
  •  3、创建translate.js文件,完成右键菜单设计、选中中文的翻译及信息发送功能;
var menuItem = {
    "id": "bdtranslate",
    "title": "百度翻译",
    "contexts": ["selection"]
}
chrome.contextMenus.create(menuItem);

chrome.contextMenus.onClicked.addListener(function (clickData) {
    if (clickData.menuItemId == 'bdtranslate' && clickData.selectionText) {
        //以下内容,从百度翻译API的index.html中复制粘贴
        //需要将其中的appid,key,query修改为自己的id,key和查询内容
        var appid = '20220327001144201';//自己的APPID,官网可查
        var key = 'E_NCDdjbBUP8gqzFPdYJ';//自己的KEY,官网可查
        var salt = (new Date).getTime();
        var query = clickData.selectionText;//右键选中的内容
        // 多个query可以用\n连接  如 query='apple\norange\nbanana\npear'
        var from = 'zh';//中文
        var to = 'en';//英文
        var str1 = appid + query + salt + key;
        var sign = MD5(str1);
        //由于插件内的js内容不允许使用ajax,以下内容为从index.html中的ajax部分复制并修改得到
        var url = 'http://api.fanyi.baidu.com/api/trans/vip/translate';
        url += "?q="+query;
        url += "&appid="+appid;
        url += "&salt="+salt;
        url += "&from="+from;
        url += "&to="+to;
        url += "&sign="+sign;
        //使用fetch获取的json结果需要先转换为string再转换为json
        fetch(url)
        .then(reponse => reponse.text())
        .then(text =>JSON.parse(text))
        .then(translateRsult => {
            chrome.tabs.query({ active: true, currentWindow: true }, function (tabs) {
                //result通过查询浏览器的开发者模式得知
                chrome.tabs.sendMessage(tabs[0].id, { todo: "translate", result: translateRsult.trans_result[0].dst })
            })
        })  
    }
})

其中,index.html需要复制的内容如下:

var appid = '20220327001144201';
var key = 'E_NCDdjbBUP8gqzFPdYJ';
var salt = (new Date).getTime();
var query = 'apple';
// 多个query可以用\n连接  如 query='apple\norange\nbanana\npear'
var from = 'en';
var to = 'zh';
var str1 = appid + query + salt +key;
var sign = MD5(str1);
$.ajax({
    url: 'http://api.fanyi.baidu.com/api/trans/vip/translate',
    type: 'get',
    dataType: 'jsonp',
    data: {
        q: query,
        appid: appid,
        salt: salt,
        from: from,
        to: to,
        sign: sign
    },
    success: function (data) {
        console.log(data);
    } 
});

chrome.tabs.sendMessage中的输出result可以根据index.html在浏览器开发者模式中的输出得知,如下所示;

  •  4、创建content.js,用于监听translate发送的信息并使用alert将翻译结果弹出;
chrome.runtime.onMessage.addListener(function(request,sender,response){
    if(request.todo=="translate"){
        alert(request.result);
    }
})
  • 5、将index.html及md5.js加入插件文件夹;

  • 6、将插件上传到Chrome,完成插件开发,翻译功能如下。


十九、 插件调试Debug

  • 1、popup:右键插件图标→审查弹出内容即可进入开发者页面
  • 2、options:右键插件图标→选项→F12进入开发者页面
  • 3、background:chrome://extension界面,选择查看视图:背景页进入开发者页面
  • 4、content_scripts:F12进入开发者页面→Sourses→Content scripts→选择对应的插件

二十、插件打包

  • 进入chrome://extension界面→打包扩展程序→选择需要上传插件的根目录→得到插件的crx文件用于上传插件到谷歌,以及插件的密钥pem文件。
  • 后续学习的网站:
  • 1、Chrome官方开发文档
  • 2、360安全浏览器应用开放平台
  • 3、kkh86.com/it/chrome-extension-doc/extensions/tabs.html
Chrome插件开发教程 浏览器插件是一种可增强网页功能的嵌入程序。有了插件,用户的使用不再局限于网页,还可以享用插件带来的增强功能。用户只需到官方插件商店搜索、下载、安装即可使用,非常便捷。插件商店由不同的浏览器厂商维护,比如你要在Chrome上使用插件,要到ChromeWebstore下载安装。Firefox上亦然。创建manifest{"name"3}复制代码该文件描述了插件的基本属性信息、代码的运行路径等。后面我会不断地丰富其内容。加载插件这里我们直接载入整个目录(尚未打包)1.地址栏输入chrome。... 阅读详情

相关推荐

谷歌浏览器插件开发

Chrome插件本质上是一个遵循Google规范的特殊网页,通常由HTML、CSS、JavaScript以及图片等资源组成,并被打包成.crx后缀的压缩包。它可以访问浏览器提供的特殊API,实现诸如改变浏览器外观、增加新功能、与网页内容进行交互等操作,例如广告拦截、语法检查、密码管理等功能丰富的插件。允许插件与浏览器标签页进行交互,如获取当前标签页、创建新标签页、关闭标签页等。例如,使用方法可以获取当前窗口中所有标签页的信息。首先在的权限中添加tabs配置添加tabs的相关操作

weixin_43948538的博客 2591

从零入门Chrome插件开发

谷歌浏览器在推出时就以其快速、安全和简洁的特点受到了广大用户的欢迎。随着浏览器的不断发展,谷歌为用户提供了插件开发平台,使开发者能够为浏览器添加各种功能和定制化选项。从此,插件成为了提升用户体验和个性化的重要工具。谷歌浏览器插件是一种小型程序,可以增强浏览器的功能。谷歌浏览器插件使用HTML、CSS和JavaScript等网页开发技术,开发者可以使用这些技术来创建自己的谷歌浏览器插件。

萌萌哒的瑞萌萌的博客 9035

前端提升之——chrome浏览器插件开发指南——chrome插件介绍及入门

有一天突发奇想,想要自己写一个浏览器插件玩一玩,并不做用于商业或者其他方面,仅仅用于自我技术的练习和提升。这里的浏览器我选择Chrome,当然chrome插件同样适用于微软自带的 Microsoft Edge在当今发达的互联网环境下,也找到了诸多的资料教程。个人也有个习惯,学习一个新的东西,虽然说前人已经有诸多的文章,但是我还是会将自己对于这个技术的一些个人感悟加上前人们写的很好的东西重新整理一次。我所有的参考文章均在本文的最后。

m0_74825634的博客 1819

全网最详细的谷歌插件开发小册

概述全网最详细的谷歌插件开发小册????????,之前写谷歌插件的时候绕了一圈网上的教程,没有发现比较好的文档教程,索性根据官方文档梳理一遍,避免后面学习的同学继续踩坑!!!目录概述在Chrome Web Stor‍e发布和更新插件插件的版本管理与错误处理插件的安全性和隐私保护Chrome插件的调试技巧使用automated testing进行插件测试使用DevTools进行性能分析插件中的消息传递使用tab...

qq_34998786的博客 9060

Chrome扩展插件开发入门与实践

Chrome扩展插件是一种专为Google Chrome浏览器设计的应用程序,允许用户为浏览器添加新功能或改变浏览器的行为。它们由HTML、CSS和JavaScript编写,使得用户可以根据个人需求定制浏览器,例如拦截广告、管理书签、提供快捷访问等。内容脚本是Chrome扩展中一种特殊的脚本,运行在网页的上下文中,允许开发者直接与网页DOM交互,并且可以读取和修改网页内容。内容脚本的主要作用是提供一个独立于背景脚本和弹窗页面的运行环境,让扩展能够在不与背景脚本直接交互的情况下对网页进行操作。

weixin_35811662的博客 1057

从命令到对话:LLM如何重塑车载语音交互与软件定义汽车体验

自动语音识别和自然语言处理是智能交互的核心基础技术,它们使机器能够理解和响应人类语音指令。其原理在于通过声学模型和语言模型将声音信号转化为文本,再解析文本背后的用户意图。这项技术的价值在于提供了一种自然、高效且能解放双手的人机交互方式,极大地提升了在特定场景(如驾驶)下的安全性与便利性。随着技术演进,其应用场景已从简单的命令控制扩展到复杂的多轮对话和跨域任务执行。当前,软件定义汽车的架构变革为车载语音提供了统一的控制平台,而大型语言模型的引入则带来了范式革命,使其从功能触发器进化为真正的智能任务执行者。本文

weixin_42669344的博客 563

【实用工具】谷歌浏览器插件开发指南

本指南主要是对Chrome插件的官方开发文档做了翻译、理解和实践,只适合小白学习。如果你已经掌握了Chrome插件的开发,那么该指南便没有阅读的意义;再如果你在插件开发过程中遇到了疑难杂症,那么该指南也无法为你提供解答方案和思路。

wenchun001的博客 8854

2.ROS实用工具:坐标变换

本文围绕ROS坐标变换展开,介绍其在机器人系统中的关键作用,即统一不同传感器和执行器坐标系,服务数据融合等操作。基于ROS的tf库,从广播和监听TF变换两方面阐述实现过程,涵盖新建工作包、编写广播和监听代码、配置构建文件及编译等步骤。此外,介绍启动节点管理器后运行广播和监听节点的方法,并通过rqt_graph、rqt_tf_tree、tf_echo等工具可视化和获取坐标系变换信息。借助这些内容,读者不仅能掌握ROS坐标变换的实现,还能对机器人坐标变换系统的调试和理解有更深入认识 。

qq_74168740的博客 1171

Chrome插件开发入门教程

Chrome插件的本质就是一个由 manifest.json 文件和插件所需要的图片,css,html,js资源组成的一个web页面,只是和传统的web页面不同的,它是以chrome浏览器为宿主运行的一个web程序。

崔成龙 . 勇往直前 3万+

DirectX修复工具使用技巧之二——手动修复C++创建失败的文件

最后更新:2021-2-25 随着V4.0正式版的发布,近来有部分用户来咨询如何解决C++文件创建失败的问题。在此我将以解决最常见的C++2015-2019文件创建失败为例,向大家演示一下在线修复的方法,其他C++或文件的方法大同小异。此次操作以Windows 7为例,其他系统相应参考即可。 首先,如果希望程序能手动在线修复创建失败的失败,请首先确定您使用的V4.0.2版或更高版本,老版本不支持此功能。查看程序版本的方式可以把鼠标放在DirectX Repair.e...

VBcom的专栏 6万+

Windows Server 2016上,手把手教你搭建MDT 8456自动化部署环境(含ADK 2004与WDS配置)

本文详细指导在Windows Server 2016上搭建MDT 8456自动化部署环境,涵盖ADK 2004与WDS配置全流程。通过标准化操作系统部署、应用程序静默安装和驱动程序注入,实现企业级自动化部署解决方案,显著提升IT运维效率。特别针对兼容性问题和权限陷阱提供实战解决方案。

weixin_29876033的博客 385

基础入门Chrome插件开发(附上代码)

本文介绍了如何从零开始创建一个简单的Chrome浏览器插件"网页调色器"。首先讲解了网页的基本结构(HTML、CSS、JS三层)和插件的基本组成(manifest.json、popup.html、popup.js和图标)。然后通过实战演示了创建这个插件的完整过程:1)创建项目文件夹;2)编写manifest.json配置文件;3)设计popup.html界面;4)实现popup.js交互逻辑;5)准备插件图标;6)打包安装。该插件功能是点击不同按钮可改变网页背景颜色或恢复默认设置,适合初

boringboo的博客 1095

【宠物识别系统】设计框架

能跑通的 Demo。收集 10,000 张同品种但不同个体的图片。训练ArcFace模型,验证准确率能否达到 99% 以上。搭建Milvus向量数据库。开发移动端 App/小程序。加入“图像质量检测”和“用户反馈纠错”功能。你是更偏向于做软件服务(如寻宠App、保险API),还是做软硬结合的产品(如智能喂食器)?这决定了我们下一步是深挖云端高并发架构,还是边缘端模型压缩。更偏向于软件,应用更广泛些,继续既然专注于纯软件/SaaS (Software as a Service) 方向。

百态·数智思维 | 聚焦大数据、量化与未来AI 1413

10分钟带你入门chrome(谷歌)浏览器插件开发

扩展程序主要名词Manifest(清单文件)BackgroundScript(后台脚本)UIElements(页面元素)ContentScript(内容脚本)OptionsPage(配置页面)

5747

保姆级教程:用ComfyUI+LTX-Video插件,5分钟搞定你的第一个AI视频(RTX 4060实测)

本文提供了一份详细的ComfyUI与LTX-Video插件使用指南,帮助用户在RTX 4060显卡上快速生成AI视频。从环境部署到图形化操作,再到提示词优化和性能调优,全面覆盖AI视频生成的各个环节,让零基础用户也能轻松上手。

weixin_33743661的博客 136

Fiori Elements 表格之 Tree Tables:从数据建模到交互行为的全链路剖析

SAP Fiori elements的Tree Table组件将分层数据以表格形式展示,支持展开/折叠操作,适用于组织结构、物料清单等多级数据场景。该组件在List Report和Object Page中均可使用,支持懒加载、多选、列冻结等标准表格功能,并与OData V4服务层级注解深度集成。后端需通过RAP或CAP建模提供层级数据,前端通过清单配置切换表类型。需注意在草稿模式下仅显示活动实体,且展开状态在编辑时不保留。性能方面建议采用懒加载策略,避免全量加载树节点。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 159

Chrome 插件开发入门

Chrome 插件开发是一个非常有趣且实用的过程,通过学习如何开发插件,你不仅能提升自己的编程技能,还能为自己或他人提供更好的浏览器使用体验。希望本文能为你提供一些帮助,让你能够顺利入门 Chrome 插件开发,开启你的浏览器开发之旅!??开发者的世界是充满无限可能的,快来动手试试吧!??

kumufengchun_的博客 1849

不同IP网段的PLC进行S7通信(PUT_GET)的具体步骤

不同IP网段的PLC进行S7通信(PUT_GET)的具体步骤 一般情况下,我们使用西门子的S7通信时都是将网络中的PLC的IP设置在同一网段,那么如果涉及到旧项目改造时,不方便修改IP地址,只能进行2个网段通信时,可以参考以下步骤: 准备条件: 2个路由器 CPU 1212C 主动连接 CPU 314C-2PN/DP 被动连接 网络搭建如下图所示: S7-1212C一侧 建立S7主动连接 ,IP地址:192.168.5.40,编写get/put 通信程序 S7-300 IP地址:192.168.0

Robot_PLC_HMI_Automation 2万+

Chrome插件开发:从入门到精通

一、

weixin_39464636的博客 1546

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Chrome插件开发入门指南

chrome.storage - 本地数据存储 chrome.tabs - 标签页管理 chrome.runtime - 插件运行时通信 chrome.notifications - 系统通知 chrome.contextMenus - 右键菜单。

risingsunm的博客 393

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

下一篇: HTML学习入门
CShadow7
博客等级 码龄7年 21粉丝 4原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值