Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 09.11.2016, 21:18
Аспирант
Отправить личное сообщение для Ostic Посмотреть профиль Найти все сообщения от Ostic
 
Регистрация: 31.08.2016
Сообщений: 49

Сообщение от Артист Посмотреть сообщение
Когда срабатывает это условие:
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)  )
Ответить с цитированием
  #12 (permalink)  
Старый 09.11.2016, 21:23
Аспирант
Отправить личное сообщение для Ostic Посмотреть профиль Найти все сообщения от Ostic
 
Регистрация: 31.08.2016
Сообщений: 49

Цитата:
Если у chrome.runtime.sendMessage назначена функция(в которую ответ приходит), то она всегда что ли будет вызываться?
да, называется функция обратного вызова
не назначайте ее, если не надо или function(){} укажите
Ответить с цитированием
  #13 (permalink)  
Старый 09.11.2016, 21:29
Аспирант
Отправить личное сообщение для Ostic Посмотреть профиль Найти все сообщения от Ostic
 
Регистрация: 31.08.2016
Сообщений: 49

Цитата:
Есть 2 скрипта, 1й(background.js) висит в приложении постоянно, 2й(maps.js) подключается только к определённым страницам
background.js не рекомендовано, также как и "висит в приложении постоянно". кстати, в каком приложении то, о чем речь?
maps.js каким образом подключается к страницам?
Ответить с цитированием
  #14 (permalink)  
Старый 09.11.2016, 21:30
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

Сообщение от Артист Посмотреть сообщение
Не понятно какого хрена он вообще приходит, ведь там нет
Всё та же цитата, что я уже приводил, только теперь другая её часть:
Цитата:
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.
Может стоит всё же читать документацию?
__________________
29375, 35
Ответить с цитированием
  #15 (permalink)  
Старый 09.11.2016, 21:45
Аспирант
Отправить личное сообщение для Ostic Посмотреть профиль Найти все сообщения от Ostic
 
Регистрация: 31.08.2016
Сообщений: 49

это 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});
};

я, конечно, свой код покрамсал и поэтому могут быть ошибки, но суть такова: сообщение - ответ.
если надо длительное общение поддерживать, то лучше создавать именованный канал и не забывать его закрывать, а то скрипты так и будут висеть.
Ответить с цитированием
  #16 (permalink)  
Старый 09.11.2016, 23:30
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Сообщение от Ostic Посмотреть сообщение
а оно вообще должно сработать?
Работает, я же проверял )

Сообщение от Ostic Посмотреть сообщение
проверить на тип 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 Посмотреть сообщение
background.js не рекомендовано, также как и "висит в приложении постоянно". кстати, в каком приложении то, о чем речь?
maps.js каким образом подключается к страницам?
Ну вроде не всегда висит, оно освобождается из памяти, чего - то там, и используется только при вызове чего либо...
Вешается на "невидимую" вкладку.
Он нужен, т.к. приложение - бот для онлайн игры.
Он работает даже когда нет открытых вкладок с самой игрой.

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

Сообщение от Aetae Посмотреть сообщение
Всё та же цитата, что я уже приводил, только теперь другая её часть: Может стоит всё же читать документацию?
Да я читал раз 10.
Просто мало того, что там всё по английски(гугл перевод конченный), так ещё терминами непонятными сыпят.
Ничего не понятно, я не могу ничего там найти, из того, что мне нужно...

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

Сообщение от Ostic Посмотреть сообщение
если надо длительное общение поддерживать, то лучше создавать именованный канал и не забывать его закрывать, а то скрипты так и будут висеть.
Да я даже не лезу в именованный
Ну и в принципе мне обычного хватит вполне.
Т.к. страницы открываются/закрываются...

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

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

На странице карты можно узнать взято или нет задание, а остальное только запросом.
Чтобы не делать каждый раз запрос(при обновлении карты, а она постоянно в работе), я создал ячейку в памяти и храню в ней время когда будет доступно задание(1й запрос всё - таки делается, чтобы узнать это время).
Ну и вот, только на клиентской стороне всё считается...
Ответить с цитированием
  #17 (permalink)  
Старый 09.11.2016, 23:34
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Во, всё заработало:
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
	}
)
Ответить с цитированием
  #18 (permalink)  
Старый 12.11.2016, 11:38
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

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

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

Долгоживущее соединение не поможет?
Ответить с цитированием
  #19 (permalink)  
Старый 12.11.2016, 17:39
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

Артист, таким образом - да.
Для более сложного "постоянного" общения есть connect.
__________________
29375, 35
Ответить с цитированием
  #20 (permalink)  
Старый 12.11.2016, 21:52
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Спасибо )
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск