Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   chrome.tabs.sendMessage (https://javascript.ru/forum/misc/65784-chrome-tabs-sendmessage.html)

Ostic 09.11.2016 21:18

Цитата:

Сообщение от Артист (Сообщение 434583)
Когда срабатывает это условие:
if(l != undefined && l > parseInt(+ new Date() / 1000)) break

а оно вообще должно сработать?
проверить на тип undefined лучше
typeof L === "undefined"
или
!!(L)

еще лучше проверять на конкретный тип
typeof L === "number"

второе условие вообще безобразно - чем вам так объект Date не понравился, что вы его на 1000 делите? ))
если по-вашему, то
if ( !(typeof === "undefined") &&  L > Math.round(Date.now()/1000)  )

Ostic 09.11.2016 21:23

Цитата:

Если у chrome.runtime.sendMessage назначена функция(в которую ответ приходит), то она всегда что ли будет вызываться?
да, называется функция обратного вызова
не назначайте ее, если не надо или function(){} укажите

Ostic 09.11.2016 21:29

Цитата:

Есть 2 скрипта, 1й(background.js) висит в приложении постоянно, 2й(maps.js) подключается только к определённым страницам
background.js не рекомендовано, также как и "висит в приложении постоянно". кстати, в каком приложении то, о чем речь?
maps.js каким образом подключается к страницам?

Aetae 09.11.2016 21:30

Цитата:

Сообщение от Артист (Сообщение 434583)
Не понятно какого хрена он вообще приходит, ведь там нет

Всё та же цитата, что я уже приводил, только теперь другая её часть:
Цитата:

Note: The sendResponse callback is only valid if used synchronously, or if the event handler returns true to indicate that it will respond asynchronously. The sendMessage function's callback will be invoked automatically if no handlers return true or if the sendResponse callback is garbage-collected.
Может стоит всё же читать документацию?

Ostic 09.11.2016 21:45

это eventPage.js (по-вашему background)
list = ['google.ru','mail.ru','yandex.ru'];
//chrome.webNavigation.onDOMContentLoaded.addListener(onNavigate);
chrome.webNavigation.onCompleted.addListener(onNavigate);
function onNavigate(details){
	var len = list.length;
	var tabID = details.id;
	var tabUrl = details.url.replace(/^https?\:\/\/(www\.)?/, '');
	for (var i=0; i < len; i++){
		if( tabUrl.startsWith(list[i]) ){
			if (details.frameId != 0) break; /*иначе, например, bing "съедает" две загрузки, те msg будет показан 2*/
			var siteName = list[i];
			var msg = list[i];
			chrome.tabs.insertCSS(tabID, {file:"css/content_style.css"});
				chrome.tabs.executeScript(tabID, {file: "js/content_script.js"});
				tabConnect({msg_:msg, name_:siteName});
						
	};
};
function tabConnect(msg) {
	chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
		var port = chrome.tabs.connect(tabs[0].id);
		port.postMessage(msg);
		port.onMessage.addListener(function getResp(response){
			if(response.close_){ 
				sessionStorage.setItem(response.name_, 3);
			};
		});
	});
};

а это в том самом скрипте, который вживляется в указанные в массиве сайты нексолькими строками выше, так называемый content_script.js
var	siteName;
var portName;
var div = document.createElement('div');

chrome.runtime.onConnect.addListener(function(port) {
		portName = port;
		port.onMessage.addListener(function(msg) {
			if(msg.msg_) showMessage(msg.msg_);
			if(msg.name_) siteName = msg.name_;
		});
});
function showMessage(msg){
		div.className = "injection";
		div.innerHTML = '<p class="inj_message">' + msg + '</p>';
		div.addEventListener('click', clickHandler); 
		document.body.appendChild(div);
};	
function clickHandler(){
	document.body.removeChild(div);
	portName.postMessage({name_:siteName, close_:true});
};

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

Артист 09.11.2016 23:30

Цитата:

Сообщение от Ostic (Сообщение 434590)
а оно вообще должно сработать?

Работает, я же проверял )

Цитата:

Сообщение от Ostic (Сообщение 434590)
проверить на тип undefined лучше
typeof L === "undefined"
или
!!(L)

еще лучше проверять на конкретный тип
typeof L === "number"

второе условие вообще безобразно - чем вам так объект Date не понравился, что вы его на 1000 делите? ))
если по-вашему, то
if ( !(typeof === "undefined") &&  L > Math.round(Date.now()/1000)  )

Учту, спасибо.
Math.round(Date.now()/1000)
Я уже поменял, просто писал это до того как посмотрел другую тему.

Цитата:

Сообщение от Ostic (Сообщение 434592)
background.js не рекомендовано, также как и "висит в приложении постоянно". кстати, в каком приложении то, о чем речь?
maps.js каким образом подключается к страницам?

Ну вроде не всегда висит, оно освобождается из памяти, чего - то там, и используется только при вызове чего либо...
Вешается на "невидимую" вкладку.
Он нужен, т.к. приложение - бот для онлайн игры.
Он работает даже когда нет открытых вкладок с самой игрой.

maps.js подключается в манифесте через указанный адрес.

Цитата:

Сообщение от Aetae (Сообщение 434593)
Всё та же цитата, что я уже приводил, только теперь другая её часть: Может стоит всё же читать документацию?

Да я читал раз 10.
Просто мало того, что там всё по английски(гугл перевод конченный), так ещё терминами непонятными сыпят.
Ничего не понятно, я не могу ничего там найти, из того, что мне нужно...

Спасибо, понял теперь в чём дело. ))

Цитата:

Сообщение от Ostic (Сообщение 434596)
если надо длительное общение поддерживать, то лучше создавать именованный канал и не забывать его закрывать, а то скрипты так и будут висеть.

Да я даже не лезу в именованный :D
Ну и в принципе мне обычного хватит вполне.
Т.к. страницы открываются/закрываются...

Суть вот в чём, открываю страницу сайта("карта", к ней и подгружается maps.js), получаю 3 ячейки из фонового скрипта(background.js) с настройками.
Далее несколько проверок(есть ли задания гильдии наёмников, они либо висят доступные либо сданы и нужно подождать минут 20 до следующего) - запрос на другую страницу(самой гильдии, там пишут доступно или нет и сколько ждать), проверка, вывод посередине страницы части страницы из запроса.

Вот я сейчас на этапе "оптимизации" этого не единственного функционала приложения.

На странице карты можно узнать взято или нет задание, а остальное только запросом.
Чтобы не делать каждый раз запрос(при обновлении карты, а она постоянно в работе), я создал ячейку в памяти и храню в ней время когда будет доступно задание(1й запрос всё - таки делается, чтобы узнать это время).
Ну и вот, только на клиентской стороне всё считается...

Артист 09.11.2016 23:34

Во, всё заработало:
chrome.runtime.onMessage.addListener
(
	function(request, sender, sendResponse)
	{
		switch(request.id)
		{
			case 4: // Получить значение localStorage
			{
				var sid = request.sid
				sendResponse({sid: sid, value: localStorage[sid]})
				return false
				break
			}
			case 6: // Гн 
			{
				var l = localStorage['mercenary_guild']

				if(l != undefined && l > Math.round(Date.now() / 1000)) break

				alert('запрос')
				GetHttpRequest(request.href, {rid: request.rid, response: sendResponse})
				break
			}
		}
		return true
	}
)

Артист 12.11.2016 11:38

А если нужно несколько раз вернуть ответ(асинхронно), то никак не получится?
Т.е. я 1 раз посылаю сообщение в другой скрипт, а тот что - то там делает, и отправляет ответы, при необходимости...

Цитата:

Примечание: Если несколько страниц прослушивание событий OnMessage, только первый вызвать SendResponse () для конкретного события удастся отправить ответ. Все остальные ответы на это событие будет игнорироваться.

Долгоживущее соединение не поможет?

Aetae 12.11.2016 17:39

Артист, таким образом - да.
Для более сложного "постоянного" общения есть connect.

Артист 12.11.2016 21:52

Спасибо )


Часовой пояс GMT +3, время: 13:28.