 
			
				09.12.2017, 11:45
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 01.07.2017 
					
					
					
						Сообщений: 25
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
			
			 
				Проблема с chrome.extension.sendMessage
			 
			
		
		
		
		Доброго времени суток. Помогите пожалуйста с проблемой общения content script'a и background.js. Я пытаюсь сделать расширение для браузера, но столкнулся с такой проблемой: когда загружается страница подключенный к ней content script запрашивает background.js и сообщает id, background же через ajax обращается к БД и отсылает обратно в content script информацию и content script уже работает дальше сам.  
Проблема в том, что алгоритм срабатывает правильно только 1 раз. Все последующие запросы равны первому. Т.е. если в первый раз я из background.js получил условные "123" и то и все последующие разы я получаю "123". Но если перезаписать расширение или перезапустить браузер, запустить скрипт с другим id, получить условные "999999" то опять все последующие запросы я буду получать "999999". 
 
Как удалить из память полученные значения, чтобы background не ленился и делал запрос к бд каждый раз, а не только пока не получит первые значения    
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				09.12.2017, 12:03
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 04.12.2012 
					
					
					
						Сообщений: 3,841
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Скорее всего вы просто криво скрипт написали. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				09.12.2017, 13:42
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 01.07.2017 
					
					
					
						Сообщений: 25
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Я упростил все что только можно и теперь расширение выглядит примерно так: 
ContentScripts.js
 
chrome.extension.sendMessage('ContentScript', function(backMessage){
	alert('2. Обратно принято из фона: ' + backMessage);
});
background.js
 
$.ajax({ // Запрос к бд
 url:"http://mysite/background.php", // Запрос к бд
 type:"POST", // Запрос к бд
 data:({url:info.url)}), // Запрос к бд
 dataType:"text", // Запрос к бд
 success: function(data){ // Ответ бд
  if (data.substring(0,4)=="true"){ // Если url есть в бд получает ответ от сервера
   var x = data.substring(data.indexOf("X")+1,); // Достаю из ответа X 
   alert("ПЕРВЫЙ АЛЕРТ   X="+x);									
   chrome.extension.onMessage.addListener(function(request, sender,f_callback){
    if(request=='ContentScript'){ //проверяется, от того ли окна и скрипта отправлено
    alert("ВТОРОЙ АЛЕРТ   X="+x);	
    f_callback("X="+x); //обратное сообщение
   }
   });
 }
}
});
ps в background.js в самом начале стоит chrome.tabs.onUpdated.addListener т.е. ajax срабатывает всегда при обновлении страницы. Так я беру текущий url и отправляю его в bd.
 
В результате получаю: 
Первый прогон: 
ПЕРВЫЙ АЛЕРТ X=1 
ВТОРОЙ АЛЕРТ X=1 
2. Обратно принято из фона: X=1
 
Второй прогон на другой странице: 
ПЕРВЫЙ АЛЕРТ   X=2 
ВТОРОЙ АЛЕРТ   X=1 
2. Обратно принято из фона: X=1 
ВТОРОЙ АЛЕРТ   X=2
 
Т.е. получается что первый раз скрипт сработал с начала и ajax прошел до конца и chrome.extension.onMessage взял X правильно. Но во второй раз скрипт начинает работать сразу с 2х мест (с начала и с 10й строки) я уже вообще не понимаю ничего...    
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось Xopc11, 09.12.2017 в 13:46.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				09.12.2017, 22:18
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Тлен 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.01.2010 
					
					
					
						Сообщений: 6,601
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		У тебя на каждый onUpdated происходит ajax зпрос и как только он закончен, назначается  ещё один обработчик onMessage, старый при этом никуда не девается. При этом возврат результата в хроме работает только для первого назначенного обработчика, остальные отрабатывают только внутри background ничего назад не передавая. 
Т.е. через десять апдейтов у тебя висит десять одинаковых  
chrome.extension.onMessage.addListener(function(request, sender,f_callback){
    if(request=='ContentScript'){ //проверяется, от того ли окна и скрипта отправлено
    alert("ВТОРОЙ АЛЕРТ   X="+x);  
    f_callback("X="+x); //обратное сообщение
   })
При этом каждый их них хранит в замыкании результат своего ajax вызова. 
Не нужно так делать.)
 
Что тебе нужно, это: 
chrome.extension.onMessage.addListener(function(request, sender,f_callback){
  if(request=='ContentScript'){ //проверяется, от того ли окна и скрипта отправлено
    $.ajax({ // Запрос к бд
      url:"http://mysite/background.php", // Запрос к бд
      type:"POST", // Запрос к бд
      data:{url:info.url}, // Запрос к бд
      dataType:"text", // Запрос к бд
      success: function(data){ // Ответ бд
        if (data.substring(0,4)=="true"){ // Если url есть в бд получает ответ от сервера
          var x = data.substring(data.indexOf("X")+1); // Достаю из ответа X
          f_callback("X="+x); //обратное сообщение
        }else{
          f_callback(false); //обратное сообщение      
        }
      }
    })
    return true
  }
})
 без всяких onUpdate  
		
	
		
		
		
		
		
			
				__________________ 
				29375, 35 
 
			 
		
		
		
		
		
						  
				
				Последний раз редактировалось Aetae, 09.12.2017 в 22:20.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				11.12.2017, 10:45
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 01.07.2017 
					
					
					
						Сообщений: 25
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от Aetae
			 
		
	 | 
 
	
		У тебя на каждый onUpdated происходит ajax зпрос и как только он закончен, назначается ещё один обработчик onMessage, старый при этом никуда не девается. При этом возврат результата в хроме работает только для первого назначенного обработчика, остальные отрабатывают только внутри background ничего назад не передавая. 
Т.е. через десять апдейтов у тебя висит десять одинаковых 
chrome.extension.onMessage.addListener(function(request, sender,f_callback){
    if(request=='ContentScript'){ //проверяется, от того ли окна и скрипта отправлено
    alert("ВТОРОЙ АЛЕРТ   X="+x);  
    f_callback("X="+x); //обратное сообщение
   })
 
При этом каждый их них хранит в замыкании результат своего ajax вызова. 
Не нужно так делать.) 
 
Что тебе нужно, это:
chrome.extension.onMessage.addListener(function(request, sender,f_callback){
  if(request=='ContentScript'){ //проверяется, от того ли окна и скрипта отправлено
    $.ajax({ // Запрос к бд
      url:"http://mysite/background.php", // Запрос к бд
      type:"POST", // Запрос к бд
      data:{url:info.url}, // Запрос к бд
      dataType:"text", // Запрос к бд
      success: function(data){ // Ответ бд
        if (data.substring(0,4)=="true"){ // Если url есть в бд получает ответ от сервера
          var x = data.substring(data.indexOf("X")+1); // Достаю из ответа X
          f_callback("X="+x); //обратное сообщение
        }else{
          f_callback(false); //обратное сообщение      
        }
      }
    })
    return true
  }
})
 без всяких onUpdate
	 | 
 
	
 
 Я так тоже делал. Результат одинаковый. Всегда отправляется только первое сообщение.  
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				11.12.2017, 11:55
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Тлен 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.01.2010 
					
					
					
						Сообщений: 6,601
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Xopc11,  
Ну не знаю что ты там делал, однако приведённый тобой вариант - однозначно ошибочен. 
Попробуй в моём варианте заменить 
04 url:"http://mysite/background.php", // Запрос к бд
 на  
04 url:"http://mysite/background.php?" + Math.random(), // Запрос к бд
 Возможно дело в кэше.  
		
	
		
		
		
		
		
			
				__________________ 
				29375, 35 
 
			 
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				12.12.2017, 08:18
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 01.07.2017 
					
					
					
						Сообщений: 25
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Так даже x не получается взять 
-- 
2. Обратно принято из фона: undefined 
--
   
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				12.12.2017, 08:27
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 01.07.2017 
					
					
					
						Сообщений: 25
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Мб есть другие способы передавать сообщения туда обратно? 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				12.12.2017, 11:52
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 01.07.2017 
					
					
					
						Сообщений: 25
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Нашел другой способ который просто идеально работает в моем случае. Я спокойно делаю запрос через ajax и если ответ меня устраивает, отправляю его в контент скрипт.    
background.js
 
chrome.tabs.getSelected(null, function(tab){ //выбирается ид открытого таба, выполняется коллбек с ним
     chrome.tabs.sendRequest(tab.id,{msg:"X="+x}); //запрос  на сообщение
});
ContentScripts.js
 
chrome.extension.onRequest.addListener(function(req){ //обработчик запроса из background
	alert('3. Принято из фона: ' + req.msg); //выведется переданное сообщение
});
        
Спасибо, что откликнулись.    
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |