Javascript 如何使for循环在移动到下一个迭代之前等待一个元素
我有一个带有XPath数组的for循环,它选择按钮元素并在选择框中选择一个选项。对于每个数组项,应该逐个执行此操作。我的代码或多或少可以工作,但如果元素为null,则不会等待option元素。我希望for循环在执行for循环中的其余代码并移动到下一个迭代之前,尝试查找元素,直到找到为止Javascript 如何使for循环在移动到下一个迭代之前等待一个元素,javascript,jquery,for-loop,Javascript,Jquery,For Loop,我有一个带有XPath数组的for循环,它选择按钮元素并在选择框中选择一个选项。对于每个数组项,应该逐个执行此操作。我的代码或多或少可以工作,但如果元素为null,则不会等待option元素。我希望for循环在执行for循环中的其余代码并移动到下一个迭代之前,尝试查找元素,直到找到为止 case = ["xpath1", "xpath2", "xpath3", "xpath4"]; function loopThroughArray(case) { for (var i = 0; i
case = ["xpath1", "xpath2", "xpath3", "xpath4"];
function loopThroughArray(case) {
for (var i = 0; i <case.length; i++) {
(function(i) {
setTimeout(function() {
//start - getting the corresponding elements and clicking it
var dt_links = document.evaluate(case[i], document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
var dtLinks = dt_links.snapshotLength;
if (dtLinks != 0) {
for (var a = 0; a < dtLinks; ++a) {
dt_links.snapshotItem(a).click();
}
var ex = document.evaluate("//select/optgroup/option[contains(text(),'new item')]", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
var expEl = ex.snapshotItem(0);
if (expEl == null) {
console.log("new item option is not available");
}
else{
//"new item" option is selected
ex.snapshotItem(0).selected = true
var exp = $('select')[2] //select box
console.log(exp)
if ("createEvent" in document) {
var evt = document.createEvent("HTMLEvents");
evt.initEvent("change", false, true);
exp.dispatchEvent(evt);
} else {
exp.fireEvent("onchange");
console.log("change event to be fired");
}
}
}
}, 1500 * i);
})(i);
};
}
loopThroughArray(case);
case=[“xpath1”、“xpath2”、“xpath3”、“xpath4”];
函数环通通道(案例){
对于(var i=0;i而言,是SetTimeout
使代码立即返回,从而几乎一次启动所有超时
我相信,通过创建递归函数而不是for循环,您可以实现您想要的:
var recursiveFunc = function(i) {
setTimeout(function() {
...
if(i < case.lenght - 1){
recursiveFunc(i++)
}
}, 1500 * i);
})(0)
var recursiveFunc=函数(i){
setTimeout(函数(){
...
如果(i
编辑根据注释,即使数组太长,似乎也无法耗尽堆栈。是设置超时
使代码立即返回,因此几乎一次启动所有超时
我相信,通过创建递归函数而不是for循环,您可以实现您想要的:
var recursiveFunc = function(i) {
setTimeout(function() {
...
if(i < case.lenght - 1){
recursiveFunc(i++)
}
}, 1500 * i);
})(0)
var recursiveFunc=函数(i){
setTimeout(函数(){
...
如果(i
编辑根据评论,即使数组太长,似乎也无法耗尽堆栈。通过“选择”您是指用户触发了change
事件还是以编程方式完成的?很抱歉不清楚,是的,我指的是通过“选择”的特定选项触发change事件你是说用户正在触发<代码>更改代码>事件,还是通过编程方式完成的?很抱歉不清楚,是的,我的意思是使用特定选项触发更改事件SetTimeout基本上是启动一个新堆栈,这样你就不会在这里遇到溢出问题。这很好:)。嗨,pablo,谢谢你的建议,但我仍然得到null elMent,函数没有等待元素很可能是因为您使用保留字case
作为变量与您的errorsetTimeout基本上是启动一个新堆栈,所以您不会在这里遇到溢出问题。这很好:)。嗨,pablo,谢谢您的建议,但我仍然得到空元素,functionn不是在等待元素。也许您使用保留字case
作为变量与您的错误有关