我有一个外部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文件mypapopup.js
的HEAD部分。
然后调用外部JavaScript文件中的mypopup
函数,延迟1000毫秒。
在我的Delphi程序中点击一次按钮btnPopupJS
后,没有任何事情发生。
只有在点击按钮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;
我认为在执行setTimeout(mypopup, 1000);
时会出现引用错误,因为外部js文件尚未加载,因此在执行该行时mypopup
是未知的。
请修改
setTimeout(mypopup, 1000);
setTimeout(function() { mypopup(); }, 1000);
我也遇到了同样的问题。我用下面的代码解决了这个问题:
window.setTimeout(function(){ mypopup();},5000);
也许对你有帮助