我正在尝试在网页上自动执行某些操作,但遇到一些变量setInterval延迟问题。代码根据类名提取元素列表,并迭代每个元素,执行动作,在页面上动态创建新元素,一旦处理集合中的元素,代码应重新拉出类元素并迭代新集合一遍又一遍。
我希望主延迟取决于它从页面中提取的类元素的数量,并每次迭代。此代码将在Chrome中的控制台上运行。
这是我没有可变延迟的原始工作代码:
var finishedActions = [];
var actionDelaySec = 5;
var totActionsInLoop;
setInterval( function() {
var pageElementsToActOn = document.getElementsByClassName('classname');
totActions = pageElementsToActOn.length;
for(var i =0; i < pageElementsToActOn.length; i++) {
(function(i){
window.setTimeout(function(){
var actionText = pageElementsToActOn[i].textContent;
if (finishedActions.indexOf(actionText) > -1) {
console.log("already finished action");
} else {
finishedActions.push(actionText);
console.log(actionText);
pageElementsToActOn[i].click();
}
}, i * actionDelaySec * 1000);
}(i));
}
console.log("New Loop");
}, 10000);
我第一次尝试将10000数字更改为变量导致崩溃,因为在运行时无法更改setInterval延迟。
经过一些研究后,我认为我可以递归地嵌套我的函数,每次都会以新的延迟调用自己。
此代码也有效,但由于某些原因,每次调用main函数时都不会更改实际延迟,而是将延迟设置为第一次迭代运行的任何延迟:
var finishedActions = [];
var actionDelaySec = 160;
var totActionsInLoop = 5;
var totActionsMade = 0;
var myFunction = function(){
var pageElementsToActOn = document.getElementsByClassName('classname');
totActionsInLoop = pageElementsToActOn.length;
for(var i =0; i < pageElementsToActOn.length; i++) {
(function(i){
window.setTimeout(function(){
var actionText = pageElementsToActOn[i].textContent;
if (finishedActions.indexOf(actionText) > -1) {
console.log("already finished action (" + actionText + ").");
} else {
finishedActions.push(actionText);
console.log(actionText + " Connected At: " + timeStamp());
totActionsMade++;
pageElementsToActOn[i].click();
}
}, i * (actionDelaySec * 1000));
}(i));
}
console.log("New Loop -- Actions on page: " + totActionsInLoop + "-- Total actions finished: " + totActionsMade + " -- Started At: " + timeStamp());
setInterval(myFunction, (totActionsInLoop * (actionDelaySec * 1000)));
};
myFunction();
任何人都可以向我解释为什么延迟不随每个新函数调用而改变,并且可能帮助我修复代码按预期工作?
感谢。