2013-12-23 2 views
0

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

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 некоторые функции будут получать данные и отправить его на мой сервер (A 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?

+0

См. http://docs.crossrider.com/#!/api/appAPI.message –

+0

yes Я прочитал эту ссылку, но нет никакого способа связи между backgrond.js и extension.js. По методу методов мы можем отправлять сообщения на текущие вкладки или на все вкладки и т. Д. Но это не мое требование. –

ответ

5

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

По дизайну/архитектуре, extension.js код выполняется на каждой странице HTML есть отдельный расширения .js экземпляр запускается для каждого загружаемого URL-адреса. Напротив, контекстное меню выполняется на уровне браузера (а не HTML-страницы) и поэтому правильно закодировано в файле background.js. Однако код background.js не имеет прямого доступа к окну extension.js, который запускается на странице HTML на активной вкладке и поэтому должен communicate the data via messaging. (Для получения дополнительной информации о области видимости см. Scopes Overview)

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

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

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"]); 
}); 

extension.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); 
     } 
     }); 
    } 
    }); 
}); 

[Правовая оговорка: Я - кроссовер empl oyee]

+0

Спасибо за ответ. Мне не хватало точки, что код extension.js запускается на каждой странице HTML, то есть отдельный экземпляр extension.js запускается для каждого загружаемого URL-адреса. Спасибо за очищение :) –

+0

Удовольствие. BTW, если у вас нет конкретной необходимости отправлять данные в область extension.js, вы можете просто опубликовать данные непосредственно из области background.js ;-) – Shlomo

+0

Это замечательно! Я думаю, что он должен быть включен в демонстрацию, связанную с [docs] (http://docs.crossrider.com/#!/api/appAPI.contextMenu). – jozxyqk

Смежные вопросы