Запускайте скрипт кожного разу, коли натискається піктограма розширення Chrome


79

Як написати розширення chrome таким чином, щоб кожного разу, коли користувач натискає піктограму, мій сценарій запускався, але не відкривалося спливаюче вікно? (Я б сам це шукав у документах, але з якоїсь причини вони раптово перестали працювати, обробляючи кожну сторінку, коли я дійшов до цього).

Я припускаю, що це просто правильна настройка маніфесту. Ось що я маю зараз:

{
  "name": "My Extension",
  "version": "0.1",
  "description": "Does some simple stuff",
  "browser_action": {
    "popup" : "mine.html",
    "default_icon": "logo.png"
  },
  "permissions": [
    "notifications"
  ]
}

Відповіді:


105

Видаліть спливаюче вікно з розділу браузера_дей маніфесту та використовуйте фонові сторінки разом із браузером Дія у фоновому сценарії.

chrome.browserAction.onClicked.addListener(function(tab) { alert('icon clicked')});

10
Де саме я це кладу. Без mine.html єдиним файлом у розширенні є маніфест ... ну і піктограма.
Ендофаг

3
Погляньте на фонові сторінки - code.google.com/chrome/extensions/background_pages.html . Саме там ви розміщуєте свій тривалий код і код, який є загальним для різних сторінок. Посилання на документ вище має приклад з browserAction.onClicked
arunkumar

Ах зрозумів. Спочатку я спробував фонову сторінку, але не знав про browserAction.onClicked.
Ендофаг

5
Якщо у вас немає розділу browser_action у manifest.json, це не буде працювати. Ви повинні додати порожню дію браузера в manifest.json: "browser_action": {}
Адам Фарина,

66

По-перше, якщо ви не хочете показувати спливаюче вікно, видаліть "popup" : "mine.html"зі свого manifest.json(показано у вашому запитанні).

Ви manifest.jsonбудете виглядати приблизно так:

{
  "name": "My Extension",
  "version": "0.1",
  "manifest_version" : 2,
  "description": "Does some simple stuff",
  "background" : {
    "scripts" : ["background.js"]
  },
  "browser_action": {
    "default_icon": "logo .png"
  },
  "permissions": ["activeTab"]
}
  • Зверніть увагу, що воно manifest_versionповинно бути і повинно бути 2.
  • Зверніть увагу, що activeTabдозвіл додано.
  • Зверніть увагу, що ви можете зробити лише одне, натиснувши кнопку дії браузера: або ви можете показати спливаюче вікно, або ви можете виконати сценарій, але ви не можете зробити те й інше.

По-друге, щоб виконати скрипт при натисканні на іконку, помістіть код нижче у свій background.jsфайл (ім’я файлу вказано у вашому manifest.json):

chrome.browserAction.onClicked.addListener(function(tab) {
   chrome.tabs.executeScript(null, {file: "testScript.js"});
});

Нарешті, testScript.jsсаме тут слід помістити код, який ви хочете виконати при натисканні на піктограму.


4
Станом на лютий 2017 року це рішення виконує саме те, що було задано у вихідному питанні.
mjamore

3
Чудово, ця робота для мене сталася в червні 2018 року. Варто проголосувати! @kerzek Можливо приблизно так:js function buttonClicked(tab) { var msg = { message: "user clicked!" } chrome.tabs.sendMessage(tab.id, msg); }
KF

2
Для наочності onClickedслухач запускатиметься, лише якщо ви видалите спливаюче вікно. Це те чи інше, а не те й інше.
HughHughTeotl

5

Замість того, щоб вказувати спливаючу сторінку, використовуйте chrome.browserAction.onClickedAPI, описаний тут .


4

вам потрібно додати фоновий файл. але спочатку потрібно додати атрибут у manifest.json, наприклад,

"background":{
    "scripts":["background.js"]
}

тепер назвіть файл у вашій папці розширення як background.js. Існує спосіб надсилання об'єктів із фонового режиму до ваших сценаріїв вмісту. Припустимо, ваш сценарій вмісту має ім'я content.js, тоді вам потрібно написати цей фрагмент коду у файл background.js

chrome.browserAction.onClicked.addListener(sendfunc);
function sendfunc(tab){
    msg={txtt:"execute"};
    chrome.tabs.sendMessage(tab.id,msg);
}

те, що робить наведений вище код, - це надсилання об’єкта з іменем msg на сторінку вмісту, і цей об’єкт msg має властивість txtt, яке дорівнює "виконувати". що вам потрібно зробити далі, це порівняти значення у сценарії вмісту як

chrome.runtime.onMessage.addListener(recievefunc);
function receivefunc(mssg,sender,sendResponse){
    if(mssg.txtt==="execute"){
      /*  
         your code of content script goes here
      */
    }
}

тепер кожного разу, коли ви клацаєте піктограму розширення, об'єкт з іменем msg надсилається із фонового на вміст. функція "recievefunc ()" порівняє свою властивість txtt із рядком "execute", якщо вона відповідає вашому решті коду.

Примітка: msg, txtt, sendfunc, receivefunc, mssg - це всі змінні, а не хромовані ключові слова, тому ви можете використовувати все, що завгодно.

сподіваюся, це допоможе.

:)


0

Це було якраз те, що мені потрібно, але я повинен додати наступне: якщо все, що вам потрібно - це одноразова подія, наприклад, коли користувач натискає піктограму розширення, тоді Фонові сторінки - це марна трата ресурсів, оскільки вона працюватиме у фоновому режимі ВСЕ час . Замість цього використовуйте Сторінки подій:

"background": {
    "scripts": ["script.js"],
    "persistent": false
}

Якщо це правда, то вам слід використовувати content_scriptзамість цього і прикріпити скрипт до DOM. Використання функції запуску у фоновому режимі лише один раз перемагає концепцію функціональності використання фону з самого початку. Просто думка, і це не означає, що ця ідея не спрацює.
KF
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.