在扩展中从javascript访问chrome.history并更改正在查看的页面

在扩展中从javascript访问chrome.history并更改正在查看的页面,javascript,google-chrome-extension,browser-history,reddit,Javascript,Google Chrome Extension,Browser History,Reddit,我的目标是创建一个按钮,当单击该按钮时,将删除reddit上链接已被访问的父div。由于安全问题,无法从未经授权的javascript中检测到已访问的链接状态,因此,我尝试了一个chrome扩展。然而,这似乎也不起作用,因为即使是从具有历史权限的扩展调用的javascript也会返回“UncaughtTypeError:Cannotcallmethod'search'of undefined”。因此,我仍在寻找实现这一点的方法 2013年8月1日更新 我很快就能让它工作了,但是,我无法在内容脚本

我的目标是创建一个按钮,当单击该按钮时,将删除reddit上链接已被访问的父div。由于安全问题,无法从未经授权的javascript中检测到已访问的链接状态,因此,我尝试了一个chrome扩展。然而,这似乎也不起作用,因为即使是从具有历史权限的扩展调用的javascript也会返回“UncaughtTypeError:Cannotcallmethod'search'of undefined”。因此,我仍在寻找实现这一点的方法

2013年8月1日更新

我很快就能让它工作了,但是,我无法在内容脚本中获得n_结果,以准确反映其在背景脚本中的状态。有什么想法吗?最新代码如下

2013年8月1日更新

它起作用了!如果您需要执行上述操作,请参见下文

manifest.json

{
  "name": "Never The Same (NTS) Reddit",
  "version": "1.0",
  "manifest_version": 2,
  "description": "Previously visited links are deleted.",
  "browser_action": {"default_icon": "icon.png"},
  "permissions": ["history","tabs"],
  "content_scripts": [
      {
          "run_at": "document_end",
          "matches": ["http://www.reddit.com/*"],
          "js": ["jquery-1.8.3.min.js", "ntsreddit_content.js"]
      }
  ],
  "background": {"scripts": ["ntsreddit_background.js"]}
}
ntsreddit_background.js

chrome.extension.onMessage.addListener(
    function (request, sender) {
        chrome.history.getVisits({"url": request.url},
        function (visits) {
            if (visits.length > 0) {
                chrome.tabs.sendMessage(sender.tab.id, {
                    "url": request.url
                });
            };
        });
    });
$("div.thing a.title").each(
    function(index, value) {
        chrome.extension.sendMessage({"url": value.href});
    });

chrome.extension.onMessage.addListener(function (message) {
    anchor=$('a[href^="' + message.url + '"][class~="title"]')
    if (anchor.length > 0) {
        anchor.closest(".thing").remove();
    };
});
ntsreddit\u content.js

chrome.extension.onMessage.addListener(
    function (request, sender) {
        chrome.history.getVisits({"url": request.url},
        function (visits) {
            if (visits.length > 0) {
                chrome.tabs.sendMessage(sender.tab.id, {
                    "url": request.url
                });
            };
        });
    });
$("div.thing a.title").each(
    function(index, value) {
        chrome.extension.sendMessage({"url": value.href});
    });

chrome.extension.onMessage.addListener(function (message) {
    anchor=$('a[href^="' + message.url + '"][class~="title"]')
    if (anchor.length > 0) {
        anchor.closest(".thing").remove();
    };
});

内容脚本有一些限制。他们不能使用chrome.*API(部分除外),bookmarklet.js中的代码
chrome.history
将始终是
未定义的

编辑: 在对你的脚本做了一些更改后,我让它运行起来

变化
  • ChromeAPI是异步的,您应该只在回调返回后进行进一步的逻辑计算
  • sendResponse()方法已弃用
ntsreddit_background.js

chrome.extension.onMessage.addListener(
    function (request, sender) {
        chrome.history.getVisits({"url": request.url},
        function (visits) {
            if (visits.length > 0) {
                chrome.tabs.sendMessage(sender.tab.id, {
                    "url": request.url
                });
            };
        });
    });
$("div.thing a.title").each(
    function(index, value) {
        chrome.extension.sendMessage({"url": value.href});
    });

chrome.extension.onMessage.addListener(function (message) {
    anchor=$('a[href^="' + message.url + '"][class~="title"]')
    if (anchor.length > 0) {
        anchor.closest(".thing").remove();
    };
});
移动了
tabs.sendMessage()
,以处理chrome API的异步特性,并消除了不推荐使用的API

ntsreddit\u content.js

chrome.extension.onMessage.addListener(
    function (request, sender) {
        chrome.history.getVisits({"url": request.url},
        function (visits) {
            if (visits.length > 0) {
                chrome.tabs.sendMessage(sender.tab.id, {
                    "url": request.url
                });
            };
        });
    });
$("div.thing a.title").each(
    function(index, value) {
        chrome.extension.sendMessage({"url": value.href});
    });

chrome.extension.onMessage.addListener(function (message) {
    anchor=$('a[href^="' + message.url + '"][class~="title"]')
    if (anchor.length > 0) {
        anchor.closest(".thing").remove();
    };
});
添加了一个侦听器来处理从后台页面收到的响应

var firstlink = "https://www.google.co.in/";

chrome.extension.sendMessage({
    "link": firstlink
});
chrome.extension.onMessage.addListener(function (message, sender) {
    console.log(message.result);
});

我希望这能解决您的问题。

谢谢Sudarshan,看起来我可以通过消息传递来完成我想要的。@amingusamongus:是的,通过消息传递是可能的,您可以查找示例消息传递参考Sudarshan,你能看一下更新后的代码,看看你是否能理解为什么n_结果在打印到内容控制台之前没有从-1更改?它准确地反映了在后台控制台上打印时的结果数量。我诚挚的感谢。这段代码也给了我一个“端口错误:无法建立连接。接收端不存在。”即使我成功地来回发送消息。@amingusamongus:检查我的编辑,这应该可以解决您的问题