-1

我有一个包含以下内容的外部 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

然后以mypopup1000 毫秒的延迟调用来自外部 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;
4

2 回答 2

0

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

请更换

setTimeout(mypopup, 1000);

setTimeout(function() { mypopup(); }, 1000);
于 2015-08-20T06:20:50.090 回答
0

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

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

也许对你有帮助

于 2016-09-27T19:40:44.707 回答