制作谷歌插件 popup background content_scripts通信之间的问题

公司最近有需求
就是运营人员输入自己的账号和密码 然后获取所属的店铺的账号和密码
自动登录亚马逊 所以需要一个浏览器插件帮助运营人员

其实一开始我查资料 了解了基础的东西
但是我实在分不清楚popup.html background.js 还有content_scripts之间的关系
特别是这个三个之间如何通信的。

谷歌插件api文档我是看了的 但是奈何英文和众多的api挡住了我
完全摸不到头脑 所以菜鸡的我只好翻阅各种大佬的资料
所幸在B站找到了大佬的视频教学 下方放入大佬的视频

大佬的教学视频
(ps:有基本基础的可以直接跳到第5课)

2020/07/13

以下为原答案 可以忽略 可以往下滑

popup.html 这是弹窗页面 你如果想输入一些指令,或者操作一些指令 这就是必须的
background.js 这基本上是用来处理逻辑 请求接口 返回数据 这是重中之重
content_scripts里面的js 这是用来获取浏览器你所在页面的一些东西dom元素啊 等等

例如我所需要给公司完成的需求是这样的
popup.html弹窗页面现在需要一个提交一个表单 然后来获得账号密码来自动填写浏览器上亚马逊页面的登陆表单。
逻辑是这样的:popup.html通过点击提交按钮来触犯点击事件 并告诉background.js 我已经点击了
在这里插入图片描述
background.js 通过监听事件 表示我已经搜到了你提交的表单信息 已经开始请求接口了 并返回一个我已经成功接收到消息的提示给popup.html
在这里插入图片描述
然后content.js 等亚马逊登陆界面加载好同样也发生一个请求给background.js (其实这个不分顺序 有可能是content.js先加载 因为浏览器页面加载好 你才好操作popup 这里只是为了方便叙述 )表示我已经获得页面的数据了 我需要数据填充
在这里插入图片描述
同样的background.js 通过监听事件 表示已经知道浏览器页面的数据已经有了 然后根据popup给的信息作为参数开始请求接口 然后返回数据给content.js
在这里插入图片描述

最终content.js通过bg.js传递过来的数据填充亚马逊登陆表单。

以上,就是大概我所要做的需求思想,有时间我回来完事一下。

2020/07/22 更新

我原本以为看了视频 我就能明白差不多了 但是的确还是存在一些问题。
看视频让我明白了popup.js 怎么给bg.js通信
也明白了content_scripts向bg.js通信

但是其实我做的时候就遇到一个问题 就是如果都向bg发送消息 那么bg如何区分了?

所以我试了一下 发现bg都能收到 但是message会被之后那个覆盖 回调函数也会重复执行
这并不是我想要的 我需要的是接受到pop和content的数据 然后在bg里进行处理
处理完结果返回给content 所以我重新想了一个思路
就是pop传递数据给bg,然后通过bg传给content 最后content在进行最后的处理
下面贴上我的处理结果

//pop.js
$(function(){
    var needObj = {
        ips: [],
        key: '',
        user: ''
    };
    $.ajax({
        async: false,
        type: "GET",
        url: "http://127.0.0.0:0000/", 
        success: function (data) {
            needObj.ips = data.in_ips;
        },
        error: function (data) {
            alert('获取ip出错');
        }
    });
    $("#save").click(function(){
        needObj.user = $("#input1").val();
        needObj.key = $("#input2").val();
        // 向bg发送数据
        chrome.runtime.sendMessage(needObj, function(response) {
            console.log(response);
        });
    })
})
// bg.js
chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
    let someInfo = message
    chrome.windows.getCurrent((currentWindow) => {
        chrome.tabs.query({ active: true, windowId: currentWindow.id }, (tabs) => {
            chrome.tabs.sendMessage(tabs.length ? tabs[0].id: null, someInfo, function(response) {
        		if(typeof response !='undefined'){
        			console.log(response);
        		}else{
        			console.log('报错了'+ response);
        		}
        	});
        })
    })
    sendResponse("个人账号邮箱发送成功了")
})

其实最麻烦的在于chrome.tabs.query 这个方法 是bg向content发送数据而使用的方法
但是因为每个content都是一个浏览器页面 content会有很多 所以它为了确定是你所需要content
所以需要一个tabid 就是当前浏览器标签ID content通过这个id来和bg确定
我一开始是这样写的

chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
    let someInfo = message
    chrome.tabs.query({ active: true, windowId: currentWindow.id }, (tabs) => {
        chrome.tabs.sendMessage(tabs.length ? tabs[0].id: null, someInfo, function(response) {
    		if(typeof response !='undefined'){
    			console.log(response);
    		}else{
    			console.log('报错了'+ response);
    		}
    	});
    })
    sendResponse("个人账号邮箱发送成功了")
})

但是因为bg.js是插件的背景页 它一开始就会生成 所以这时候的tab.id 是插件页本身那个tabid
所以到后面我监听来自pop消息成功后传给content 表示是当前亚马逊页面的tab.id不存在的
我找了很久都不知道为什么它不存在 打印出来也只有这个插件刚刚生成的时候会出现一次tab.id
就在这里我卡了很久
直到后面看到RuphiLau大佬的文章
Chrome Extension 开发总结(三):开发技巧
才解决了这个问题 还有很多很多大佬的文章 我在文章底部一一贴上 更感谢这些大佬的文章。

content.js
chrome.runtime.onMessage.addListener(function(message,sender,sendResponse){
    $.ajax({
        async: false,
        type: "POST",
        url: "https://www.baidu.com",
        data: JSON.stringify({"ips": message.ips,"key": message.key,"user": message.user}),
        success: function (data) {
            if(data.code == 200 ){
                // 逻辑处理
            }else{
                alert(data.msg);
            }
        },
        error: function (err) {
            console.log(err)
            alert("报错了,请联系IT部")
        }
    });
    

最后就这样完成了!
其实我这写的也有很多问题 而且我觉得会有更方便的方法
如pop不需要通过bg再向content传递消息 可以直接向content传递消息
有机会我会试试 回来更新的

最后贴上大佬们的文章:
Chrome Extension 开发总结(三):开发技巧
Chrome浏览器插件开发:进阶
一篇文章教你顺利入门和开发chrome扩展程序(插件)
chrome插件开发:content、background和popup三者之间的通信

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值