【发布时间】:2018-01-09 22:54:46
【问题描述】:
这不是我第一次遇到这个问题,经过彻底搜索,我看到很多人遇到同样的问题,但没有解决方案。我希望有一个我以前从未听说过的神奇 API,或者也许有人告诉我我只是老做错了。 :-P
我有一个脚本,它模拟单击元素作为循环块中的第一个动作。
这会导致出现自定义模式对话框。
然后我需要对这个对话框做一些事情,然后模拟一个按钮的点击。
for (day in daysOfWeek) {
if (daysOfWeek.hasOwnProperty(day)) {
daysOfWeek[day].click();
fillOutTime(dailyTimes);
}
}
在这里,我将简化 fillOutTime 中的代码并将其包含在循环中,以便您可以看到我在做什么:
var day, submitButton;
for (day in daysOfWeek) {
if (daysOfWeek.hasOwnProperty(day)) {
daysOfWeek[day].click(); //opens dialog
//fill out some stuff
submitButton = document.getElementById('time_entry_submit'); //get submit button
submitButton.click(); //click the submit button
}
}
但是,在第一次单击之后,对话框异步加载显然存在延迟。
我想做的是等到这个对话框出现,然后执行循环中的其余代码。
好的,这是我已经尝试过的:
-
setTimeout() 和 setInterval() - 这些当然不起作用,因为它们是异步的,所以循环只是以超高速将这些异步事件排队。
李> 自定义睡眠功能(见下文)。这只是锁定浏览器,因此对话框在完成之前不会开始加载。我最终遇到了同样的问题,即其余代码在加载之前仍在运行。
function sleep(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > milliseconds) {
break;
}
}
}
任何建议都将不胜感激!
【问题讨论】:
-
我不能完全理解您的问题,因为如果您使用动画,您可以捕获“animationend”事件,但如果您只是应用“显示:块”或"visibility: visible",那么您可以在更改属性的行之后直接调用您的函数。另一个简单的答案是使用回调,在引发“点击”事件时发送的“事件”变量中,您可以添加个性化属性。类似于: e.personalCallback = function () { .... }; element.click(e);你可以在你的听众中使用“personalCallback”
-
我不明白为什么它不适用于
setTimeout()。模态通常以毫秒为单位打开,默认为 400 毫秒,“快”为 200 毫秒,“慢”为 600 毫秒。我认为您在变量上有范围问题。但是您没有提供足够的代码来确定。我认为没有人能正确回答您,因此我将您的问题投给了 unclear。
标签: javascript jquery loops asynchronous synchronous