3

Я пытаюсь применить следующий поток «contentScript.js»:Простой передачи сообщений между «background.js» к

связывания для ключей в background.js, при нажатии им: Отправка сообщения от background.js -> contentScript.js Sending ответ от contentScript.js -> background.js

Вот это menifit.json определения:

"background" : { 

    "scripts" : ["background.js"], 
    "persistent" : true 
    }, 
    "content_scripts": [ 
    { 
     "matches": ["*://*/*"],  
     "js": ["contentScript.js"] 
    } 
    ], 

Связующий часть работает отлично.

Вот код в background.js:

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

Вот код в contentScript.js:

chrome.runtime.onMessage.addListener(HandleMessage); 

function HandleMessage(request, sender, sendResponse) 
{ 
    if (request.greeting == "hello") 
    { 
     sendResponse({farewell: "goodbye"});   
    } 
}; 

Это ошибка, что я получаю:

Error in event handler for (unknown): Cannot read property 'farewell' of undefined 
Stack trace: TypeError: Cannot read property 'farewell' of undefined 
    at chrome-extension://fejkdlpdejnjkmaeadiclinbijnjoeei/background.js:64:26 
    at disconnectListener (extensions::messaging:338:9) 
    at Function.target.(anonymous function) (extensions::SafeBuiltins:19:14) 
    at EventImpl.dispatchToListener (extensions::event_bindings:397:22) 
    at Function.target.(anonymous function) (extensions::SafeBuiltins:19:14) 
    at Event.publicClass.(anonymous function) [as dispatchToListener] (extensions::utils:93:26) 
    at EventImpl.dispatch_ (extensions::event_bindings:379:35) 
    at EventImpl.dispatch (extensions::event_bindings:403:17) 
    at Function.target.(anonymous function) (extensions::SafeBuiltins:19:14) 
    at Event.publicClass.(anonymous function) [as dispatch] (extensions::utils:93:26) 

В случай изменения

console.log(response.farewell); 

в

console.log("OK"); 

он работает нормально, но таким образом я не могу получить значения из contentScript.js

Что я должен изменить?

+0

Вопрос должен быть отредактирован, чтобы указать, что речь идет о расширении Chrome, а не о приложении Chrome. Я удалил тэг google-chrome-app. –

ответ

5

Вы пытаетесь отправить сообщения от фона страницы в сценарий содержимого. Из official documentation, вы используете этот код для отправки сообщений от фона страницы:

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

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

Error in event handler for (unknown): Cannot read property 'farewell' of undefined 
Stack trace: TypeError: Cannot read property 'farewell' of undefined 

То, что вы хотите достичь посылают запрос от расширения (фон страницы) в сценарий контента, который требует указать вкладку, в которой скрипт содержания :

chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
    chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"}, function(response) { 
    console.log(response.farewell); 
    }); 
}); 

Надеюсь, это прояснит ситуацию и поможет вам начать работу в правильном направлении.

+0

такой же предмет, получение такой же ошибка. Можете ли вы указать, что вы подразумеваете под «, для чего вам нужно указать вкладку, в которой присутствует скрипт контента:«? contentScript.js находится только на моем компьютере, не является частью какой-либо веб-страницы. – USer22999299

+2

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

+2

Хорошо, теперь это работает. Проблема заключалась в том, что веб-страница была уже открыта, ей пришлось закрыть ее и снова открыть. – USer22999299

1

Есть 3 способа отправки сообщения в Chrome Extension, вы можете обратиться к Message Passing.

Обычно используют одноразовый запрос, например:

В background.js

chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
    chrome.tabs.sendMessage(tabs[0].id, {message: "hello"}, function(response) { 
    console.log(response); 
    }); 
}); 

В contentscripts.js

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { 
    console.log(request.message); 
    if (request.message == "hello") { 
    sendResponse({farewell: "goodbye"}); 
    } 
}); 
+0

, делая это, я получаю «undefined» для журнала консоли в части ответа. – USer22999299

+0

@ USer22999299 Вы должны отправитьResponse в contentscript, используя третий параметр функции прослушивателя, вы можете попробовать с помощью вышеуказанной демонстрации – kenticny

+0

Хотя правильно, этот ответ не объясняет, что было не так. Таким образом, это не очень полезно. Сравните с принятым ответом. – Xan