Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript chrome扩展:ajax和chrome.extension.sendRequest哪个更好?_Javascript_Google Chrome_Google Chrome Extension - Fatal编程技术网

Javascript chrome扩展:ajax和chrome.extension.sendRequest哪个更好?

Javascript chrome扩展:ajax和chrome.extension.sendRequest哪个更好?,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,不仅速度更快,而且在速度和使用资源/内存方面都更好 我有一个应用程序,我把建议作为用户类型输入到输入文本中。那么,我应该使用ajax在两个页面之间通信还是使用chrome.extension.sendRequest 编辑 我有一个打包的应用程序,所有的应用程序信息都存储在background.html的websql数据库中。index.html上有一个输入类型文本(当有人单击应用程序徽标表单新选项卡页面时打开) index.html上的输入会在用户键入时从background.html数据库中获

不仅速度更快,而且在速度和使用资源/内存方面都更好

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

编辑

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

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

有问题的应用程序:

编辑2

该应用程序100%离线。我没有连接到任何服务器或网站。我没有加载任何外部脚本,甚至jquery也没有。应用程序所连接到的所有文件都位于其自己的目录中。pc启动时加载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')});
当您希望在内容脚本和其他页面之间进行通信时,应该使用。我看不出您希望在这里如何使用ajax

如果您在后台页面和browseraction弹出窗口之间进行通信,您也可以使用它,只需从后台页面返回
窗口
对象。由于对内容脚本施加的限制,您不能在内容脚本中使用此功能。这意味着您必须始终为内容脚本使用消息传递api

不要被这些消息传递函数的异步特性所愚弄。在任何地方使用异步函数(带有回调)只是Chrome团队的设计考虑。这并不意味着他们要花很多时间来执行。虽然我没有对它们进行基准测试,但它们似乎几乎是在瞬间执行的

编辑

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

sendRequest
)仅适用于应用程序不同部分之间的通信。之所以使用此API,是因为应用程序的不同部分在不同的环境中运行,这些部分被调用。这些环境彼此完全分离,以保护您免受恶意代码的攻击。这些不同环境中唯一的漏洞就是这个消息传递API

如果您想与web服务器(您称之为“页面”)通信,则需要使用ajax。使用ajax,您还将注意到Chrome的严密安全模型。在正常情况下,网页只允许向其来源的同一网站发出请求。这称为“”。由于您的扩展/应用程序未托管(已打包),因此默认情况下,它没有访问web服务器的权限。作为开发人员,您必须向用户请求此权限。您可以通过在扩展清单中填写属性来实现这一点。每当用户安装您的应用程序时,他必须确保您有权访问某个web服务器

当我读到你的问题时,我假设你仍然不太熟悉浏览器中的Chrome扩展、应用程序、Ajax和策略。我鼓励您在开发应用程序时进一步阅读这些主题,以确保用户的安全

编辑2

好的,您正在应用程序的两个不同部分index.html和background.html之间进行通信。为此,您可以使用
getBackgroundPage
并直接调用后台页面中定义的函数。您要做的是:在您的背景页面中:

window.getSuggestions = function(query) {
  // search database for query

  return ['suggestion1', 'suggestion2'];
};
然后可以在主页面(index.html)上调用以下函数:

就这么简单。为此,您不需要任何ajax或
sendRequest
。根本没有异步代码。您只需以同步方式调用函数,就会返回:

['suggestion1', 'suggestion2']
我没有对此进行基准测试,也没有看到任何相关数据,但我非常确定这段代码比消息传递API或ajax快得多。我不知道您可以在扩展中使用
XmlHttpRequest
,但如果可能的话,我希望这是最慢的方式,因为您实际上是在进行网络调用,而不是调用内存中的对象。如果您想确定时间,我建议您自己对其进行基准测试。通过使用以下代码,您可以轻松地使用Chrome执行此操作:

console.time('someID');
// perform heavy operation(s) here.
console.timeEnd('someID');
执行此操作的时间将打印到控制台

编辑3


现在我想了想,我真的不确定如何在扩展中的两个页面之间实现ajax。此任务不需要web服务器吗?你能举个例子说明你是如何在你的应用程序中实现这一点的吗?

但我说的是打包应用程序可以发送到其页面的ajax请求。例如,我通过ajax从应用程序目录加载我的设置页面。。所以我想哪一个更好。。使用ajax加载带有建议的页面或通过消息传递api获取建议。。我根本没有使用任何内容脚本/页面操作/浏览器操作。是一个打包的应用程序。'sendRequest'不适用于ajax。它用于扩展/应用程序不同部分之间的通信。使用XMLHttpRequests
console.time('someID');
// perform heavy operation(s) here.
console.timeEnd('someID');