chrome.tabs.sendMessage
Подскажите пожалуйста, как мне отправить сообщение из 2го в 1й скрипт?
Смотрел вот тут описание, но без примера я ничего не понимаю... Есть 2 скрипта, 1й(background.js) висит в приложении постоянно, 2й(maps.js) подключается только к определённым страницам. В background.js chrome.runtime.onMessage.addListener // Отлов сообщений ( function(request, sender, sendResponse) { switch(request.id) // Это типа идентификатор сообщений { case 2: // GET запрос { GetHttpRequest(request.href, {rid: request.rid}) break } } } ) Это дополнительная информация из background.js function GetHttpRequest(href, arg) // Запрос { var xhr = new XMLHttpRequest() xhr.withCredentials = true xhr.onreadystatechange = function(e) { e.data = arg ProcessRequestChange.apply(this, arguments) } xhr.open('GET', href, true) xhr.send(null) } function ProcessRequestChange(e) // Обработчик запроса { var xhr = this if(xhr.readyState != 4) return if(xhr.status == 200) { var html = xhr.responseText switch(e.data.rid) // Это типа идентификатор запроса { case 3: // Покопаться в ответе на 'http://www.site.ru/bla-bla.php' { // Некий код который записывает необходимую информацию в str убрал для экономии var str = 'ответ' // Пусть будет это ответом chrome.tabs.query // Вроде это какое - то событие открытия(или получения) вкладок? ( {active: true, currentWindow: true}, // Х.з function(tabs) { chrome.tabs.sendMessage // Это то, что отправляет ответное сообщение ( tabs[0].id, // Х.з, наверное идентификатор вкладки, куда отправить? {greeting: "hello"}, // Это я так понял и есть ответ? function(response) // А это вообще не нужно вроде... { console.log(response.farewell); } ) } ) break } } } } В maps.js: chrome.runtime.sendMessage // Отправить сообщение в background.js ( {id: 2, href: 'http://www.site.ru/bla-bla.php', rid: 3}, // Сделать запрос на адрес function(response) // Функция ответа не может быть вызвана, т.к. ответ не отправляется из background.js { document.querySelector('#fades').style.display = 'inline' document.querySelector('#guild').style.display = 'inline' document.querySelector('#mercenary').innerHTML = 'jhg' } ) Так вот, вся проблема заключается в том, что в background.js сначала нужно послать запрос, получить ответ, покопаться в ответе, и только потом отправить ответ на сообщение в maps.js. |
*!* - GetHttpRequest(request.href, {rid: request.rid}) */!* + GetHttpRequest(request.href, {rid: request.rid, response: sendResponse}); *!* - chrome.tabs.query // Вроде это какое - то событие открытия(или получения) вкладок? ( {active: true, currentWindow: true}, // Х.з function(tabs) { chrome.tabs.sendMessage // Это то, что отправляет ответное сообщение ( tabs[0].id, // Х.з, наверное идентификатор вкладки, куда отправить? {greeting: "hello"}, // Это я так понял и есть ответ? function(response) // А это вообще не нужно вроде... { console.log(response.farewell); } ) } ) */!* + e.data.response(str); |
Не получается получить текст ответа.
Сделал так, только передал строку с идентификатором: В background.js в обработчике запроса: e.data.response({value: str}) В maps.js: chrome.runtime.sendMessage ( {id: 6, href: 'http://www.site.ru/bla-bla.php', rid: 3}, function(response) { alert('ответ пришел\n' + response.value) } ) Что - то ругается: Цитата:
|
chrome.runtime.onMessage.addListener // Отлов сообщений ( function(request, sender, sendResponse) { switch(request.id) // Это типа идентификатор сообщений { case 2: // GET запрос { GetHttpRequest(request.href, {rid: request.rid, response: sendResponse}) break } } *!*return true;*/!* } ) Цитата:
|
Спасибо ))
Всё работает. |
Блин, только что всё работало, и вдруг стало выдавать ошибку в background.js (e.data.response({value: str})):
Цитата:
background.js: function GetHttpRequest(href, arg) { var xhr = new XMLHttpRequest() xhr.withCredentials = true xhr.onreadystatechange = function(e) { e.data = arg ProcessRequestChange.apply(this, arguments) } xhr.open('GET', href, true) xhr.send(null) } function ProcessRequestChange(e) { var xhr = this if(xhr.readyState != 4) return if(xhr.status == 200) { var html = xhr.responseText switch(e.data.rid) { /*-------*/ case 3: // Гильдия наёмников { if(html.indexOf('возвращайся с победой') > -1 || (html.indexOf('у нас нет сейчас заданий') > -1 && html.indexOf('Вы получаете') < 0)) break var s = html.indexOf('align=left rowspan=2>') + 21 var e = html.indexOf('</td>', s) var str = html.substring(s, e) e.data.response({value: str}) break } /*-------*/ case 0: break // Без обработки } } } chrome.runtime.onMessage.addListener ( function(request, sender, sendResponse) { switch(request.id) { /*-------*/ case 6: // Гн { GetHttpRequest(request.href, {rid: request.rid, response: sendResponse}) return true break } /*-------*/ } return false } ) maps.js: chrome.runtime.sendMessage ( {id: 6, href: 'http://www.site.ru/bla-bla.php', rid: 3}, function(response) { //alert('ответ пришел\n' + response.value) document.querySelector('#fades').style.display = 'inline' document.querySelector('#guild').style.display = 'inline' document.querySelector('#mercenary').innerHTML = response.value } ) |
А вот так всё работает:
//var s = html.indexOf('align=left rowspan=2>') + 21 //var e = html.indexOf('</td>', s) var str = 'errfsdf'//html.substring(s, e) |
Вот эта строчка:
var e = html.indexOf('</td>', s)тут вы переназначаете переменную "e", соответственно "e.data" уже ничего не содержит.) |
От блин, невнимательность, спасибо ))
|
Вложений: 1
Блин, задолбала уже эта ошибка:
Цитата:
Просто я сделал одну фигню всплывающим окном(вставил часть другой страницы), через localStorage убрал лишние запросы на сайт... Вложение 3343 Вот это всё равно вызывается: chrome.runtime.sendMessage ( {id: 6, href: 'http://www.site.ru/bla-bla.php', rid: 3}, function(response) { alert('ответ') document.querySelector('#fades').style.display = 'inline' document.querySelector('#guild').style.display = 'inline' document.querySelector('#mercenary').innerHTML = response.value } ) А это обработчик(ну или прослушиватель, как его там правильно) этого сообщения. Тут всё нормально с return'ами break'ами? Просто я не привык к этой дикости в свитче... chrome.runtime.onMessage.addListener ( function(request, sender, sendResponse) { switch(request.id) { case 4: // Получить значение localStorage { var sid = request.sid sendResponse({sid: sid, value: localStorage[sid]}) break } case 6: // Обработчик { var l = localStorage['mercenary_guild'] if(l != undefined && l > parseInt(+ new Date() / 1000)) break alert('запрос') GetHttpRequest(request.href, {rid: request.rid, response: sendResponse}) return true break } } return false } ) Когда срабатывает это условие: if(l != undefined && l > parseInt(+ new Date() / 1000)) break Появляется ошибка. Я понял, что нет параметра value в ответе(он вообще пустой). Не понятно какого хрена он вообще приходит, ведь там нет sendResponse()... Если всё так и должно работать, можно хотя бы как - то проверить, что ответ пустой? |
Часовой пояс GMT +3, время: 10:24. |