Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.12.2017, 11:45
Интересующийся
Отправить личное сообщение для Xopc11 Посмотреть профиль Найти все сообщения от Xopc11
 
Регистрация: 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 не ленился и делал запрос к бд каждый раз, а не только пока не получит первые значения
Ответить с цитированием
  #2 (permalink)  
Старый 09.12.2017, 12:03
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

Скорее всего вы просто криво скрипт написали.
Ответить с цитированием
  #3 (permalink)  
Старый 09.12.2017, 13:42
Интересующийся
Отправить личное сообщение для Xopc11 Посмотреть профиль Найти все сообщения от Xopc11
 
Регистрация: 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.
Ответить с цитированием
  #4 (permalink)  
Старый 09.12.2017, 22:18
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

У тебя на каждый 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.
Ответить с цитированием
  #5 (permalink)  
Старый 11.12.2017, 10:45
Интересующийся
Отправить личное сообщение для Xopc11 Посмотреть профиль Найти все сообщения от Xopc11
 
Регистрация: 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
Я так тоже делал. Результат одинаковый. Всегда отправляется только первое сообщение.
Ответить с цитированием
  #6 (permalink)  
Старый 11.12.2017, 11:55
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,584

Xopc11,
Ну не знаю что ты там делал, однако приведённый тобой вариант - однозначно ошибочен.
Попробуй в моём варианте заменить
04 url:"http://mysite/background.php", // Запрос к бд
на
04 url:"http://mysite/background.php?" + Math.random(), // Запрос к бд
Возможно дело в кэше.
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 12.12.2017, 08:18
Интересующийся
Отправить личное сообщение для Xopc11 Посмотреть профиль Найти все сообщения от Xopc11
 
Регистрация: 01.07.2017
Сообщений: 25

Так даже x не получается взять
--
2. Обратно принято из фона: undefined
--

Ответить с цитированием
  #8 (permalink)  
Старый 12.12.2017, 08:27
Интересующийся
Отправить личное сообщение для Xopc11 Посмотреть профиль Найти все сообщения от Xopc11
 
Регистрация: 01.07.2017
Сообщений: 25

Мб есть другие способы передавать сообщения туда обратно?
Ответить с цитированием
  #9 (permalink)  
Старый 12.12.2017, 11:52
Интересующийся
Отправить личное сообщение для Xopc11 Посмотреть профиль Найти все сообщения от Xopc11
 
Регистрация: 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); //выведется переданное сообщение
});




Спасибо, что откликнулись.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с радио кнопками px379 Общие вопросы Javascript 8 29.07.2013 09:30
Проблема с Popup окном vovuslik jQuery 5 12.06.2010 16:12
Проблема с CSS COKOJIOB (X)HTML/CSS 5 04.08.2009 14:19
Проблема, в менюшке Большой джо Элементы интерфейса 0 12.07.2009 17:12
Проблема спама lliberty AJAX и COMET 1 12.03.2009 16:47