Chrome扩展程序:为什么它不起作用?

时间:2014-10-13 14:59:57

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

我正在尝试获取Chrome中标签的当前网址,然后向网站发起请求并获取内容并将其写入文档正文。这是我的chrome ext。 JS:

var engine = {

    run: function () {
        chrome.tabs.query({
            'active': true,
            'windowId': chrome.windows.WINDOW_ID_CURRENT
        }, function (tabs) {
            var url = tabs[0].url;
            var urlfinal = 'http://SOMESITEHERE.com/api.php?url=' + url;
            var response = this.connect(urlfinal);
            document.write(response);
        });
    },



    //console.log(this.url),

    connect: function (link) {
        var xmlHttp = null;
        xmlHttp = new XMLHttpRequest();
        xmlHttp.open("GET", link, false);
        xmlHttp.send(null);
        return xmlHttp.responseText;
    }

};

document.addEventListener('DOMContentLoaded', function () {
    engine.run();
});

但是抛出:对tab.query的响应出错:TypeError:undefined不是函数... bla bla

我做错了什么?什么是最好的方法?

编辑:

这是我的Manifest.json:

{
  "manifest_version": 2,

  "name": "SOMETHINGHERE",
  "description": "SOMETHINGHERE",
  "version": "1.0",

  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },
  "permissions": [
    "http://SITEHERE.com/",
    "tabs"
  ]
}

1 个答案:

答案 0 :(得分:1)

“TypeError:undefined不是函数”意味着您正在尝试调用值为undefined的内容,就像它是函数一样。

在您的情况下,您致电this.connect(urlfinal),但this不是您所期望的(不是engine)。

您在回调中,而不再是run函数this没有属性connect。因此,this.connect == undefined。在这些情况下,调用this.connect()会抛出该错误。

要解决此问题,您可以,例如,存储顶级this对象,然后让闭包处理剩下的事情:

run: function () {
    var _this = this;
    chrome.tabs.query({
        'active': true,
        'windowId': chrome.windows.WINDOW_ID_CURRENT
    }, function (tabs) {
        var url = tabs[0].url;
        var urlfinal = 'http://SOMESITEHERE.com/api.php?url=' + url;
        var response = _this.connect(urlfinal);
        document.write(response);
    });
}

查看有关此技术的更多信息here