【问题标题】:Chrome Extension Oddity with Tab API带有 Tab API 的 Chrome 扩展奇怪
【发布时间】:2013-05-24 18:32:47
【问题描述】:

我正在编写 Chrome 扩展程序,但在打开超过 5 个标签时遇到了一些困难。这是源代码。

manifset.json

{
  "manifest_version": 2,

  "name": "Test",
  "description": "testing this",
  "version": "1.0",

  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },
  "permissions": [
    "bookmarks"
  ]
}

popup.html

<!doctype html>
<html>
  <head>
    <title>Testing</title>
    <style>
      body {
        min-width: 357px;
        overflow-x: hidden;
      }

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

popup.js

document.addEventListener('DOMContentLoaded', function () {
  chrome.bookmarks.getTree(function (stuff){
    traverseBookmarks(stuff[0].children[0].children);
  });
});

  function traverseBookmarks(bookmarkTreeNodes) {
    for(var i=0;i<bookmarkTreeNodes.length;i++) {
      var bookmark = document.createElement('a');

      if(bookmarkTreeNodes[i].url){
        bookmark.href = bookmarkTreeNodes[i].url;
        bookmark.target = "_blank";
      }
      else{
        (function(num) {
          bookmark.addEventListener("click", function() {
            addChildren(bookmarkTreeNodes[num].children, false );
          })})(i);
        document.body.appendChild(document.createElement("br"));
      }
      bookmark.innerHTML = bookmarkTreeNodes[i].title;
      document.body.appendChild(bookmark);
      document.body.appendChild(document.createElement("br"));

      if(bookmarkTreeNodes[i].children) {
        traverseBookmarks(bookmarkTreeNodes[i].children);
      }
    }
  }

  function addChildren(children) {
    for(var i = 0; i < children.length; i++){
      // will open each link in the current window
      chrome.tabs.create({
        url: children[i].url
      });
    }
  }

目标是能够单击文件夹(现在只是一个象征文件夹的链接)并打开该文件夹内的所有链接。目前我点击文件夹的链接会发生什么,它会打开前 5 个。为了获得某种形式的日志记录,我添加了:

var bookmark = document.createElement('a');
bookmark.innerHTML = children[i].title;
document.body.appendChild(bookmark);
document.body.appendChild(document.createElement("br"));

到 addChildren() 函数。它打印出每个孩子。我遇到的问题是,当我单击文件夹时,它只会打开前 5 个选项卡,然后我猜焦点会离开弹出窗口,所以它没有完成。我真的无法在网上找到任何其他帮助

感谢任何帮助。如果我需要澄清任何事情,请告诉我。

【问题讨论】:

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


    【解决方案1】:

    我怀疑问题就像你说的那样,当你创建一个新标签时,默认情况下它是active,所以弹出窗口失去焦点并卸载。您可以通过以下两种方式之一解决此问题。您可以将 url 列表发送到背景页面,然后将它们全部打开。这将起作用,因为在打开选项卡时背景页面会保持加载状态。

    另一种可能更好的解决方法是创建将active 属性设置为false 的选项卡,然后在它们全部打开后切换到组中的第一个选项卡。代码:

    function addChildren(children) {
      for(var i = 0; i < children.length; i++){
        chrome.tabs.create({
          url: children[i].url,
          active: false
        });
      }
      // switch focus to first opened tab
      chrome.tabs.query({url:children[0].url},function(tabs){
        chrome.tabs.update(tabs[tabs.length-1].id,{active:true});
      });
    }
    

    【讨论】:

    • 是的,就是这样。当答案如此明显而您无法完全掌握时,我讨厌它。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多