我在应用程序中使用10.2.2 Tokyo Enterprise和FireMonkey的TWebBrowser
。我希望收到一个回调响应,但是当我运行代码时ShouldStartLoadWithRequest
触发时,我没有收到回传。
我想知道如果没有编写包装器,这是否可行。我觉得我错过了一些简单的事情。
我已经检查了这些网站以及更多网站,并尝试了许多不同的方式...
Callback from Firemonkey WebBrowser JavaScript code
Adding Javascript processing capability to TWebBrowser in iOS
这是我的简单代码版本:
的index.html
<!DOCTYPE html><html lang="en">
<body>
<h2> Get Callback</h2>
</body>
</html>
procedure TForm2.FormCreate(Sender: TObject);
begin
WebBrowser1.URL := 'file://' + GetCurrentDir + '/../../index.html';
end;
procedure TForm2.Button1Click(Sender: TObject);
var
js : string;
begin
js := ' var url = "file://' + GetCurrentDir + '/../../index.html";'+
'var encodedurl = encodeURIComponent(url);'+
'window.location.href = encodedurl+"?67";';
WebBrowser1.EvaluateJavaScript(js);
end;
procedure TForm2.WebBrowser1ShouldStartLoadWithRequest(ASender: TObject;
const URL: string);
var
js,TheURL: String;
begin
TheURL := 'file://' + GetCurrentDir + '/../../index.html';
js := URL;
Fetch(js, TheURL+'?',true,false); //remove the URL and ?
js := TIdURI.URLDecode(js, IndyTextEncoding_UTF8);
Memo1.Lines.Text := js;
end;
原则上,更改URL的结尾应该诱使WebBrowser相信它是一个新的URL,并且我应该能够在保持页面刷新的同时提取数字67。
请你能指出我正确的方向吗?
答案 0 :(得分:1)
我继续进一步调查......
通常在向服务器发送标题时,服务器会接受标题,但在上面的实例中,标题会从本地网址 发送到本地网址,浏览器将选择此项并将标题标记为格式错误。这是因为CORS政策步入。
可以使用--disable-web-security标志在Chrome中禁用同源请求策略。但是当我使用标准的Firemonkey Web浏览器时,Chrome解决方案并不完全适用。
然而,似乎IE 11和Edge的可更改安全/区域设置已完全删除。您可以访问它的唯一方法是通过包装器。
请参阅Can the same-origin request policy be disabled in Microsoft Edge?
希望Embarcadero很快就会将回调函数添加到Firemonkey Web浏览器中。所以在此期间我发现了一个简单的解决方法。我从Getit Package Manager下载了ScriptGate 1.0并使用了他们的包装器库。虽然这不是我的问题的真正解决方案,但它是寻求快速解决方案的其他人的解决方案。
这是我用来实现它的回调函数......
uses
SG.ScriptGate,...
var
FScriptGate: TScriptGate;
procedure TForm2.FormCreate(Sender: TObject);
begin
WebBrowser1.URL := 'file://' + GetCurrentDir + '/../../index.html';
FScriptGate := TScriptGate.Create(Self, WebBrowser1, 'YourOrgScheme');
end;
procedure TForm2.FormShow(Sender: TObject);
begin
//use a timer (set to 200) to call evalfunction if URL not loaded in time
evalfunction;
end;
procedure TForm2.Button1Click(Sender: TObject);//callback function
begin
FScriptGate.CallScript(
'getvalue()', // calls the javasacript getvalue function
procedure(const iResult: String)
begin
ShowMessage(iResult); //result will be 67
);
end;
procedure TForm2.evalfunction; //populates browser onFormshow
var
js:string;
begin
js :=
'function getvalue(){'+
' return "67";'+
'}';
WebBrowser1.EvaluateJavaScript(js);
end;