setTimeout不适用于注入的JavaScript?

时间:2015-08-19 14:28:37

标签: javascript delphi twebbrowser delphi-xe8 tembeddedwb

我有一个带有此内容的外部JavaScript文件 mypapopup.js

function mypopup() {
alert("Hello stackoverflow")
}

在Delphi XE8 VCL表单应用程序中,使用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;

请注意,使用此代码,脚本标记将添加到HEAD部分,该部分引用外部JavaScript文件mypapopup.js

然后调用外部JavaScript文件中的mypopup函数,延迟时间为1000毫秒。

点击我的Delphi程序中的按钮btnPopupJS后没有任何反应。

只有在我的Delphi程序中单击按钮btnPopupJS后,第二次执行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;

2 个答案:

答案 0 :(得分:0)

我认为执行setTimeout(mypopup, 1000);时会出现引用错误,因为尚未加载外部js文件,因此在执行该行时mypopup未知。

请更改

setTimeout(mypopup, 1000);

setTimeout(function() { mypopup(); }, 1000);

答案 1 :(得分:0)

我也有同样的问题。我用这段代码解决了这个问题:



window.setTimeout(function(){ mypopup();},5000);




也许这对你很有帮助