我正在编写 chrome 扩展,但 sendResponse 方法不起作用。
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if(!request.method){
return false;
}
if(request.method=='postList' && request.post_list){
// alert(1);
a_facebook_api.getPostFromDB(request.post_list, function(data){
alert(data);
sendResponse(data);
});
} else if(request.method=='postAdd' && request.post_data){
a_facebook_api.addPostToDB(request.post_data, function(data){
sendResponse(data);
});
}
return true;
}
);
chrome.runtime.sendMessage({method: "postList",post_list: post_list}, function(response) {
alert(response);
});
函数 alert(data) 有效。它为我提供了 JSON 格式的正确数据。但是,alert(response) 不显示任何消息。谁能告诉我为什么它不起作用?
提前致谢!
最佳答案
您还没有说明这段代码是否在内容脚本或后台页面中。通过查看它,我认为它是内容脚本的一部分。
我在我自己的一个扩展程序中尝试了您的代码,它提示“[object Object]”,当您提示一个不是字符串或数值的变量时会发生这种情况。如果您将警报数据更改为“response.responseData”,它会从后台页面提醒您标记为“responseData”的值。
因为它没有为您发出任何警报,我认为正在监听消息的脚本没有正确响应。
我让代码正常工作。 这是内容脚本:
//Document ready
window.onload = function() {
alert('Ready');
//Send a message
sendMessage();
}
//Get message from background page
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
//Alert the message
alert("The message from the background page: " + request.greeting);//You have to choose which part of the response you want to display ie. request.greeting
//Construct & send a response
sendResponse({
response: "Message received"
});
});
//Send message to background page
function sendMessage() {
//Construct & send message
chrome.runtime.sendMessage({
method: "postList",
post_list: "ThePostList"
}, function(response) {
//Alert the message
alert("The response from the background page: " + response.response);//You have to choose which part of the response you want to display ie. response.response
});
}
这是后台脚本:
//Get message from content script
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
//Alert the message
alert('The message from the content script: ' + request.method);//You have to choose which part of the response you want to display ie. request.method
//Construct & send a response
sendResponse({
response: "Message received"
});
}
);
//Send message to content script
function sendDetails(sendData) {
//Select tab
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
//Construct & send message
chrome.tabs.sendMessage(tabs[0].id, {
greeting: sendData
}, function(response) {
//On response alert the response
alert("The response from the content script: " + response.response);//You have to choose which part of the response you want to display ie. response.response
});
});
}
每次脚本收到消息时,您都必须使用“sendResponse”函数发送响应。
希望这对您有所帮助。
关于javascript - chrome 扩展 `sendResponse` 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20435528/
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我想这样组织C源代码:+/||___+ext||||___+native_extension||||___+lib||||||___(Sourcefilesarekeptinhere-maycontainsub-folders)||||___native_extension.c||___native_extension.h||___extconf.rb||___+lib||||___(Rubysourcecode)||___Rakefile我无法使此设置与mkmf一起正常工作。native_extension/lib中的文件(包含在native_extension.c中)将被完全忽略。
我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion
我目前正在尝试学习RubyonRails和测试框架RSpec。assigns在此RSpec测试中做什么?describe"GETindex"doit"assignsallmymodelas@mymodel"domymodel=Factory(:mymodel)get:indexassigns(:mymodels).shouldeq([mymodel])endend 最佳答案 assigns只是检查您在Controller中设置的实例变量的值。这里检查@mymodels。 关于ruby-o
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我将Cucumber与Ruby结合使用。通过Selenium-Webdriver在Chrome中运行测试时,我想将下载位置更改为测试文件夹而不是用户下载文件夹。我当前的chrome驱动程序是这样设置的:Capybara.default_driver=:seleniumCapybara.register_driver:seleniumdo|app|Capybara::Selenium::Driver.new(app,:browser=>:chrome,desired_capabilities:{'chromeOptions'=>{'args'=>%w{window-size=1920,1
我想编写一个ruby脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"
这个问题有两个部分。在RubyProgrammingLanguage一书中,有一个使用模块扩展字符串对象和类的示例(第8.1.1节)。第一个问题。为什么如果您使用新方法扩展类,然后创建该类的对象/实例,则无法访问该方法?irb(main):001:0>moduleGreeter;defciao;"Ciao!";end;end=>nilirb(main):002:0>String.extend(Greeter)=>Stringirb(main):003:0>String.ciao=>"Ciao!"irb(main):004:0>x="foobar"=>"foobar"irb(main):
这段代码似乎创建了一个范围从a到z的数组,但我不明白*的作用。有人可以解释一下吗?[*"a".."z"] 最佳答案 它叫做splatoperator.SplattinganLvalueAmaximumofonelvaluemaybesplattedinwhichcaseitisassignedanArrayconsistingoftheremainingrvaluesthatlackcorrespondinglvalues.Iftherightmostlvalueissplattedthenitconsumesallrvaluesw