Chrome扩展程序包含错误

时间:2016-10-01 11:45:17

标签: javascript jquery json google-chrome google-chrome-extension

我决定尝试创建一个chrome扩展,并决定实施一个简单的扩展,这使我无法每天访问facebook / linkedin超过5次。

然而,我不断收到一些错误,我似乎无法调试。他们是:

enter image description here

奇怪的是,当它似乎在chrome API中定义时,它无法读取未定义的内容。

以下是我使用的文件:

的manifest.json

{
  "manifest_version": 2,
  "name": "Distract Me Not",
  "version": "0.1",
  "permissions": ["webNavigation"],
  "content_scripts": [
  {
    "matches": [
     "https://*.facebook.com/","https://*.linkedin.com/"
    ],
    "js": ["content.js","jquery3.1.1.js","background.js"]
  }
]
}

content.js

chrome.webNavigation.onCompleted.addListener(function(details) {
    chrome.tabs.executeScript(details.tabId, {
        file: 'background.js'
    });
});

background.js

function getDate(){
    var today = new Date();
    var dd = today.getDate();
    var mm = today.getMonth()+1; //January is 0!
    var yyyy = today.getFullYear();

    if(dd<10) {
        dd='0'+dd
    } 

    if(mm<10) {
        mm='0'+mm
    } 

    today = dd+'/'+mm+'/'+yyyy;
    return(today);
}

function main() {
    appName = $.getJSON("settings.json" , function(json){
        return json["appName"];
    });

    websiteLimits = $.getJSON("settings.json" , function(json){
        return json["websiteLimits"];
    });

    currentPage = window.location.hostname;
    currentWebsiteLimit = websiteLimits[currentPage];

    checkFor = appName + getDate();
    item = localStorage.getItem(checkFor);
    if (item) {
        item = Number(item);
        if (item > currentWebsiteLimit) {
            document.write("Sorry! Your limit for " + currentPage + " has been reached for today.");
            return;
        }
        localStorage.setItem(checkFor,item+1);
        return;
    }
    localStorage.setItem(checkFor,1);
}

main();

settings.json

{"appName":"distract me not",
"websiteLimits":{"facebook.com":5,
                "linkedin.com":5}
}

这看起来相当简单,但却暗示了我。我可能会遗漏一些简单的东西,并且会喜欢一些如何解决这个问题的指导!

谢谢! :)

更新:

我意识到文件应该是另一种顺序,并且我没有清除以前的错误,所以我被误导了同样的错误发生了。

但是,脚本似乎没有正确计数(content.js中的警报行警告两次重新加载)。有没有解决的办法?另外,我看到$ .getJSON无法获取本地文件。有没有办法可以将设置抽象到另一个json并加载它,或者这是唯一的方法吗?

非常感谢! :)

的manifest.json

{
  "manifest_version": 2,
  "name": "Distract Me Not",
  "version": "0.1",
  "permissions": ["webNavigation","tabs","https://*.facebook.com/","https://*.linkedin.com/"],
  "background":{
    "scripts":["background.js"]
  },
  "content_scripts": [
  {
    "matches": [
     "https://*.facebook.com/","https://*.linkedin.com/"
    ],
    "js": ["jquery3.1.1.js","content.js"]
  }
]
}

content.js

function getDate(){
    var today = new Date();
    var dd = today.getDate();
    var mm = today.getMonth()+1; //January is 0!
    var yyyy = today.getFullYear();

    if(dd<10) {
        dd='0'+dd
    } 

    if(mm<10) {
        mm='0'+mm
    } 

    today = dd+'/'+mm+'/'+yyyy;
    return(today);
}

function main(){
    var settings = {"appName":"distract me not",
                    "websiteLimits":{"www.facebook.com":5,
                                    "www.linkedin.com":5}
                    };

    appName = settings["appName"];
    websiteLimits = settings["websiteLimits"];
    currentPage = window.location.hostname;
    currentWebsiteLimit = websiteLimits[currentPage];

    alert(currentPage);

    checkFor = appName + getDate();
    item = localStorage.getItem(checkFor);
    if (item) {
        item = Number(item);
        if (item > currentWebsiteLimit) {
            document.write("Sorry! Your limit for " + currentPage + " has been reached for today.");
            return;
        }
        localStorage.setItem(checkFor,item+1);
        return;
    }
    localStorage.setItem(checkFor,1);
}

main();

background.js

chrome.webNavigation.onCompleted.addListener(function(details) {
    chrome.tabs.executeScript(details.tabId, {
        file: 'content.js'
    });
});

1 个答案:

答案 0 :(得分:2)

每个页面重新加载时脚本运行两次,因为每次重新加载都会包含两次。

只需查看您的代码并了解它

的manifest.json

...
"content_scripts": [
{
  "matches": [
     "https://*.facebook.com/","https://*.linkedin.com/"
  ],
  "js": ["jquery3.1.1.js","content.js"]
}
...

此代码表示:“请将我的content.jsjquery3.1.1.js脚本包含在任何网页上,该网址与DOM Ready上的https://*.facebook.com/https://*.linkedin.com/匹配。”

background.js

...
chrome.webNavigation.onCompleted.addListener(function(details) {
  chrome.tabs.executeScript(details.tabId, {
      file: 'content.js'
  });
});
...

此代码表示:“每次content.js触发”时,请运行webNavigation.onCompleted

正如您所看到的 - 加载LinkedIn时两个条件都是正确的,因此脚本content.js运行两次,您会看到2个警报。

P.S&GT;您是否只想限制对LinkedIn主页的访问权限,而不是它的子页面是否正确?