Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >谷歌插件Image downloader开发之popup

谷歌插件Image downloader开发之popup

作者头像
对角另一面
发布于 2017-12-27 06:37:55
发布于 2017-12-27 06:37:55
1.1K00
代码可运行
举报
文章被收录于专栏:对角另一面对角另一面
运行总次数:0
代码可运行

Image downloader的交互逻辑是这样的:用户点击Image downloader的图标,会向页面(content script,见上一篇文章:谷歌插件Image downloader开发之 content script)发送收集图片事件,页面收集完图片后,将对应的图片地址数组发送给popup页处理。popup页就是点击谷歌插件图标所弹出来的页面。Image downloader的popup页是长成这样的:

popup页包含的功能

popup页采用了vue1.0来做数据绑定,主要包含了以下功能:

1、显示原始图片大小 2、根据图片大小筛选图片 3、设置是否显示img标签的图片、是否显示背景图片,是否显示自定义属性的图片 4、根据自定义属性规则,收集所配置的自定义属性的值 5、下载图片

popup与content script的交互

图片容器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
imgs: { // 图片容器
    attrImg: [], // 属性图
    bgImg: [], // 背景图
    img: [], // img标签图
},
/**
 * 向tab发送收集图片信息,接收tab返回的图片url列表
 * @param action {string} 值为'all'或'attr',如果为all,则收集所有图片,为attr则只收集属性图
 * @param attr {string} 用;分隔开的属性规则
 */
sendMessage(action, attr) {
    chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
        chrome.tabs.sendMessage(tabs[0].id, { action, attr }, (response) => {
            if (action === 'all') {
                const attrImg = response.attrImg
                const bgImg = response.bgImg
                const img = response.img
                    // 重置容器
                this.resetImgContainer('attrImg')
                this.resetImgContainer('bgImg')
                this.resetImgContainer('img')
                    // 获取图片的宽高
                this.mapImg(this.imgs.attrImg, attrImg)
                this.mapImg(this.imgs.bgImg, bgImg)
                this.mapImg(this.imgs.img, img)
            } else {
                this.resetImgContainer('attrImg')
                this.mapImg(this.imgs.attrImg, response.attrImg)
            }
        });
    });
},

popup页用了chrome的tabs的api,query查询当前页签,并用sendMessage向页签发送action和配置的属性值,如果action为'all'则是收集所有图片,如果为'attr',则只收集所配置的属性图片,resetImgContainer方法只是简单地将容器置空,response是content script所返回的结果,mapImg方法用来获取图片的长和宽,下文会讲到。

而在content script中,则用onMessage来接收popup的信息,并将收集到的图片数组返回给popup

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 接收popup的指令,如果action为all,则获取所有图片url,如果为attr,则获取属性图片
chrome.runtime.onMessage.addListener(({ action, attr }, sender, sendResponse) => {
    if (attr) {
        configAttr = []
        configAttr.push(...initAttr)
        configAttr.push(...attr.split(','))
    } else {
        configAttr = []
        configAttr.push(...initAttr)
    }
    if (action === 'all') {
        sendResponse({
            attrImg: [...new Set(getConfigAttrUrl())],
            bgImg: [...new Set(getBackgroundImage())],
            img: [...new Set(getImgUrl())]
        })
    }
    if (action === 'attr') {
        sendResponse({
            attrImg: [...new Set(getConfigAttrUrl())],
        })
    }
});

上篇文章发在div.io上时,@幾米 提到了图片去重的问题,所有在返回图片是,用es6的Set方法去重,这个只处理同类型图片的去重,不处理如背景图片和图片标签之间的重复图片。

获取属性图片

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 获取属性图片
 */
getAttrImg() {
    clearTimeout(this.progress)
    this.progress = setTimeout(() => {
        this.sendMessage('attr', this.attr)
    }, 500)
},

配置的属性值发生变化时,向页面发送获取属性图片事件

显示图片原始大小

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 遍历图片,设置图片的宽高属性
 * @param container {array} 容器
 * @param imgs {array} 图片url列表
 */
mapImg(container, imgs) {
    imgs.forEach((src) => {
        this.imgNatureSize(container, src)
    })
},
/**
 * 获取图片原始宽高,并将图片push进容器
 * @param container {array} 容器
 * @param src {string} 图片url
 */
imgNatureSize(container, src) {
    const size = {
        width: '',
        height: '',
    }
    let image = new Image()
    image.src = src
    image.onload = function() {
        container.push({
            src,
            width: image.width,
            height: image.height,
        })
    }
},

遍历拿到的图片,获取图片的宽和高,并将宽高属性保存起来

下载图片

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 下载图片
 */
downLoad(url) {
    chrome.downloads.download({ url }, () => {
        console.log('下载成功')
    })
}

调用谷歌插件的download方法来进行图片下载,本来想搞个批量下载的,但是没有发现谷歌插件有提供批量下载的API,如果遍历所选中的图片列表,不断调用download方法,会一下子弹出很多保存窗口,没有什么意义,就作罢了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-12-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python 批量爬取猫咪图片实现千图成像
本文使用的 Python 版本是 3.10.0 版本,可直接在官网下载:https://www.python.org 。
Lucifer三思而后行
2021/11/03
9810
Python 批量爬取猫咪图片实现千图成像
谷歌插件Image downloader开发之 content script
自己运营了一个公众号,在发文章的时候,需要在网上找一些图,而有些网站的图片可能隐藏在属性或者背景图中,要下载的时候经常审查元素,查看源码,不太方便,最近在看一些谷歌插件的api,便顺手做了一个插件Im
对角另一面
2017/12/27
1.5K0
谷歌插件Image downloader开发之 content script
简单的谷歌插件开发记录
功能类似上图 实现代码: https://github.com/klren0312/cookies-chrome-plugin/edit/master/README.md
治电小白菜
2020/08/25
1.7K0
简单的谷歌插件开发记录
全网最详细的谷歌插件开发小册📚
可能是全网最详细的谷歌插件开发小册👏🏻,之前写谷歌插件的时候绕了一圈网上的教程,没有发现比较好的文档教程,索性根据官方文档梳理一遍,避免后面学习的同学继续踩坑!!!
linwu
2023/07/26
1.4K0
写html页面没意思,来挑战chrome插件开发
谷歌浏览器插件开发是指开发可以在谷歌浏览器中运行的扩展程序,可以为用户提供额外的功能和定制化的体验。谷歌浏览器插件通常由HTML、CSS和JavaScript组成,非常利于前端开发者。 开发者可以利用这些技术在浏览器中添加新的功能、修改现有功能或者与网页进行交互。
winty
2024/04/25
4990
写html页面没意思,来挑战chrome插件开发
灯箱效果插件Magnific Popup详解
Magnific Popup 是一个非常优秀的弹出对话框或者灯箱效果插件。它基于jQuery(zepto)开发,使用非常简单,特点就是:非常好用。
老马
2018/07/31
3.1K0
灯箱效果插件Magnific Popup详解
​Chrome扩展插件的开发--获取网页Cookies
Chrome浏览器在浏览器类应用软件中一直居于榜首,很多人选择Chrome浏览器不仅仅是因为它的稳定,还有它丰富的可拓展性。那么有没有想自己开发一款自己的谷歌浏览器插件呢?本文将介绍大家手动开发一个谷歌浏览器插件获取cookies.
凯哥Java
2022/10/30
1.5K0
​Chrome扩展插件的开发--获取网页Cookies
如何实现一个谷歌浏览器插件
直接将脚本注入到页面中,但是也可以包含CSS文件,但是在注入CSS文件时,要小心,否则会覆盖网页原本的样式。content-scripts中的JS程序和原始页面共享DOM,但是和原始页面的JS不是在同一个环境下运行的,所以我们是无法访问到原始页面中定义的变量的因为是是注入到页面中的,所以在安全策略上不能访问大部分的API,除了下面的四种:
zhaozhen
2021/07/15
1.5K0
如何实现一个谷歌浏览器插件
从 0 开始入门 Chrome Ext 安全(一) -- 了解一个 Chrome Ext
在2019年初,微软正式选择了Chromium作为默认浏览器,并放弃edge的发展。并在19年4月8日,Edge正式放出了基于Chromium开发的Edge Dev浏览器,并提供了兼容Chrome Ext的配套插件管理。再加上国内的大小国产浏览器大多都是基于Chromium开发的,Chrome的插件体系越来越影响着广大的人群。
Seebug漏洞平台
2019/11/28
1.2K0
【干货】Chrome插件(扩展)开发全攻略
严格来讲,我们正在说的东西应该叫Chrome扩展(Chrome Extension),真正意义上的Chrome插件是更底层的浏览器功能扩展,可能需要对浏览器源码有一定掌握才有能力去开发。鉴于Chrome插件的叫法已经习惯,本文也全部采用这种叫法,但读者需深知本文所描述的Chrome插件实际上指的是Chrome扩展。
winty
2020/07/23
11.9K1
【干货】Chrome插件(扩展)开发全攻略
chrome插件 manifest 2 to 3
影响到我们的API(主要是contentScript与background通讯的部分):
biaoblog.cn 个人博客
2022/08/11
2.4K0
chrome插件 manifest 2 to 3
chrome插件实时通信的几种方式
在chrome[1]插件开发中我们知道,background.js是独立于浏览器的,在background.js中主要负责popup与content.js的交互,在某些时候,也许你需要在一个插件的设置页与content进行实时通信,此时你能想到什么样的方式吗?本文是在插件业务通信总结的一篇笔记,希望看完能在实际业务中带来思考和帮助
Maic
2023/09/11
2.3K0
chrome插件实时通信的几种方式
chrome浏览器扩展v3版本配置项整理备忘
2、除了在插件内部contenscript background 和 popup之间传递消息以外,其他网站也可以给插件发送消息。方法如下 首先,需要增加配置 externally_connectable:{matches:[“https://*.xxx.com/”]}指定允许哪些网站可以给当前插件发送消息,相当于白名单,只有在白名单中的站点发送的消息,扩展才会监听
fastmock
2023/10/23
5640
使用Scrapy编写图像下载程序示例
最近闲来无事想要用Scrapy库来编写一个图像下载程序。首先,我得回忆一下Scrapy的基本结构。Scrapy是一个强大的爬虫框架,适合用来抓取网页数据,包括图片。不过,用户可能不太熟悉Scrapy的具体用法,特别是图片下载的部分。
华科云商小徐
2025/04/08
840
进阶|Chrome还不够神,但你写的扩展程序可以很神
前端爱好者的知识盛宴 Hello,各位前端ers,周末好! 今天的供稿人是鹅厂的ChokCoco... 作为前端大神... 不可避免会接触Chrome... 这是一款好用的插件会帮你提升质感... 如果你有好的Idea... 想做好的插件并发布... ChokCoco会手把手教你... 并且征服各项难点... 欢迎转发和留言... 文末会有ChokCoco的博客... 欢迎有事没事上去逛一逛... 什么是 chrome 扩展程序 扩展程序是一些能够修改或增强 Chrome 浏览器功能的小程序。对于前
用户1097444
2022/06/29
1.2K0
进阶|Chrome还不够神,但你写的扩展程序可以很神
如何快速地开发一个chrome扩展插件
说到现如今最流行的浏览器,那么一定是chrome,无论是它的速度,还是它的稳定性,还是它的简洁,都让人爱不释手,此外,更多的人选择它的理由是它有着丰富的扩展插件,这些扩展插件让你的浏览器变得异常强大,让你的浏览器不仅仅是浏览器。
程序那些事儿
2023/07/24
5790
如何快速地开发一个chrome扩展插件
爬虫网页解析之css用法及实战爬取中国校花网
我们都知道,爬虫获取页面的响应之后,最关键的就是如何从繁杂的网页中把我们需要的数据提取出来,
Python编程与实战
2019/12/04
2K0
Chrome 插件特性及实战场景案例分析
提起Chrome扩展插件(Chrome Extension),每个人的浏览器中或多或少都安装了几个插件,像一键翻译、广告屏蔽、录屏等等,通过使用这些插件,可以有效的提高我们的工作效率;但有时候,我们想要的某个功能市面上没有现成的插件,作为开发者自然而然想到,自己是否可以动手开发一个定制化的插件?网上目前很多不错的关于Chrome插件的开发教程,可以帮助我们快速上手开发一个插件, 本文换个思路,从应用着手,通过讲解插件的特性来启发读者在工作中哪些场景可以通过插件来解决。
2020labs小助手
2021/11/24
1.9K0
30分钟开发一款抓取网站图片资源的浏览器插件
由于业务需求, 笔者要为公司开发几款实用的浏览器插件,所以大致花了一天的时间,看完了谷歌浏览器插件开发文档,在这里特地总结一下经验, 并通过一个实际案例来复盘插件开发的流程和注意事项.
徐小夕
2020/04/23
1.3K0
浏览器插件开发-manifest文件解读「建议收藏」
"content_security_policy": "script-src 'self' https://*.xxx.com; object-src 'self'"
全栈程序员站长
2022/07/28
2.6K0
相关推荐
Python 批量爬取猫咪图片实现千图成像
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验