0

我刚刚开始使用 CEF4Delphi。我在页面控件的选项卡上有一个铬窗口。网页上的元素附加了 javascript 挂钩,这些挂钩注册点击并触发原生 delphi 代码。这一切都在一个网页上正常工作。我可以切换标签并继续点击网页并接收点击事件。

但是,当加载不同的网页时,会出现一些奇怪的行为。第一次加载选项卡时,点击会被很好地注册。切换选项卡时会出现问题。第二次加载选项卡时,未注册任何点击。

第二个网页是由 blazor 创建的,这与第一个不同,但我不确定为什么会影响它。

我已经使用 Google.com 进行了测试,它在那里也可以正常工作。

Chromium1.LoadURL('localhost:6064');

在加载选项卡时运行。

class procedure TmyExtension.ButtonClick(const data: string);
var
  msg: ICefProcessMessage;
begin
  msg := TCefProcessMessageRef.New('ButtonClick');

  TCefv8ContextRef.Current.Browser.MainFrame.SendProcessMessage(PID_BROWSER, msg);
end;

delphi 代码被触发

Chromium1.browser.MainFrame.ExecuteJavaScript(
          'document.getElementById("'+
          'NewButton' +
          '").addEventListener("click", function(evt){' +
          'function getpath(n){var ret = n.id;' +
            'if (n.parentNode){return "" + ret}' +
            'else return ret};'
          'myextension.ButtonClick(getpath(evt.target))' +
          '})', Chromium1.browser.MainFrame.GetURL, 0);

正在执行的 Javascript

procedure TtabWebPage.Chromium1ProcessMessageReceived(Sender: TObject;
  const browser: ICefBrowser; const frame: ICefFrame;
  sourceProcess: TCefProcessId; const message: ICefProcessMessage;
  out Result: Boolean);
begin
  if (message = nil) or (message.ArgumentList = nil) then exit;

  // This function receives the messages with the JavaScript results
  if (message.Name = 'ButtonClick') then  begin
    Inc(FCount);
    Result := True;
  end;
  inherited;
end;

接收铬消息并增加计数。

似乎没有办法调试 javascript 是否正在运行。每次页面加载时肯定会运行 ExecuteJavaScript 函数。我想知道是否与导致此问题的网页的 blazor 方面有关,或者是否有任何方法可以调试该问题。

4

0 回答 0