Обращаясь к этому небольшому коду, chrome .runtime.onMessage всегда дает неопределенное значение. Что я могу сделать? - PullRequest
0 голосов
/ 04 апреля 2020

Я знаю, что есть похожие вопросы, и я попробовал почти все в них. Я пытаюсь создать расширение chrome, и оно должно передать сообщение из контента. js в фон. js.

Код:

background. js

var xstext;

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {  
      xstext=request.stext;
});


var wtf = "https://www.google.com/search?q="+xstext;
chrome.commands.onCommand.addListener(function(command) {
      if(command=="ntab"){
         chrome.tabs.create({ url: wtf}); 
      }
  });

содержание. js

var text = window.getSelection();
var stext=text.toString();

chrome.runtime.sendMessage({stext: stext});

манифест. json

    "manifest_version": 2,
    "name": "vind",
    "version": "1.0",
    "description": "Search stuff easily!",

    "background": {

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

 "content_scripts": [
  { 

    "all_frames": true,
    "run_at": "document_start",
    "matches": [
      "<all_urls>"
    ],
    "js": ["content.js"]
  }
],



    "browser_action": {
         "default_icon": {                    
           "16": "images/icon16.png",    
           "32": "images/icon32.png"          
          },

          "default_popup": "popup.html"
        },

  "commands": {
  "ntab": {
    "suggested_key": {
      "default": "Alt+G",
      "windows": "Alt+G",
      "mac": "Alt+G",
      "chromeos": "Alt+G",
      "linux": "Alt+G"
    },
  "description": "New tab for the query"
  }
}


}

Я хочу передать выбранный текст из содержимого. js к фону. js, я попытался добавить return: true; в слушателе безрезультатно. Я добавляю «undefined» в основную строку, так что, кажется, ничего не пропущено. что мне делать?

1 Ответ

0 голосов
/ 05 апреля 2020

Этот подход не будет работать, потому что 1) ваш скрипт контента сохраняет текст в момент его запуска, что происходит только один раз при загрузке страницы, и 2) поскольку фоновый скрипт не является постоянным, он будет выгружен после получения сообщения и xstext исчезнет.

Сделайте обратное: попросите скрипт содержимого при нажатии горячей клавиши.

background. js, все содержимое:

chrome.commands.onCommand.addListener(command => {
  if (command === 'ntab') {
    chrome.tabs.query({active: true, lastFocusedWindow: true}, ([tab]) => {
      if (!tab) return;
      chrome.tabs.sendMessage(tab.id, 'getText', text => {
        chrome.tabs.create({
          url: 'https://www.google.com/search?q=' + encodeURIComponent(text),
        });
      });
    });
  }
});

content . js, все содержимое:

chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
  if (msg === 'getText' && document.hasFocus()
  && (!document.activeElement || !/^I?FRAME$/.test(document.activeElement.tagName))) {
    sendResponse(getSelection().toString());
  }
});

PS Продвинутым решением будет запуск сценария содержимого по требованию (с использованием chrome .tabs.executeScript в фоновом режиме. js прослушиватель onCommand), чтобы вы могли можно удалить раздел content_scripts из манифеста. json и использовать вместо него разрешение activeTab .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...