我有一个包含以下内容的外部 JavaScript 文件mypapopup.js:
function mypopup() {
alert("Hello stackoverflow")
}
在 Delphi XE8 VCL Form 应用程序中,TEmbeddedWB.ExecScript
我将此 JavaScript 注入到 EmbeddedWB 中加载的文档中:
procedure TForm1.btnPopupJSClick(Sender: TObject);
begin
EmbeddedWB1.ExecScript('var script = document.createElement(''script'');' +
'script.src = "mypapopup.js";' +
'script.setAttribute(''type'', ''text/javascript'');' +
'document.getElementsByTagName(''head'')[0].appendChild(script);' +
'setTimeout(mypopup(), 1000);'
,'JavaScript');
end;
请注意,使用此代码,脚本标记被添加到引用外部 JavaScript 文件的 HEAD 部分mypapopup.js
。
然后以mypopup
1000 毫秒的延迟调用来自外部 JavaScript 文件的函数。
btnPopupJS
在我的 Delphi 程序中单击一次按钮后,没有任何反应。
只有在第二次单击btnPopupJS
我的 Delphi 程序中的按钮后,JavaScript 弹出窗口才会立即执行!
当我将setTimeout
延迟增加到例如 5000 毫秒时也是这种情况,在第二次单击按钮之后,弹出窗口在没有延迟的情况下执行。
那么有没有办法等到外部 JavaScript 加载完毕,然后自动执行mypopup
函数呢?
编辑:我找到了解决方案,但我不知道这是否是最佳解决方案:
procedure TForm1.btn1Click(Sender: TObject);
var
t, tt: Int64;
begin
EmbeddedWB1.ExecScript('var script = document.createElement(''script'');' +
'script.src = "mypapopup.js";' +
'script.setAttribute(''type'', ''text/javascript'');' +
'document.getElementsByTagName(''head'')[0].appendChild(script);'
// + 'setTimeout(mypopup, 1000);'
,'JavaScript');
t := TThread.GetTickCount;
repeat
tt := TThread.GetTickCount - t;
Application.ProcessMessages;
until tt > 1000;
EmbeddedWB1.ExecScript('mypopup();', 'JavaScript');
end;