0

У меня есть метод во время выполнения Javascript для вкладки, которую я хочу запустить из сценария содержимого моего расширения. При значении лица это вызывает передачу сообщений между контекстами, но я не могу найти документацию о сообщениях CS-to-tab, только с вкладками на CS или CS-в-фон. По сути, я хочу перевернуть раздел ссылки на контентные скрипты Communication with the embedding page.Отправка сообщений на страницу javascript из сценария содержимого

До сих пор, я прилагаю слушатель события к табов window путем введения небольшого яваскрипта полезной нагрузки (это вызовет метод вкладок на правильный тип сообщения):

listenerScript = document.createElement('script'); 
listenerScript.textContent = "window.addEventListener('message',function(ev){console.log('New event: ' + ev);},false);console.log('installed');"; 
(document.head||document.documentElement).appendChild(listenerScript); 
listenerScript.remove(); 

Этот слушатель зарегистрирован, однако я не могу понять, как вызвать его из моего сценария контента. window.postMessage() в скрипте содержимого ничего не делает, и в документации только об использовании chrome.runtime для создания порта, который предназначен для фоновых скриптов.

Как передать сообщения, как можно проще, из сценария контента на вкладку?

+0

В документации, которую вы указали, отображается 'window.postMessage ({type:" FROM_PAGE ", текст:" Hello from the webpage! "}," * ");' И это работает для меня. Только не забудьте '' * "'. – wOxxOm

+0

Из сценария содержания? Я попробовал этот точный код, который вы цитировали с помощью фрагмента выше, введенного на страницу, и ничего не записывает. Помните, что я пытаюсь перейти на страницу CS-> page, а не 'page-> CS'. – RedBassett

+0

Вот мое тестовое расширение: https://github.com/redbassett/extension-message-test Я вижу сообщения журнала для инъецируемого скрипта и отправляемого сообщения, но прослушиватель событий никогда не запускается. – RedBassett

ответ

2

Код корректен, поэтому, учитывая, что вы видите installed в консоли, только объяснения:

  1. страница была перенаправлена ​​и весь DOM и его слушатели были уничтожены.
  2. страница была подделать window.addEventListener или прикрепить свой собственный 'message' слушателя и отменяет событие, прежде чем ваш слушатель видит его (например, с помощью event.stopPropagation() и т.д.)

    В этом случае вам нужно объявить сценарий контента для запуска before the page starts loading и используйте прослушиватель, который захватывает событие до того, как он пузырится вниз по цепочке DOM (useCapture, третий параметр addEventListener, должен быть true).

    manifest.json:

    "content_scripts": [{ 
        "matches": ["<all_urls>"], 
        "js": ["content.js"], 
        "run_at": "document_start" 
    }], 
    

    content.js:

    // this code runs before page starts loading 
    var injected = document.documentElement.appendChild(document.createElement('script')); 
    injected.text = '(' + function() { 
        window.addEventListener('message', function(ev) { 
         console.log('New event:', ev); 
        }, true); // useCapture: true 
        console.log('installed'); 
    } + ')()'; 
    injected.remove(); 
    
    document.addEventListener('DOMContentLoaded', function() { 
        // this code will run when the DOM is ready 
        window.postMessage({ foo: 'bar', text: "Hello from content script!" }, "*"); 
    }); 
    

    Примечание мы добавим сценарий documentElement, потому что в document_start там часто нет head. См. Также: other methods of injecting a DOM script.

+0

Это был артефакт копирования кода из другого теста. Хороший улов, но он все еще не устраняет проблему. Вытолкнули правильную версию с сообщением «сообщение» на репо, все еще ничего не записывая в ответ на сообщение. – RedBassett

+1

Использование '' message'' код работает. Как это должно. Убедитесь, что страница не перенаправлена ​​на новый URL. – wOxxOm

+0

Редирект может быть проблемой! Я тестировал это на другом домене хоста, и сообщение показывает.Казалось бы, инъецируемый скрипт фактически отключается. Опубликуйте как новый ответ, чтобы я мог его принять? – RedBassett

 Смежные вопросы

  • Нет связанных вопросов^_^