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");
}
}