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, время: 23:44. |