大胆表示更新。实现了遍历数组的一个跑步者
我有一个数组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)
,将贯穿每个步骤。步骤[0] .action将在步骤[0] .element上执行。由于步骤[0]可以在步骤[1]中创建与dom元素(,通过AJAX)进行交互,所以跑步者需要等待特定的时间段(因此超时),轮询dom为步骤[1]。元素的存在。
这是一个粗略的拿一下我到目前为止有:
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");
}
}
不''代表一个jQuery对象,或用作jQuery选择只是一个CSS选择器?如果它已经是一个jQuery对象,那么当新元素添加到DOM时不会更新... –
谢谢。目前它是一个jqueryobject我将不得不更新,以使用选择器。 –
如果您的选择器是一个类选择器,并且该类的页面上还有其他元素,那么您如何知道前一个函数是否已完成其作业? –