提问人:ZORRO_BLANCO 提问时间:7/21/2019 最后编辑:Bahman Parsa ManeshZORRO_BLANCO 更新时间:7/22/2019 访问量:459
运行时的页面源代码更新 - Chromium
Page source update on run time - Chromium
问:
在 chromium 上,您可以使用 GetSourceProc 获取页面源代码,就像我在互联网上找到的这个 delphi 代码一样:
procedure TForm1.Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame;
httpStatusCode: Integer);
begin
Chromium1.Browser.MainFrame.GetSourceProc(StringVisitor);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
chromium1.load('http://www.google.com');
end;
procedure TForm1.StringVisitor(const str: ustring);
begin
mySource := str;
end;
代码运行良好,我可以完美地从 mySource 变量中获取源代码,但是当我更改页面上的数据然后重新调用代码以获取源代码时,我会得到旧数据,例如我有一个 HTML 输入:
<input name="edtFName" type="text" value="ZORRO" id="FName" title="First Name">
所以 HTML 输入的文本是“ZORRO”,当我将文本更改为“ZARA”并在 delphi 上获取源代码时,我仍然在输入中获取文本“ZORRO”。
我的问题是:有没有办法更新当前来源或从 delphi 上的 chromium 获取真正的来源?
我在真正的 chrome 浏览器上打开了 HTML 页面,并更改了输入中的文本,之后我将页面保存为新文件,然后我打开新文件并检查其中的源代码,发现旧文本而不是真正的新文本,这真的是正确的行为吗, 如果我有一个大的 html 表单,里面填写了很多数据并想保存页面,那么一切都会丢失,这对我来说看起来像一个错误,因为它不保存当前页面。
答:
如果 Chrome/Chromium 在获取源代码时给出了原始输入值,那么您使用的 CEF 包装器就无法阻止它。
我认为保存 HTML 和新值的最简单方法是单独执行。
您已经知道如何保存 HTML,您只需要一个函数来获取所有新的表单值,另一个函数可以在加载 HTML 文件时设置这些表单值。
读取新表单值的函数将执行搜索表单元素的 JavaScript 代码以获取如下值:
var mynewvalue = document.getElementById('MyInputId').value;
然后,您将调用 JavaScript 扩展中的函数以将 mynewvalue 发送到 Delphi。
您需要先注册一个自定义 JavaScript 扩展,然后才能使用进程消息获取将它们发送到 Delphi 的值。执行此操作所需的所有代码都已在名为 JSRTTIExtension 的 CEF4Delphi 演示中,而 JS 扩展则位于 uTestExtension.pas 中。该扩展具有为此目的所需的 sendresulttobrowser 函数。
加载 HTML 文件时设置保存值的函数只需要几行 JavaScript 来搜索表单元素并设置如下值:
document.getElementById('MyInputId').value = mysavedvalue;
使用 TChromium.ExecuteJavaScript 执行所有 JavaScript 代码,您可以在 TChromium.OnLoadEnd 事件中使用它。
评论