以前我有代码:
private
FParentWinControl: TWinControl; {Don't mess with! Used in CreateParams}
procedure TFormX.CreateParams(var params: TCreateParams); override;
public
constructor TFormX.Create( AOwner: TComponent); reintroduce;
end;
constructor TFormX.Create( AOwner: TComponent);
begin
if AOwner IS TWinControl then
FParentWinControl := TWinControl(AOwner)
else
FParentWinControl := NIL;
inherited Create(AOwner);
end; { Create }
procedure TFormX.CreateParams(var params: TCreateParams);
begin
inherited CreateParams(params);
if (NOT fCreateParamsHasBeenRun) then
begin
fCreateParamsHasBeenRun := TRUE;
if Assigned(FParentWinControl) then
Params.WndParent := FParentWinControl.Handle; {tricks windows into thinking it's a child form}
end;
end;
以获取我正在寻找的数据。这大部分都有效但我无法将值赋给arr [pos]。我发现因为$ .get()是异步的,我可以使用chrome.runtime.onMesssage和.sendMessage并使用回调函数来访问该值。所以我在我的后台脚本tabcheck.js中提出了这个:
$.get(url, function(data){
var $response = $(data);
overallRating = $response.find("div.grade").eq(0).html();
arr[pos].rating = overallRating;
和popup.js页面中的sendmessage:
chrome.runtime.onMessage.addListener(function(message, send, callback){
console.log("message recieved");
$.get(send.url , function(data){
console.log(data);
callback(data);
});
return true; //https://stackoverflow.com/questions/17246133/contexts-and-methods-for-communication-between-the-browser-action-background-sc
});
我认为发生的事情是在onmessage中没有访问url。我记得收到类似于Chrome Extention Port error: Could not establish connection. Receiving end does not exist的错误,但不记得那是否是确切的错误。数据未定义
那么在第一个和第二个之间发生了什么变化会使新功能无法再访问该网址?我该如何解决?我的目标是将值overAllRating变为arr [pos] .rating。
如果必要的话,继承我的清单:
chrome.runtime.sendMessage('message', {url: url } , function(data) {
console.log(data);
var $response = $(data);
overallRating = $response.find("div.grade").eq(0).html();
arr[pos].rating = overallRating;
});
答案 0 :(得分:0)
这个答案是关于修复代码中的错误,而不是修复逻辑中的错误。您的代码将起作用,但无论如何都不会如此。请参阅答案的结尾。
// Wrong:
chrome.runtime.sendMessage('message', {url: url} , function(data) {/*...*/});
这是sendMessage
的错误格式。
您可以看到full documentation,但通常需要2个参数:
chrome.runtime.sendMessage(message, callback);
其中message
,是,等等,只要它是JSON可序列化的。
如果您添加一个字符串作为第一个参数,它将成为一个3参数形式,并被解释为交叉扩展消息,第一个参数为目标ID 。
Chrome会尝试查找ID为"message"
的扩展程序并失败,并显示“接收端不存在”错误。
传递给侦听器的消息如下:
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse {
// message is the original message
// sender is an object containing info on who sent the message
// sendResponse is a function to be called
});
您正在尝试使用第二个参数:
chrome.runtime.onMessage.addListener(function(message, send, callback){
console.log("message recieved");
$.get(
send.url, // <-- This is wrong
function(data) {
console.log(data);
callback(data);
}
);
return true;
});
把它重新组合在一起:
chrome.runtime.sendMessage(
{url: url}, // This will be the message
function(data) {/*...*/}
);
和
chrome.runtime.onMessage.addListener(function(message, sender, callback){
console.log("message recieved");
$.get(
message.url,
function(data) {
console.log(data);
callback(data);
}
);
return true;
});
现在我们已修复此错误, 这对您没有任何帮助!
你没有“治愈”$.get
的异步性质。现在有两层异步性,AJAX和消息传递。您的作业仍然无法按预期工作 - 并且没有足够的代码来修复它。
你可能遇到这两个问题中的任何一个:
Why is my variable unaltered after I modify it inside of a function?(如果您在此代码后尝试使用arr
)
JavaScript closure inside loops(如果您认为自己的pos
表现得很有趣)
我建议仔细研究这两个规范问题。你根本不需要需要消息,它没有解决任何问题。