setTimeout在注入JavaScript中不起作用



我有一个外部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);

也许对你有帮助

最新更新