gpt4 book ai didi

javascript - 使用文件 ://的 Delphi 和 FireMonkey WebBrowser 回调

转载 作者:行者123 更新时间:2023-11-29 23:28:08 51 4
gpt4 key购买 nike

我在应用程序中使用 10.2.2 Tokyo Enterprise 和 FireMonkey 的 TWebBrowser。我希望收到回调响应,但当我运行代码时 ShouldStartLoadWithRequest 触发时,我没有收到返回的 URL。

我想知道这是否可以不编写包装器。我觉得我错过了一些简单的事情。

我检查了这些网站以及更多网站并尝试了很多不同的方法...

Callback from Firemonkey WebBrowser JavaScript code

Adding Javascript processing capability to TWebBrowser in iOS

Callback Delphi function from TWebBrowser by javascript on Delphi XE6 for all platforms (including iOS, ANDROID)?

这是我的简单代码版本:

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,同时仍然保持页面刷新。

你能给我指明正确的方向吗?

最佳答案

我继续进一步调查......

通常在向服务器发送 header 时,服务器会接受 header ,但在上述实例中, header 是从本地 URL 发送到本地 URL,浏览器将拾取它并将 header 标记为格式错误。那是因为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 浏览器中。所以在此期间我发现了一个简单的解决方法。我下载了ScriptGate 1.0来自 Getit 包管理器并使用了他们的包装器库。虽然这不是我的问题的真正解决方案,但它是其他寻求快速解决方案的人的解决方案。

这是我用来实现它的回调函数......

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;

关于javascript - 使用文件 ://的 Delphi 和 FireMonkey WebBrowser 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48321654/

51 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com