2013-04-18 2 views
1

Я учусь создавать расширения Chrome, и я стараюсь следовать одной из инструкций в официальном руководстве here.DOM Exception 12 для window.postMessage

То, что я пытаюсь сделать это:

  1. background.js показывает действие страницы для целенаправленных URL.
  2. Действие страницы выполняет скрипт при нажатии.
  3. Выполненный скрипт вводит javascript на странице.

До сих пор так хорошо! Я использую следующий скрипт для ввода на страницу.

var injectJS = function(url, cb) { 
    var h = document.getElementsByTagName('head')[0], 
     s = document.createElement('script'); 
    s.type = 'text/javascript'; 
    s.src = url; 
    if (cb) 
     s.onload = cb; 
    h.appendChild(s); 
}; 
injectJS(chrome.extension.getURL('script/do_something.js')); 

Теперь я хочу, чтобы инъецируемый скрипт мог связываться с расширением.
Кажется, что я ищу то, что описано в документации.

https://developer.chrome.com/extensions/content_scripts.html#host-page-communication

Проблема заключается в том, когда я пытаюсь сделать window.postMessage консоль показывает ошибка «DOM Exception 12».


Редактировать: Первая проблема с кодом примера была решена.
Другая ошибка я получаю, от smae код из port.postMessage:

Uncaught Error: Attempting to use a disconnected port object

Вот код:

var port = chrome.runtime.connect(); 

// Respond to messages from the injected script to collect results 
window.addEventListener('message', function(e) { 
    if (e.source != window) 
     return; 
    if (e.data.type && (e.data.type == 'FROM_PAGE')) { 
     console.log('Content script received: %s', e.data.text); 
     port.postMessage(e.data.text); 
    } 
}, false); 

В основном я пытаюсь сохраняться некоторые данные временно, пока страничке перезагружается , Скрипт/сценарий содержимого собирает данные, а затем загружает следующую страницу. Фоновый сценарий должен содержать результаты, пока не будут загружены все страницы.

ответ

5

Не путайте port.postMessage в примере contentscript.js с помощью window.postMessage.

port.postMessage - это API-интерфейс для расширения Chrome, предназначенный для передачи сообщений внутри расширения, а window.postMessage - это метод JavaScript, используемый для связи с фреймами. Второй аргумент для window.postMessage необходим и используется для проверки того, разрешено ли задаче получать сообщение или нет.

В вашем случае, используя подстановочные знаки, вероятно, достаточно, потому что вы посылаете сообщение от страницы к себе:

window.postMessage({ type: "FROM_PAGE", text: "Hello from the webpage!" }, "*"); 
                      ^^^
+0

Спасибо, это был именно он! Я должен был уделять более пристальное внимание образцу. Еще один вопрос, если вы не возражаете. Продолжая работу с тем же кодом, часть 'port.postMessage' теперь не работает. Сценарий моего слушателя запускается, и я регистрирую данные, чтобы убедиться, что он существует, но теперь он говорит, что порт закрыт. –

+0

Затем один из концов погиб. Не могу точно указать причину, не видя свой код. –

+0

Я обновил исходное сообщение с некоторыми дополнительными деталями, если это поможет. –

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