chrome扩展:哪个会更好,ajax还是chrome.extension.sendRequest?

时间:2011-06-13 19:07:28

标签: javascript google-chrome google-chrome-extension

速度和使用资源/内存不仅更快,而且更好。

我有一个应用程序,我在输入类型文本中将建议作为用户类型。那么,我应该使用ajax在两个页面之间进行通信还是chrome.extension.sendRequest?

修改

我有一个打包的应用程序,所有应用程序信息都存储在background.html的websql数据库中。 index.html上有一个输入类型文本(当有人点击新标签页上的应用程序徽标时会打开)

index.html上的输入从用户输入的background.html数据库中获取建议。 (就像谷歌在谷歌主页上开始输入查询一样)我可以通过两种方式获取建议数据,使用XmlHttpRequest和chrome的消息传递api。由于对background.html会有很多请求,我想知道哪种方法有效..

相关应用:https://chrome.google.com/webstore/detail/fddboknafkepdchidokknkeidnaejnkh?hl=en-US

编辑2

该应用程序100%离线。我没有连接到任何服务器或网站。我没有加载任何外部脚本,甚至没有加载jquery。连接的所有应用程序都是它自己的目录中的文件。当用户单击新标签页中的应用程序图标时,将在启动时加载background.html并加载index.html。要查看所有操作内容,您可以安装该应用并亲自查看。

编辑3

我使用常规的ajax从background.html调用index.html,它似乎工作正常。顺便说一下,index.html和background.html都在'html'目录中。

function ajaxcall(url,callback) {
    var call = new XMLHttpRequest();
    call.onreadystatechange=function() {if(call.readyState==4) callback(call.responseText);}
    call.open("GET",url+'#'+Math.random(),true);
    call.send(null);
}

ajaxcall('/html/index.html', function(response) {console.log('foo')});

1 个答案:

答案 0 :(得分:2)

只要您希望在内容脚本和其他页面之间进行通信,就应该使用message passing API。我不知道你想在这里使用ajax。

如果您在说出您的背景页面和浏览量弹出窗口之间进行通信,您还可以使用chrome.extension.getBackgroundPage,它只会从背景页面返回window对象。由于对内容脚本施加的限制,您无法在内容脚本中使用此功能。这意味着您将始终必须使用消息传递API来处理内容脚本。

不要被这些消息传递函数的异步性质所欺骗。这只是Chrome团队在各处使用异步功能(带回调)的设计考虑因素。这并不意味着他们需要花费大量时间来执行。虽然我没有标记它们,但它们似乎几乎是瞬间完成的。

修改

我误解了你的问题。我以为你在询问如何在你的扩展程序/应用程序中的不同页面之间进行通信。您真正要问的是如何与Web服务器通信。

message passing APIsendRequest)仅适用于您应用的不同部分之间的通信。这个API到位的原因是因为您的应用的不同部分在不同的环境中运行,这些部分称为isolated worlds。这些环境彼此完全分离,以保护您免受恶意代码的侵害。通过这些不同环境的唯一针孔是此消息传递API。

如果您想与Web服务器通信(当您调用它们时为'pages'),则需要使用ajax。使用ajax,您还会注意到Chrome的严格安全模型。在正常情况下,网页仅允许向其发起的同一网站发出请求。这称为“same origin policy”。因为您的扩展程序/应用程序未托管(打包),默认情况下它无权访问Web服务器。作为开发人员,您必须向用户请求此权限。您可以通过填写扩展程序清单中的permissions属性来执行此操作。每当用户安装您的应用时,他必须accept您有权访问某个Web服务器。

在我阅读您的问题时,我假设您仍然不熟悉浏览器中的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。您是否需要Web服务器来执行此任务?您能否举例说明您在应用中如何实现这一目标?