【问题标题】:Delphi and FireMonkey WebBrowser Callback using file://Delphi 和 FireMonkey WebBrowser 使用 file:// 回调
【发布时间】:2018-06-27 13:07:23
【问题描述】:

我在应用程序中使用 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。

请您指出正确的方向吗?

【问题讨论】:

    标签: javascript delphi firemonkey twebbrowser delphi-10.2-tokyo


    【解决方案1】:

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

    通常在向服务器发送 Header 时,服务器会接受 Header,但在上述实例中,Header 是从 本地 URL发送到本地 URL,浏览器会选择它并将标头标记为格式错误。那是因为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 包管理器下载了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; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 2023-03-11
      • 1970-01-01
      • 2020-06-26
      相关资源
      最近更新 更多