Отправка данных из всплывающего окна в extension.js не работает
-
21-12-2019 - |
Вопрос
Я работаю над расширением для браузера, используя crossrider.Мне нужно отправить некоторые данные из всплывающего окна в extension.js
Мой код всплывающего окна
<!DOCTYPE html>
<html>
<head>
<!-- This meta tag is relevant only for IE -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<script type="text/javascript">
/************************************************************************************
This is your Popup Code. The crossriderMain() code block will be run
every time the popup is opened.
For more information, see:
http://docs.crossrider.com/#!/api/appAPI.browserAction-method-setPopup
*************************************************************************************/
function crossriderMain($) {
// var to store active tab's URL
var activeTabUrl = null;
// Message listener for response from active tab
appAPI.message.addListener(function(msg) {
if (msg.type === 'active-tab-url') activeTabUrl = msg.url;
});
// Request URL from active tab
appAPI.message.toActiveTab({type: 'active-tab-url'});
alert(activeTabUrl);
// THE REST OF YOUR CODE
}
</script>
</head>
<body>
Hello World
</body>
</html>
Кодекс о Extension.js
appAPI.ready(function($) {
// Message listener
appAPI.message.addListener(function(msg) {
if (msg.type === 'active-tab-url')
// Send active tab's URL to popup
appAPI.message.toPopup({
type: 'active-tab-url',
url:encodeURIComponent(location.href)
});
});
// THE REST OF YOUR CODE
});
Значение activeTabUrl не обновляется.Это дает НУЛЕВОЕ значение.P.S :Я могу обмениваться данными между фоном.js и всплывающим окном.Но по какой-то причине функция appAPI.message.toActiveTab у меня не работает.Где я совершаю ошибку?
Background.js (Править)
var tabUrl='';
/* appAPI.tabs.getActive(function(tabInfo) {
tabUrl = tabInfo.tabUrl;
}); */
appAPI.message.addListener(function(msg) {
appAPI.tabs.getActive(function(tabInfo) {
tabUrl = tabInfo.tabUrl;
});
var dataString = '{"url":"'+tabUrl+'","access":"'+msg.access+'","toread":"'+msg.toread+'","comment":"'+msg.comment+'"}';
alert(dataString);
appAPI.request.post({
url: 'REST API URL',
postData: dataString,
onSuccess: function(response, additionalInfo) {
var details = {};
details.response = response;
appAPI.message.toPopup({
response:response
});
},
onFailure: function(httpCode) {
// alert('POST:: Request failed. HTTP Code: ' + httpCode);
}
});
});
Рабочий код Background.js
appAPI.message.addListener(function(msg) {
appAPI.tabs.getActive(function(tabInfo) {
var dataString = '{"url":"'+tabInfo.tabUrl+'","access":"'+msg.access+'","toread":"'+msg.toread+'","comment":"'+msg.comment+'"}';
// alert(dataString);
appAPI.request.post({
url: 'http://fostergem.com/api/bookmark',
postData: dataString,
onSuccess: function(response, additionalInfo) {
var details = {};
details.response = response;
appAPI.message.toPopup({
response:response
});
},
onFailure: function(httpCode) {
// alert('POST:: Request failed. HTTP Code: ' + httpCode);
}
});
});
});
Решение
В этом примере кода Активный клубок переменная устанавливается только после получения ответа от extension.js файл, поскольку обмен сообщениями является асинхронным по своей конструкции.Следовательно, при вызове alert(activeTabUrl);
в коде указано, что сообщение еще не было получено обратно от extension.js код, таким образом, значение по-прежнему равно null, поскольку оно было инициализировано.
Чтобы использовать Активный клубок переменная, которую вы должны дождаться сообщения от extension.js файл, и, следовательно, вы должны поместить код, использующий переменную, в обратный вызов средства прослушивания сообщений, предпочтительно в виде функции.Также обратите внимание, что использование предупреждения во всплывающем коде приводит к закрытию всплывающего окна и, следовательно, не должно использоваться в области всплывающего окна.
Я протестировал следующий всплывающий код, который устраняет переменную, чтобы избежать путаницы, и передает URL активной вкладки в качестве параметра функции, вызываемой в прослушивателе сообщений, и это сработало, как ожидалось:
function crossriderMain($) {
// Message listener for response from active tab
appAPI.message.addListener(function(msg) {
if (msg.type === 'active-tab-url') ShowPageUrl(msg.url);
});
function ShowPageUrl(url) {
$('#page-url').html('<b>Page URL</b>: ' + url);
}
// Request URL from active tab
appAPI.message.toActiveTab({type: 'active-tab-url'});
//alert(activeTabUrl);
// THE REST OF YOUR CODE
}
[Отказ от ответственности:Я сотрудник Crossrider]