在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"。
我的问题:有没有办法更新当前来源或从德尔福的铬获取真正的来源?
附言。我在真正的 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 事件中使用它。