확장 배경 또는 팝업에서 콘텐츠 스크립트로의 sendMessage가 작동하지 않습니다.


88

나는 질문이 여러 가지 방법으로 반복적으로 요청되었다는 것을 알고 있지만 모든 답변을 검토하려고 노력했지만 (누구도 그리워하지 않았 으면 좋겠다) 아무도 나를 위해 일하지 않았습니다.

내 확장 코드는 다음과 같습니다.

명백한:

{
"name": "test",
"version": "1.1",
"background": 
{ 
    "scripts": ["contextMenus.js"]
},

"permissions": ["tabs", "<all_urls>", "contextMenus"],

"content_scripts" : [
    {
        "matches" : [ "http://*/*" ],
        "js": ["jquery-1.8.3.js", "jquery-ui.js"],
        "css": [ "jquery-ui.css" ],
        "js": ["openDialog.js"]
    }
],

"manifest_version": 2
}

contextMenus.js

function onClickHandler(info, tab) {
    if (info.menuItemId == "line1"){

      alert("You have selected: " + info.selectionText);

      chrome.extension.sendMessage({action:'open_dialog_box'}, function(){});

      alert("Req sent?");

    }
}

chrome.contextMenus.onClicked.addListener(onClickHandler);

chrome.runtime.onInstalled.addListener(function() {

  chrome.contextMenus.create({"id": "line1", "type": "normal", "title": "I'm line 1",     "contexts":["selection"]});

});

openDialog.js

chrome.extension.onMessage.addListener(function(msg, sender, sendResponse) {

  if (msg.action == 'open_dialog_box') {
    alert("Message recieved!");
  }
});

백그라운드 페이지의 두 가지 경고는 작동하지만 content_script 중 하나는 작동하지 않습니다.

콘솔 로그 메시지 : 포트 오류 : 연결을 설정할 수 없습니다. 수신단이 없습니다.

내 잘못은 어디에 있습니까?


을 (가 chrome.tabs.sendMessage()) 아닌 콘텐츠 스크립트에 메시지를 보내는 데 사용해야 합니다 chrome.extension.sendMessage().
apsillers

답변:


144

백그라운드 페이지에서

chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
    chrome.tabs.sendMessage(tabs[0].id, {action: "open_dialog_box"}, function(response) {});  
});

chrome.extension.sendMessage현재 사용 하는 대신 사용 합니다.

chrome.tabs반면, 변형, 컨텐츠 스크립트에 메시지를 보내는 chrome.extension기능은 다른 모든 확장 구성 요소에 메시지를 전송합니다.


7
감사합니다. chrome.tabs.sendMessage 보낼 탭을 지정해야 한다는 점을 제외하면 맞습니다 . 따라서 솔루션은 다음과 같이 변경됩니다.chrome.tabs.query({active: true}, function(tabs){ chrome.tabs.sendMessage(tab.id, {action: "open_dialog_box"}, function(response) { }); });
Subway

1
이 답변이 도움이되었습니다. 이 유용한 답변에 감사드립니다.
Touhid

13
content-script.js에서 수신하려면 무엇을 써야합니까?
Kushal Jain 2017-06-30

5
@KushalJain 방금 이것을 알아 냈습니다. 콘텐츠 스크립트 JS 파일에서이 같은 이벤트 리스너를 추가 할 수 있습니다 : chrome.runtime.onMessage.addListener( (message, sender, sendResponse) => { /* Code Here */ } ); message포함하는 매개 변수입니다 { action: "open_dialog_box" }보내거나 뭐든. senderChrome 확장 프로그램의 ID를 포함하는 개체입니다. 메시지가 처리되면 호출하기 위해 전달하는 함수 또는 sendResponse포함하는 매개 변수 function(response) {}입니다.
jsea

6
이 솔루션은 저에게 효과적이지 않았습니다. 나는 developer.chrome.com/extensions/messaging의 모든 코드를 정확히 복사 한 문서를 따르고있다. 이것은 매우 간단한 예이지만 제대로 할 수는 없다. 연결을 설정할 수 없습니다. 수신단이 없습니다. 어떤 아이디어
umsateesh

4

@apsillers가 정확합니다. 또한 콘텐츠 스크립트 리스너에서 true를 반환하는 것을 잊지 마십시오. 그렇지 않으면 너무 일찍 닫힐 수 있습니다.

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
    console.log(message)
    return true
});

이것은 나를 위해 그것을 고쳤습니다 – 나는 응답을 얻지 못했지만 추가 return true하면 작동했습니다.
rupertonline

0

다음은 콘텐츠 스크립트 파일에 메시지를 보내는 백그라운드 스크립트의 예입니다.

background.js

chrome.tabs.sendMessage(tabs[0].id,"your message"); 

content-script / content.js

chrome.runtime.onMessage.addListener(function (response, sendResponse) {
          console.log(response);
});

0

내 유스 케이스는 웹 페이지에서 백그라운드 스크립트로 메시지를 보내야했습니다. 나는 chrome.runtime.onMessageExternal이 메시지를 잡곤했다.

이 리스너 내부에서 기본적으로 내 콘텐츠 스크립트로 메시지를 전달하여 작업을 수행 할 수 있었지만 콘텐츠 스크립트 onMessage 리스너가 메시지를 포착하지 못하는 이유를 알 수 없었습니다.

웹 페이지에서 메시지를 보내기 전에 1 초 동안 기다린 것으로 나타났습니다 (기본적으로로드 할 때 수행했습니다). 내 콘텐츠 스크립트를 치는 메시지를 볼 수있었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.