东东东 陈煜东的博客

标签存档: chrome

Chrome插件onUpdate事件多次运行

在编写Chrome的一个插件,查询PR值的时候,发现网络访问请求了两次。

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo,tab) {
    if ("loading"!=tab.status)return; 
    var url = tab.url;
    console.log("tab.url"+tab.url);
    if(url != undefined) {
        //do something
    }
});

以前知道按F5刷新页面onUpdated这个事件会触发两次。

  • 一次是loading的的时候
  • 一次是completed的时候

所以使用了if ("loading"!=tab.status)return; 来进行过滤两次的问题。

注意,新建一个tab页面的时候、进入新的链接(打开新的页面),这个opUpdated事件也是会被触发的。

虽然我使用了tab.status != “loading”来进行过滤两次的问题。但是还有一个问题。每次F5刷新页面,下面的代码只运行了一次,但是新建tab页面的时候、进入新的链接的时候,下面的代码居然运行了2次!

我在跟踪的过程中发现,这两种情况(新建tab页面、进入新的链接)下导致运行两次是因为favicon.ico这个文件。原来浏览器的tab页面每次更新url,都会去访问favicon.ico这个文件,每次访问都会触发这个事件。

提示:favicon.ico位于网站的根目录下方。比如我的是http://www.chenyudong.com/favicon.ico,这个文件在浏览器的tab页面的图标上显示。我的是

所以在tab更新url的时候,会有下面的三种情况

  • 访问url,触发事件,loading
  • 访问favicon,触发事件
  • 访问url结束,触发事件,complete

我们来看看changeInfotab这两个变量在这三种情况下的信息

//第一种 访问url,触发事件,loading
changeInfo = {status: "loading", url: "http://www.chenyudong.com/"} 
tab =  {
    active: true
    height: 992
    highlighted: true
    id: 3598
    incognito: false
    index: 39
    pinned: false
    selected: true
    status: "loading"
    title: "http://www.chenyudong.com/"
    url: "http://www.chenyudong.com/"
    width: 1846
    windowId: 1955
}

//第二种 访问favicon,触发事件
changeInfo  = {favIconUrl: "http://www.chenyudong.com/favicon.ico"} 
tab =  {
    active: true
    height: 992
    highlighted: true
    id: 3598
    incognito: false
    index: 39
    pinned: false
    selected: true
    status: "loading"
    title: "http://www.chenyudong.com/"
    url: "http://www.chenyudong.com/"
    width: 1846
    windowId: 1955
}

//第三种 访问url结束,触发事件,complete
changeInfo =  {status: "complete"} 
tab = {
    active: true
    favIconUrl: "http://www.chenyudong.com/favicon.ico"
    height: 992
    highlighted: true
    id: 3598
    incognito: false
    index: 39
    pinned: false
    selected: true
    status: "complete"
    title: "东东东  陈煜东的博客"
    url: "http://www.chenyudong.com/"
    width: 1846
    windowId: 1955
}

通过查看,我们可以发现,只有一次在访问url的时候,changeInfo会有url这个字段,所以可以利用这个字段来判断,让onUpdate里面的代码对每个url只运行一次。

//以后就使用下面的代码啦
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo,tab) {
    if( changeInfo.url == undefined)return;
    var url = tab.url;
    console.log("tab.url"+tab.url);
    if(url != undefined) {
        // do something
    }
});

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: Chrome插件onUpdate事件多次运行 – https://www.chenyudong.com/archives/chrome-extension-onupdate-event-twice.html

分类: 网站建设

chrome打开外部协议程序

修改chrome对协议的控制

有时候在Google浏览器中点击一些协议,会弹出其他的应用程序。但是有时候会点了记住我对所有此类链接的选择,于是以后再想打开此类链接,就找不着了。

面对这样的事情,首先是冷静,打开C:\Users\用户名\AppData\Local\Chromium\User Data\Local State文件,

"protocol_handler": {
      "excluded_schemes": {
         "afp": true,
         "data": true,
         "disk": true,
         "disks": true,
         "file": true,
         "hcp": true,
         "javascript": true,
         "mailto": false,
         "mms": false,
         "ms-help": true,
         "news": false,
         "nntp": true,
         "shell": true,
         "snews": false,
         "vbscript": true,
         "view-source": true,
         "vnd": {
            "ms": {
               "radio": true
            }
         }
      }
   },

比如11行的mms协议,现在为false,说明,它可以直接点击链接打开的,如果它为true,那么表示该协议被Google浏览器给阻止了,需要将其改为false即可。

设置协议对应的软件

之前的那一步,是让Chrome不阻挡关联的协议,那么这一步就要设置系统,让操作系统找到对应的关联程序。比如mms协议,经过第一步,chrome不会对该协议进行阻挡,交由操作系统处理,那么操作系统该调用哪个程序呢?

那么就要修改文件关联类型或协议,Windows 7和Windows 8参见文章Windows 8 改变文件关联类型或协议

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: chrome打开外部协议程序 – https://www.chenyudong.com/archives/chrome-open-external-protocal.html

分类: 软件

Copyright © 2017 东东东 陈煜东的博客 粤ICP备13059639号-1

SITEMAP回到顶部 ↑