1

私はGoogleChrome拡張機能の作成の初心者です。私は(具体的には)browser actionクリックするとページ上のすべてのリンク(URL)を開く拡張機能を作成するつもりでしたGoogle Search。今まで、私はどんなウェブページにも存在する何かhighlightsとリンクを作ることができました。 および必要なファイルを以下に示します。-alerts(javascript alert function )
manifest.jsonscript


manifest.json==>

{
"name": "Highlight then alert.",
"description": "Highlight and alert links on a webpage.",
"version": "1.1",
"background": {
"scripts": ["write.js"]
},
"permissions": [
"tabs", "http://*/*", "https://*/*"
],
"browser_action": {
"default_title": "highlighter",
"default_icon": "highlight_16x16.png"
},
"manifest_version": 2
}

write.js==>

chrome.browserAction.onClicked.addListener(function(tab) {

var action_url1 = "javascript:(function()
{for(i=0;i<document.links.length;i++)alert(document.links[i]);})();";


var action_url2 = "javascript:(function()
{for(i=0;i<document.links.length;i++)document.links[i].style.backgroundColor='#F00';})();";


chrome.tabs.update(tab.id, {url: action_url1});
chrome.tabs.update(tab.id, {url: action_url2});
});


現在、私は単純なinlinejavascriptコードを記述しており、示されているようにそれらをさまざまな変数に格納してから、ChromeObjectメソッドに渡します-and
操作chrome.tabs.update()を実行しhighlightますalert
変数を渡すのではなく、絶対JavaScript関数を記述して、同じ操作を実行する方法を理解する必要があります。
提案?

4

2 に答える 2

3

Google 検索の拡張機能ですべてのリンクを強調表示するサンプル スケルトン。必要に応じてカスタマイズします。さらに情報が必要な場合はお知らせください

ここに画像の説明を入力

マニフェスト.json

{
  "name": "Show Links",
  "description": "Show links in a page",
  "version": "0.1",
  "minimum_chrome_version": "16.0.884",
  "permissions": [
    "experimental", "tabs", "downloads","<all_urls>"
  ],
  "browser_action": {
    "default_icon": "icon.jpg",
    "default_popup": "popup.html"
  },
  "manifest_version": 2
}

popup.html

<html>
<head>
<script src='popup.js'></script>
</head>
<body>
<table id='links'>
  <tr>
    <th><input type='checkbox' checked id='toggle_all'></th>
  </tr>
</table>
</body>
</html>

popup.js

var allLinks = [];
var visibleLinks = [];

// Display all visible links.
function showLinks() {
  var linksTable = document.getElementById('links');
  while (linksTable.children.length > 1) {
    linksTable.removeChild(linksTable.children[linksTable.children.length - 1])
  }
  for (var i = 0; i < visibleLinks.length; ++i) {
    var row = document.createElement('tr');
    var col0 = document.createElement('td');
    var col1 = document.createElement('td');
    var checkbox = document.createElement('input');
    checkbox.checked = true;
    checkbox.type = 'checkbox';
    checkbox.id = 'check' + i;
    col0.appendChild(checkbox);
    col1.innerText = visibleLinks[i];
    col1.style.whiteSpace = 'nowrap';
    col1.onclick = function() {
      checkbox.checked = !checkbox.checked;
    }
    row.appendChild(col0);
    row.appendChild(col1);
    linksTable.appendChild(row);
  }
 }



// Add links to allLinks and visibleLinks, sort and show them.  send_links.js is
// injected into all frames of the active tab, so this listener may be called
// multiple times.
chrome.extension.onMessage.addListener(function(links) {
  for (var index in links) {
    allLinks.push(links[index]);
  }
  allLinks.sort();
  visibleLinks = allLinks;
  //console.log(links);
  showLinks();
});

// Set up event handlers and inject send_links.js into all frames in the active
// tab.
window.onload = function() {


  chrome.windows.getCurrent(function (currentWindow) {
    chrome.tabs.query({active: true, windowId: currentWindow.id},
                      function(activeTabs) {
      chrome.tabs.executeScript(
        activeTabs[0].id, {file: 'send_links.js', allFrames: true});
    });
  });
};

send_links.js

// Send back to the popup a sorted deduped list of valid link URLs on this page.
// The popup injects this script into all frames in the active tab.
console.log("Injected");

var links = [].slice.apply(document.getElementsByTagName('a'));
console.log(links);
links = links.map(function(element) {
  // Return an anchor's href attribute, stripping any URL fragment (hash '#').
  // If the html specifies a relative path, chrome converts it to an absolute
  // URL.
  var href = element.href;
  var hashIndex = href.indexOf('#');
  if (hashIndex >= 0) {
    href = href.substr(0, hashIndex);
  }
  return href;
});

links.sort();

// Remove duplicates and invalid URLs.
var kBadPrefix = 'javascript';
for (var i = 0; i < links.length;) {

  if ((((i > 0) && (links[i] == links[i - 1])) ||
      (links[i] == '') ||
      (kBadPrefix == links[i].toLowerCase().substr(0, kBadPrefix.length))) ) {
    links.splice(i, 1);
  } else {
    ++i;
  }
}
console.log(links);

chrome.extension.sendMessage(links);
于 2012-11-29T14:09:58.327 に答える
1

正確に何が必要かは少しわかりませんが、ブックマークレットスタイルを使用せずに、ブラウザアクションクリックでテストするコードを今すぐ挿入する方法が必要だと思います。
もしそうなら、これは私がそれを行う方法です...
manifest.json

{
  "name": "Testing from a PopUp",
  "version": "1.0",
  "permissions": [
    "tabs", "<all_urls>"
  ],
  "browser_action": {
      "default_title": "Inject Test Script",
      "default_icon": "icon.png",
      "default_popup": "popup.html"
  },
  "manifest_version":2
}

popup.html

<!doctype html>
<html>
  <head>
    <script src="popup.js"></script>
  </head>
  <body>
  </body>
</html>

popup.js

chrome.tabs.executeScript(null,{file:"injectedCode.js"});
window.close();

注入されたCode.js

log = function() {
    for(i = 0; i < document.links.length; i++) console.debug(document.links[i]);
}

highlight = function() {
    var links = document.querySelectorAll('div[id="search"] ol li h3 a');
    for(var i = 0,length=links.length>10 ? 10 : links.length; i < length; i++) links[i].style.backgroundColor = '#F00';
}

log();
highlight();

調べる必要があるのはexecuteScriptです
http://developer.chrome.com/extensions/tabs.html#method-executeScript
個人的には、コンテンツスクリプトに変換する前に少しテストするこの方法が好きです。

于 2012-11-29T14:22:32.597 に答える