zoukankan      html  css  js  c++  java
  • Google Chrome Native Messaging开发实录(二)Chrome Extension扩展

    接上一篇《Google Chrome Native Messaging开发实录(一)背景介绍》的项目背景,话不多说,有关Chrome Extension介绍和文档就不展开了,直接上代码。

    首先准备一个测试效果的页面demo.html

    <!DOCTYPE html>
    <head>
        <meta charset="utf-8">  
        <title>Printer Demo</title> 
    </head>
    <html>
        <body>
            <input id="cardno" type="text" />
            <input id="mybutton" type="button" value="打卡" />
        </body>
    </html>

    chrome extension部分,manifest.json

    {
      "name": "My Printer",
      "version": "1.0.0",
      "manifest_version": 2,
      "content_scripts": [
        {
          "matches": ["http://localhost:5103/*"],
          "js": ["contentscript.js"]
        }
      ],
      "background": {
          "scripts": ["background.js"]
      },
      "permissions": [   
        "nativeMessaging"
      ]  
    }

    contentscript.js

    var button = document.getElementById("mybutton");
    var cardno = document.getElementById("cardno");
    
    
    button.addEventListener("click", function () {
        chrome.extension.sendMessage("some message", function (response) {
            //alert(response);
        });
    }, false);
    
    chrome.runtime.onMessage.addListener(function (data) {
        alert(data.cardno);
        cardno.value = data.cardno;
    });

    background.js

    var host_name = "com.my.printer";
    var port = null;
    var tab = null;
    
    function connectToNative() {
        console.log('Connecting to native host: ' + host_name);
        port = chrome.runtime.connectNative(host_name);
        port.onMessage.addListener(onNativeMessage);
        port.onDisconnect.addListener(onDisconnected);
    }
    
    function sendNativeMessage(msg) {
        message = { "text": msg };
        console.log('Sending message to native app: ' + JSON.stringify(message));
        port.postMessage(message);
        console.log('Sent message to native app: ' + msg);
    }
    
    function onNativeMessage(message) {
        console.log('recieved message from native app: ' + JSON.stringify(message));
        chrome.tabs.sendMessage(tab, message);
    } 
    
    function onDisconnected() {
        //console.log(chrome.runtime.lastError);
        console.log('disconnected from native app.');
        port = null;
        res = null;
    }
    
    chrome.extension.onMessage.addListener(function (data, sender, response) {
        tab = sender.tab.id;
        connectToNative();
        sendNativeMessage(data);    
        return true;
    });

    针对代码细节,提请大家必须要注意的有:

    1.native messaging相关api在chrome.runtime包中,只能在background中调用(可以是html或script)。

    2.content script虽然不能直接调用native messaging api,但需要它起到中转消息改变页面元素的作用。chrome.extension.sendRequest方法已过期,它向background传递消息使用chrome.runtime.sendMessage替代。

    3.在background中监听来自tab的消息chrome.extension.onRequest在官方文档中建议是用chrome.runtime.onMessage替代,但其实可以用chrome.extension.onMessage的,截止到写本文时官方的chrome extension api列表中并没有给出这样的写法,不要怀疑它的可用性。

  • 相关阅读:
    梯度下降
    最小二乘法模型的推导原理
    斗图啦+多线程(队列)
    scrapy错误-[scrapy.core.scraper] ERROR: Spider error processing
    python使用requests时报错requests.exceptions.SSLError: HTTPSConnectionPool
    AttributeError: module 'requests' has no attribute 'get'的错误疑惑
    *arg,**kwargs的参数作用的疑惑
    scrapy框架--新建调试的main.py文件
    Scrapy框架——安装以及新建scrapy文件
    爬虫-ajax请求遇到Unicode编码问题
  • 原文地址:https://www.cnblogs.com/BeanHsiang/p/6581929.html
Copyright © 2011-2022 走看看