4

私の目標は、クリックするとリンクが既にアクセスされている reddit の親 div を削除するボタンを作成することです。セキュリティ上の問題により、非特権 JavaScript からは訪問済みリンクのステータスを検出できないため、chrome 拡張を試みました。ただし、これも機能しないようです。履歴パーミッションを持つ拡張機能から呼び出された JavaScript でさえ、「Uncaught TypeError: Cannot call method 'search' of undefined.」を返すためです。したがって、私はまだこれを行う方法を探しています。

2013 年 1 月 8 日更新

私はこれを機能させることに非常に近づいていますが、コンテンツ スクリプトで n_results を取得して、そのステータスをバックグラウンド スクリプトに正確に反映させることはできません。何か案は?以下の最新のコード。

2013 年 1 月 8 日更新

それは働いている!上記のようなことをする必要がある場合は、以下を参照してください。

マニフェスト.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
                });
            };
        });
    });

ntsreddit_content.js

$("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();
    };
});
4

1 に答える 1

2

コンテンツ スクリプトにはいくつかの制限があります。それらはchrome.* API を使用できません( chrome.extensionの一部を除く) 。bookmarklet.jsのコードchrome.historyは常にundefined

編集:

スクリプトにいくつかの変更を加えた後、実行しました。

変更点

  • Chrome API は非同期です。コールバックが返された後にのみ、さらに論理計算を行う必要があります
  • sendResponse() メソッドは非推奨です

ntsreddit_background.js

Chrome API の非同期性を処理するように移動tabs.sendMessage()し、非推奨の API を削除しました

chrome.extension.onMessage.addListener(

function (request, sender) {
    console.log(sender.tab);
    n_results = -1;

    console.log(request.link);

    chrome.history.getVisits({
        url: request.link
    },

    function (visits) {
        console.log(visits.length);
        n_results = visits.length;
        chrome.tabs.sendMessage(sender.tab.id, {
            "result": n_results
        });
    });



});

ntsreddit_content.js

バックグラウンド ページから受信した応答を処理するためのリスナーを追加しました

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

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

これで問題が解決することを願っています。

于 2013-01-08T09:30:03.687 に答える