Отправка данных из background.js в extension.js в crossrider

Я разрабатываю расширение для браузера, используя crossrider. Я добавил контекстное меню (background.js)

   var ContextData;
    appAPI.contextMenu.add("key1", "Send Data To Server", function (data) {
        var ContextData = 'pageUrl: ' + data.pageUrl + '\r\n' +
                         'linkUrl: ' + data.linkUrl + '\r\n' +
                         'selectedText:' + data.selectedText + '\r\n' +
                         'srcUrl:' + data.srcUrl;

    }, ["all"]);

При щелчке пользователя я хочу отправить ContextData в extension.js. В extension.js некоторая функция будет получать данные и отправлять их на мой сервер (API Rest, который будет принимать данные).

Чтобы отправить данные на сервер, я протестировал это, и он отлично работает (пример кода в extension.js)

appAPI.ready(function($) {

var dataToSend =="test data";

    appAPI.request.post({
        url: 'REST API URL',
        postData: dataToSend,
        onSuccess: function(response, additionalInfo) {
            var details = {};

            details.response = response;

        },
        onFailure: function(httpCode) {
        //  alert('POST:: Request failed. HTTP Code: ' + httpCode);
        }
    });
});

Как я могу написать функцию, которая принимает ContextData из background.js и назначает ее dataToSend в extension.js?


person Neel Kamal    schedule 23.12.2013    source источник
comment
См. docs.crossrider.com/#!/api/appAPI.message.   -  person Rob W    schedule 23.12.2013
comment
да, я прочитал эту ссылку, но нет никакого способа связи между backgrond.js и extension.js. С помощью методов мы можем отправлять сообщения на текущие вкладки или на все вкладки и т.д. Но это не мое требование.   -  person Neel Kamal    schedule 23.12.2013


Ответы (1)


@Neel Если я правильно понимаю ваши требования, @Rob по сути верен, хотя небольшое разъяснение может помочь

В соответствии с дизайном/архитектурой код extension.js выполняется на каждой HTML-странице, т. е. отдельный экземпляр extension.js запускается для каждого загружаемого URL-адреса. Напротив, контекстное меню запускается на уровне браузера (а не HTML-страницы) и, следовательно, правильно закодировано в файле background.js. Однако код background.js не имеет прямого доступа к коду экземпляра extension.js, работающему на HTML-странице на активной вкладке, и поэтому должен передавать данные через сообщения. (Дополнительную информацию об областях см. в разделе Обзор областей.)

Очевидно, что пользователь щелкает пункт контекстного меню на активной вкладке (т. е. на странице, показывающей просматриваемую HTML-страницу); следовательно, после создания строки ContextData вы можете использовать appAPI. message.toActiveTab, чтобы отправить строку экземпляру extension.js, запущенному на странице/вкладке, где был выбран элемент контекстного меню.

В этом случае, используя ваш пример кода, вы можете достичь этой цели следующим образом:

background.js:

appAPI.ready(function($) {
  var ContextData;
  appAPI.contextMenu.add("key1", "Send Data To Server", function (data) {
    var ContextData = 'pageUrl: ' + data.pageUrl + '\r\n' +
      'linkUrl: ' + data.linkUrl + '\r\n' +
      'selectedText:' + data.selectedText + '\r\n' +
      'srcUrl:' + data.srcUrl;
    appAPI.message.toActiveTab({type:'dataToSend', data: ContextData});
  }, ["all"]);
});

расширение.js:

appAPI.ready(function($) {
  var dataToSend =="test data";

  appAPI.message.addListener(function(msg) {
    if (msg.type === 'dataToSend') {
      appAPI.request.post({
        url: 'REST API URL',
        postData: dataToSend,
        onSuccess: function(response, additionalInfo) {
            var details = {};
            details.response = response;
        },
        onFailure: function(httpCode) {
          //  alert('POST:: Request failed. HTTP Code: ' + httpCode);
        }
      });   
    }
  });
});

[Отказ от ответственности: я сотрудник Crossrider]

person Shlomo    schedule 23.12.2013
comment
Спасибо за ответ. Мне не хватало того, что код extension.js запускается на каждой HTML-странице, т. е. отдельный экземпляр extension.js запускается для каждого загружаемого URL-адреса. Спасибо за разъяснение :) - person Neel Kamal; 23.12.2013
comment
Удовольствие. Кстати, если у вас нет особой необходимости отправлять данные в область расширения extension.js, вы можете просто опубликовать данные непосредственно из области background.js ;-) - person Shlomo; 23.12.2013
comment
Это здорово! Я думаю, что это должно быть включено в демонстрацию, связанную с документами . - person jozxyqk; 03.04.2014