2013-03-30 2 views
13

콘텐츠 스크립트와 배경 스크립트가있는 Chrome 플러그인을 작성 중이며 둘을 통신하려고합니다. 내 콘텐츠 스크립트에서 chrome.runtime.sendMessage가 예상대로 작동하지 않습니다.

, 내가
chrome.runtime.sendMessage({greeting: "hello"}, function(response) { 
     console.log(response.farewell); 
}); 

내 배경 스크립트에서

를하고있는 중이 야,이 같은
chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) { 
     console.log(sender.tab ? 
      "from a content script:" + sender.tab.url : 
      "from the extension"); 
     if (request.greeting == "hello") 
      sendResponse({farewell: "goodbye"}); 
    } 
); 

내 매니페스트 외모

을하고있는 중이 야 :

{ 
    "manifest_version": 2, 
    "name": "Tesing Phase", 
    "version": "1.0", 
    "background": { 
     "persistent": false, 
     "scripts": ["bgscript.js"] 
    }, 
    "content_scripts": [{ 
     "js": ["contentscript.js"], 
     "all_frames": true, 
     "run_at" : "document_start", 
     "matches": ["*://*/*"] 
    }], 
    "web_accessible_resources": ["script.js"] 
} 

때 I을 플러그인을 실행하면 다음 오류가 발생합니다.

Uncaught TypeError: Object #<Object> has no method 'sendMessage' 

chrome.runtime 로깅을 시도했지만 아무런 방법도 없었습니다 sendMessage. 저는 우분투에서 Chromium의 버전 25.0을 사용하고 있습니다. 나는 sendRequest을 사용해 보았지만 감가 상각되었고 sendMessage을 사용해야한다고했습니다.

누구나 내가 여기에없는 것을 지적 할 수 있습니까? 이 작업에 필요한 권한이 있습니까? 25 chrome.extension.sendMessage을 사용 - 당신은 크롬 20와 호환되는 확장을 작성하려는 경우

답변

34

chrome.runtime.sendMessage/onMessage (예 : connect 같은 및 기타 관련 이벤트/방법)

크롬 (26)에 도입되었다.

최적의 호환성을 얻는 방법은 직접 chrome.runtime 방법을 정의하는 것입니다. 당신은 수정과 불편하면

// Bind event: 
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { 
    // Do something 
}); 

// Send message: 
chrome.runtime.sendMessage({greeting: 'hello'}); 

:

if (!chrome.runtime) { 
    // Chrome 20-21 
    chrome.runtime = chrome.extension; 
} else if(!chrome.runtime.onMessage) { 
    // Chrome 22-25 
    chrome.runtime.onMessage = chrome.extension.onMessage; 
    chrome.runtime.sendMessage = chrome.extension.sendMessage; 
    chrome.runtime.onConnect = chrome.extension.onConnect; 
    chrome.runtime.connect = chrome.extension.connect; 
} 

그런 다음 당신은 최신 API 형식을 사용할 수 있습니다 : 예를 들어, 코드 (배경/콘텐츠 스크립트)의 나머지 앞에 다음 코드를 실행 lot.It가 chrome.extension.I 얇은 사용했다

var runtimeOrExtension = chrome.runtime && chrome.runtime.sendMessage ? 
         'runtime' : 'extension'; 

// Bind event: 
chrome[runtimeOrExtension].onMessage.addListener(
    function(message, sender, sendResponse) { 
    // Do something 
}); 

// Send message: 
chrome[runtimeOrExtension].sendMessage({greeting: 'hello'}); 
+2

감사하십시오 chrome.runtime 개체에 대한 방법은 다음과 같은 방법 대신을 사용할 수 있습니다 k google chrome dev 페이지에이 정보가 없습니다. –

+0

이 방법은 훌륭하게 보이지만이 방법론은 여전히 ​​최대 31 개의 크롬 버전에 유효합니까? 또는 적응해야 할 것인가? 그리고 오래된 deprecated 메시지 전달 메소드가 Chrome – user280109

+0

@ user280109의 최신 버전에서 완전히 삭제되었는지는 알 수 없습니다. 여전히 유효합니다. 호환성 레이어없이 'chrome.runtime.'을 사용할 수도 있지만, Google의 자동 업데이트 프로그램 덕분에 더 이상 Chrome 25를 사용하지 않습니다. –

관련 문제