介绍

相信前端的小伙伴对谷歌浏览器插件开发并不陌生,或许你会想到,当习得这个技能后最后又能做些什么呢?当然又很多,本期就带大家去实现一个插件,其具体作用就是,你可以在在网页上选择一段文本然后就会自动复制下来,同时,还可以自动完成语音朗读,这样你就可以不用看就可以了解到内容,而且也不用每次按Ctrl C去复制啦~

正文

基础配置

众所周知,开发谷歌浏览器插件前先要去配置一下 manifest.json 文件,它是用于指定扩展插件应用名称、描述、图标、应用文件入口、权限等信息的。

{
    "name": "文本拷贝&语音朗读插件",
    "description":"在页面选中所需要复制、语音的文本,将会完成自动复制,且会帮你语音说出所选的内容",
    "version": "0.1",
    "manifest_version": 3,
    "background": {
        "service_worker": "background.js"
    },
    "action": {
        "default_icon": {
            "16": "/assets/favicon-16x16.png",
            "48": "/assets/favicon-48x48.png"
        }
    },
    "icons": {
        "16": "/assets/favicon-16x16.png",
        "48": "/assets/favicon-48x48.png"
    },
    "permissions": [
        "tts",
        "clipboardRead",
        "clipboardWrite"
    ],
    "content_scripts":[{
        "js":["page.js"],
        "matches":["http://*/*","https://*/*"]
    }]
}

这里我们简单说明一下以上配置都做了什么吧:首先我们起好扩展应用的名字和描述。然后定义了版本好,因为目前为纯自娱自乐式的demo,所以给一个v0.1版本吧。

mainfest版本设置为3,所以后面的 action 插件页面展示和 icons 插件图标要分开写在下面,如果mainfest设置为2的话,则需要写 browser_action 来代替 action ,同时,要把 icons 并入其中。mainfest版本2与3细碎的差异其实还是比较多的,具体可以查看官方的文档来再来尝试。

另外,指定background的脚本,因为它是 Chrome 插件比较重要的一个部分,也是Chrome 插件生命周期最长的一个组件。background 的生命周期在 Chrome 启动后,启用的插件会被启动,background.js 就会被执行。我们后面写的功能调用都会经过它之手来发出。

content_scripts 顾名思义其目的就是要写入页面将要执行那个脚本文件。在这里我们就给它写一个 page.js 后面我们的业务层面都将从头入手。

当然,最关键的是我们要在 permissions 开启拷贝和语音朗读的权限,然后我们才可以顺畅的使用Chrome 提供的API来完成这些功能。其中 tts 表示语音朗读的权限,而后面那俩则是拷贝的读写权限。

好了准备工作都完成了,接下来就开始搞事情~

获取内容

刚才说道我们的目的是选中网页中的文本内容来完成再做拷贝和朗读任务的,那有什么办法能快速获取到这些内容呢?当然有办法,就是用 window.getSelection 方法来返回一个 Selection 对象,再对这个 Selection 里就是你所选中的文本信息了,可以直接使用 toString 方法来读到。

// page.js
document.addEventListener("mouseup", e => {
    // 获取内容
    const txt = window.getSelection().toString()
    if(txt == "") return;
    // 拷贝文本
    document.execCommand('copy')
})

语音朗读

语音朗读我们就要借助 background.js 来完成,所以,我们在 chrome.runtime 先发出一个消息出去。

// page.js
document.addEventListener("mouseup", e => {
    // ...
    // 发送语音朗读消息
    chrome.runtime.sendMessage({
        type: "word",
        value: txt,
    }, res => {
        console.log(res)
    })
})

然后在 background.js 中接收到这个消息,在回调函数里就可以用 tts.speak 方法读出我们所选中的内容了,非常的简单。

// background.js
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
    chrome.tts.speak(request.value)
    sendResponse({
        ...request,
        msg: "success",
    })
    console.log(chrome.tts)
})

结语

最后你可把刚才的文件夹导入到扩展程序里,一个属于你自己的小工具就完成了,当然本篇也是用一个小案例来抛砖引玉,希望你可以联想到更多的业务需求来做一款真正好用的浏览器插件,还有更多未知好玩的API等你去发现和使用。

以上就是JS实现谷歌浏览器插件拷贝语音功能详解的详细内容,更多关于JS谷歌浏览器插件拷贝语音的资料请关注Devmax其它相关文章!

JS实现谷歌浏览器插件拷贝语音功能详解的更多相关文章

  1. html5 拖拽及用 js 实现拖拽功能的示例代码

    这篇文章主要介绍了html5 拖拽及用 js 实现拖拽,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. amaze ui 的使用详细教程

    这篇文章主要介绍了amaze ui 的使用详细教程,本文通过多种方法给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. swift皮筋弹动发射飞机ios源码

    这是一个款采用swift实现的皮筋弹动发射飞机游戏源码,游戏源码比较详细,大家可以研究学习一下吧。

  4. swift 值类型和引用类型

    1.Struct是值类型,拷贝是值拷贝,Class是引用类型,拷贝是引用拷贝

  5. 何时使用Swift Structs和Classes

    struct在绝大部分Objective-C代码中并不是很常用.我们偶尔以CGRect和CGPoint等方式接触到它们,但很少会自己去写.首先,它们不是很实用.用Objective-C在struct中正确地存储对象的引用的确很难,尤其是使用ARC的时候.很多其他语言干脆没有类似struct的东东.许多语言如同Python和JavaScript一样”万物皆对象”,只有引用类型.如果你是从这类语言转型到Swift的,你可能对struct的概念就更陌生了.等一下!

  6. Swift学习笔记(七)类和结构体

    储存属性是捆绑和储存在类或结构体中的常量或变量。定义了一个名为VideoMode的类创建类和结构体的实例属性访问注意:与Objective-C语言不同的是,Swift允许直接设置结构体属性的子属性。在Swift中,所有的基本类型:整数、浮点数、布尔值、字符串、数组和字典,都是值类型,并且都是以结构体的形式在后台所实现。在Swift中,所有的结构体和枚举都是值类型。实际中,这意味着绝大部分的自定义数据构造都应该是类,而非结构体。

  7. 关于Swift中的值类型(Value Types)与引用类型(Reference Type)

    Swift里面的类型分为两种:●值类型:每个实例都保留了一分独有的数据拷贝。如结构体、枚举和元组。值类型与引用类型的区别在于:值类型和引用类型最基本的区别在于复制之后的结果。引用类型示例代码如下:值类型较引用类型来说,会让你更容易在大量代码中理清状况。因此可能会造成严重的程序错误,这在调试过程中非常难以排除。

  8. Swift 中数组和链表的性能

    尽管如此,我觉得链表的例子非常有意思,而且值得实现和把玩,它有可能会提升数组reduce方法的性能。同时我认为Swift的一些额外特性很有趣:比如它的枚举可以灵活的在对象和具体方法中自由选择,以及“默认安全”。这本书未来的版本可能就会用Swift作为实现语言。拷贝数组消耗的时间是线性的。使用链表还有其他的代价——统计链表节点的个数所需要的时间是统计数组元素个数时间的两倍,因为遍历链表时的间接寻址方式是需要消耗时间的。

  9. swift 类和结构体

    swift的编码风格是类class和结构体struct名字使用大写字母开头的匈牙利表示法,相反的。类的方法和属性则用小写字母开头的匈牙利表示法。结构体总是通过被复制而进行代码传递的。表示是否是引用到同一个类对象7:类和结构体区别。结构体是值类型,结构体的赋值意味着拷贝行为的发生。swift的数组和字典都是以值类型传递的。

  10. 深入了解下Swift中的Value Type

    Swift中的集合就是这么做的,你也可以自己创建一个这样的类型。~~ByeBye等等你给我讲了这么多貌似没什么用啊错用出躲到你都遗忘了在我们Swift的世界中StringArrayDictionary都是ValueType,那么在他们装了一个AnyObject的是不是一个ValueTypeContainaReferenceType下面我们拿Array距离Array可以看做一个特殊的Dictionary表现形式其实是一样的。

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部