2013-04-18 2 views
1

Chrome 확장 프로그램을 만드는 법을 배우고 있으며 공식 가이드 here의 지침 중 하나를 따르려고합니다. 내가 달성하기 위해 노력하고 무엇window.postMessage에 대한 DOM 예외 12

은 다음과 같습니다

  1. background.js는 타겟으로 URL의 페이지 동작을 보여줍니다.
  2. Page action은 클릭 할 때 스크립트를 실행합니다.
  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')); 

이제 삽입 된 스크립트가 확장 프로그램에 다시 통신 할 수있게하려고합니다.
내가 찾는 것은 문서에 설명되어있는 것 같습니다. 내가 콘솔 오류 "DOM 예외 12"이 표시 window.postMessage 할 때

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

문제이다.


편집 : 샘플 코드를 실행하는 첫 번째 문제가 해결되었습니다.
나는 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

contentscript.js 예에서 port.postMessagewindow.postMessage을 혼동하지 마십시오.

port.postMessage은 확장 프로그램 내에서 메시지를 전달하기위한 Chrome 확장 프로그램 용 API이며 window.postMessage은 프레임과 통신하는 데 사용되는 JavaScript 메소드입니다. window.postMessage의 두 번째 인수는 필수이며 대상에서 메시지를받을 수 있는지 여부를 확인하는 데 사용됩니다.

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

당신을 감사, 즉 정확히했다 : 당신이 자체 페이지에서 메시지를 보내는 때문에 경우

는 와일드 카드를 사용하는 것은, 아마 충분합니다! 샘플에 더주의를 기울여야했습니다. 질문이 하나 더 있으면 괜찮습니다. 계속해서 같은 코드를 사용하면'port.postMessage' 부분이 작동하지 않습니다. 내 리스너 스크립트가 실행되고 데이터가 존재하는지 확인하기 위해 로그하지만 현재 포트가 닫혔다 고합니다. –

+0

그 중 하나가 죽었습니다. 코드를 보지 않고 정확한 이유를 알 수 없습니다. –

+0

원래 게시물에 몇 가지 추가 정보가 업데이트되어 도움이되는 경우. –

관련 문제