BOLD表示更新。
我有一个数组 ,steps
其内容是具有与之关联的动作和元素的对象。像这样:
steps = [{action: 'click', element: <jQuery element>},
{action: 'click', element: <jQuery element>}, ., ., N]
我想实现一个跑步者,他的工作是遍历数组中的每个元素并对元素执行特定的操作。每个步骤都必须按顺序执行。例如,如果您有:
steps = [{action: 'click', element: <jQuery element representing a button>},
{action: 'click', element: <jQuery element representing an anchor tag>}]
运行, run(steps, timeout)
, 将贯穿每一步。step[0].action 将在 step[0].element 上执行。由于 step[0] 可以创建要在 step[1] 中交互的 dom 元素(通过 AJAX),因此运行器需要等待特定的时间段(因此,超时),轮询 dom 以获取step[1].element 的存在。
这是我到目前为止的粗略看法:
var run = function() {
$.each(steps, function(i, v) {
var interval = 25,
start = 0,
timeout = 3000;
var i = setInterval(function(timeout) {
start = start + interval;
console.log(start);
if ($(v).is(':visible')) {
v.click();
console.log('clicked', v);
clearInterval(i);
}
}, interval);
});
};
请注意,在上面的示例中,steps
它只是一个 jquery 对象数组。它还不是所需的格式:
steps = [{action: 'click', element: <jQuery element>},
{action: 'click', element: <jQuery element>}, ., ., N]
可以说,我需要遵循的“模式”是什么?我需要使用延迟对象来解决这个问题吗?它是用 setTimeout、setInterval 实现的吗?谢谢!
最终实施
var run = function(steps, interval, timeout) {
var timer,
time = 0,
i = 0;
runSingle(steps[0]);
function abort() {
console.log("Run aborted");
}
function runSingle(step) {
timer = setInterval(function() {
time += interval;
if ($(step.element).is(':visible') === true) {
clearInterval(timer);
time = 0;
$(step.element).trigger(step.action);
(i < (steps.length - 1)) && runSingle(steps[++i]);
} else if (time >= timeout) {
clearInterval(timer);
abort();
}
}, interval);
console.log("Performed: ", step.action, "on", step.element)
if (i === (steps.length - 1)) console.log("Run successful");
}
}