【问题标题】:page_action click does not work while browser_action click works in Chrome Extension?page_action click 不起作用,而 browser_action click 在 Chrome 扩展中起作用?
【发布时间】:2019-07-24 06:32:41
【问题描述】:

我想制作一个简单的浏览器扩展程序,例如 Font Face Ninja,它会在单击 page_actionbrowser_action 时切换 UI。

使用browser_action 的以下代码有效 -

background.js

chrome.browserAction.onClicked.addListener(function(tab) {
  console.log(`clicked browserAction`)
})

manifest.json

{
    ...
    "browser_action": {
    "default_icon": {
      "19": "icon19.png",
      "38": "icon38.png"
    }
  },
    ...
}

虽然使用page_action 的以下代码不起作用 -

background.js

chrome.pageAction.onClicked.addListener(function(tab) {
  console.log(`clicked pageAction`)
})

manifest.json

{
    ...
    "page_action": {
    "default_icon": {
      "19": "icon19.png",
      "38": "icon38.png"
    }
  },
    ...
}

根据MDN docs

页面操作类似于浏览器操作,不同之处在于它们与特定网页相关联,而不是与整个浏览器相关联。如果某个操作仅与某些页面相关,那么您应该使用页面操作并仅在相关页面上显示它。如果某个操作与所有页面或浏览器本身相关,请使用浏览器操作。

这确认我想使用page_action,但它不起作用。

如何使用 page_action 使其工作?

【问题讨论】:

  • page_action 默认情况下是禁用的,您需要使用 show() 方法在适当的选项卡上单独启用它,请参阅包含演示扩展链接的 documentation。你也可以使用declarativeContent API
  • 我尝试使用演示链接使其工作,但它给出了奇怪的错误,所以我退出了它。如果需要,我会再次回到这里。目前,browser_action 正在工作,所以现在很好????
  • 好吧,所以 page_action 也可以使用 declarativeContentgithub.com/deadcoder0904/insert-remove-ui-chrome-extension/tree/…
  • @wOxxOm page_action 上的文档确实令人困惑;并且没有提及needing to enable it explicitly。 ATST,你的 cmets 总是有帮助的 :thumbsup:

标签: javascript google-chrome-extension firefox-addon browser-extension


【解决方案1】:

页面操作

可以在我的 Github 上找到使 page_action 工作的方法 → https://github.com/deadcoder0904/insert-remove-ui-chrome-extension/tree/page_action

background.js

var hasExecutedOnce = false

function addUI(tabId) {
  chrome.tabs.sendMessage(tabId, {
    from: 'background',
    subject: 'isUIAdded?',
  })
}

chrome.runtime.onInstalled.addListener(function() {
  chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {
    chrome.declarativeContent.onPageChanged.addRules([
      {
        conditions: [
          new chrome.declarativeContent.PageStateMatcher({
            pageUrl: { hostEquals: 'www.google.co.in' },
          }),
        ],
        actions: [new chrome.declarativeContent.ShowPageAction()],
      },
    ])
  })
})

chrome.pageAction.onClicked.addListener(function(tab) {
  if (!hasExecutedOnce) {
    chrome.tabs.executeScript(
      tab.id,
      {
        file: 'contentScript.js',
      },
      function() {
        addUI(tab.id)
      },
    )
    hasExecutedOnce = true
  }
  addUI(tab.id)
})

contentScript.js

var body = document.getElementsByTagName('body')[0]

function insertUI() {
  var div = document.createElement('div')
  div.setAttribute('id', 'sample-extension-12345')
  div.innerHTML = `<h1>Sample Extension</h1>`
  body.appendChild(div)
}

function removeUI() {
  document.getElementById('sample-extension-12345').remove()
}

function main() {
  chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    if (request.subject === 'isUIAdded?') {
      const id = document.getElementById('sample-extension-12345')
      if (id === null) insertUI()
      else removeUI()
    }
  })
}

main()

浏览器操作

在master分支上也有browser_action的解决方案→https://github.com/deadcoder0904/insert-remove-ui-chrome-extension/

background.js

var hasExecutedOnce = false

function addUI(tabId) {
  chrome.tabs.sendMessage(tabId, {
    from: 'background',
    subject: 'isUIAdded?',
  })
}

chrome.browserAction.onClicked.addListener(function(tab) {
  if (!hasExecutedOnce) {
    chrome.tabs.executeScript(
      tab.id,
      {
        file: 'contentScript.js',
      },
      function() {
        addUI(tab.id)
      },
    )
    hasExecutedOnce = true
  }
  addUI(tab.id)
})

contentScript.js

var body = document.getElementsByTagName('body')[0]

function insertUI() {
  var div = document.createElement('div')
  div.setAttribute('id', 'sample-extension-12345')
  div.innerHTML = `<h1>Sample Extension</h1>`
  body.appendChild(div)
}

function removeUI() {
  document.getElementById('sample-extension-12345').remove()
}

function main() {
  chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    if (request.subject === 'isUIAdded?') {
      const id = document.getElementById('sample-extension-12345')
      if (id === null) insertUI()
      else removeUI()
    }
  })
}

main()

【讨论】:

  • 拯救我的一天,兄弟!花了 3 个小时试着弄明白...如果你能在这里插入代码就好了。
  • @avalanche1 刚刚阅读 contentScript.js & background.js & 你是金子 :)
  • @avalanche1 完成。我把它们作为 h1 & h2。第一个是 page_action,第二个是浏览器操作,但我确实认为使用 manifest v3,API 将在年底发生变化,我们将只有其中一个,但现在你很高兴。让我知道这是否适合你:)
  • 现在我可以看到了。你真是个了不起的家伙!
猜你喜欢
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 2017-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
相关资源
最近更新 更多