Вам следует использовать API для передачи сообщений всякий раз, когда вы хотите обмениваться данными между скриптами содержимого и вашими другими страницами. Я не понимаю, как вы хотите использовать AJAX здесь.
Если вы общаетесь, скажем, между вашей фоновой страницей и всплывающим окном просмотра, вы также можете использовать chrome.extension.getBackgroundPage
, который просто возвращает вам объект window
с фоновой страницы. Из-за ограничений, налагаемых на скрипты контента, вы не можете использовать эту функцию в скриптах контента. Это означает, что вам всегда придется использовать api для передачи сообщений для контент-скриптов.
Не обманывайтесь асинхронной природой этих функций передачи сообщений. команда разработчиков Chrome просто считает использование асинхронных функций (с обратным вызовом) повсеместным. Это не значит, что они занимают много времени, чтобы выполнить. Хотя я их и не тестировал, похоже, они выполняются практически мгновенно.
Редактировать
Я неправильно понял ваш вопрос. Я думал, что вы спрашиваете о том, как общаться между различными страницами в вашем расширении / приложении. То, что вы действительно спрашиваете, это как общаться с веб-сервером.
API для передачи сообщений (sendRequest
) работает только для связи между различными частями вашего приложения. Причина использования этого API в том, что разные части вашего приложения работают в разных средах, они называются изолированные миры . Эти среды полностью отделены друг от друга, чтобы защитить вас от вредоносного кода. Единственное отверстие в этих различных средах - это API передачи сообщений.
Если вы хотите общаться с веб-сервером («страницы», как вы их называете), вам нужно будет использовать ajax. С ajax вы также заметите строгую модель безопасности Chrome. При нормальных условиях веб-странице разрешается отправлять запросы только на тот же сайт, с которого она была создана. Это называется « тот же источник политики ». поскольку ваше расширение / приложение не размещено (оно упаковано), оно не имеет прав доступа к веб-серверу по умолчанию. Вы, как разработчик, должны будете запросить это право у пользователя. Это можно сделать, заполнив свойство permissions
в манифесте расширения. Каждый раз, когда пользователь устанавливает ваше приложение, он должен принять , чтобы вы имели право доступа к определенному веб-серверу.
Читая ваш вопрос, я предполагаю, что вы все еще не очень хорошо знакомы с расширениями Chrome, приложениями, Ajax и политикой в браузере. Я призываю вас читать дальше по этим темам, пока вы разрабатываете свое приложение, чтобы вы могли обеспечить безопасность своих пользователей.
Редактировать 2
Хорошо, значит, вы общаетесь между двумя различными частями вашего приложения, index.html и background.html. Для этого вы можете использовать getBackgroundPage
и напрямую вызывать функции, определенные на вашей фоновой странице. Что вы делаете, это следующее: На вашей странице:
window.getSuggestions = function(query) {
// search database for query
return ['suggestion1', 'suggestion2'];
};
Затем вы можете вызвать следующую функцию на главной странице (index.html):
var backgroundPage = chrome.extension.getBackgroundPage();
var mySuggestions = backgroundPage.getSuggestions('suggestion');
console.log(mySuggestions);
Это так просто. Вам не нужен ни Ajax, ни sendRequest
для этого. Нет асинхронного кода вообще. Вы можете просто вызвать функцию синхронно, и это будет возвращено:
['suggestion1', 'suggestion2']
Я не тестировал это, и я еще не видел никаких данных об этом, но я почти уверен, что этот код намного быстрее, чем API для передачи сообщений или ajax. Я не знал, что вы могли бы использовать XmlHttpRequest
в своем добавочном номере, но если это возможно, я ожидаю, что это будет самый медленный способ, поскольку вы фактически делаете сетевой вызов вместо вызова объектов в памяти. Если вы хотите быть уверены в сроках, я предлагаю вам самим сравнить их. Вы можете легко сделать это с помощью Chrome, используя следующий код:
console.time('someID');
// perform heavy operation(s) here.
console.timeEnd('someID');
Время выполнения этой операции будет напечатано на консоли.
Редактировать 3
Теперь, когда я думаю об этом, я не совсем уверен, как бы вы сделали ajax между двумя страницами внутри расширения.Вам не нужен веб-сервер для этой задачи?Можете ли вы привести пример того, как вы достигли этого в своем приложении?