为什么 Javascript 即使在数组在 pop() 中完成后仍继续 运行
Why Javascript keep on running even after array finished in pop()
我正在尝试使用 TamperMonkey 自动执行一些按钮点击和将数据插入网页。但是,即使插入了数组中的所有数据后,javascript 仍会继续单击按钮。我如何设置它以便一旦数组中的数据插入完成,javascript 应该停止 运行。
这是代码,用于自动将礼品卡批量输入到 shopify 中。
// ==UserScript==
// @name Shopify Gift Card Generator
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Generate Gift Cards from a list
// @author You
// @grant GM.getValue
// @grant GM.setValue
// @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js
// @match https://[myshopname].myshopify.com/admin/gift_cards
// @run-at document-idle
// ==/UserScript==
/* globals $ */
(function() {
'use strict';
//add recipient list
var rec = ["2920469463099",
"2920466415675",
];
function generateCard(code){
if($('button:contains("Issue gift card")') !== "undefined"){
//click generate gift card
$('button:contains("Issue gift card")').click();
//set recipient based on id
$('#gift_card_customer_id').attr("value", code);
//select the dollar amount eq(0) = 10, eq(1) = 25, eq(2) = 50, eq(3) = 100
$('.segmented-control.large li:eq(2) label')[0].click();
//submit!
//$('form.new_gift_card')[0].submit();
$('input[type=submit]').click();
var success = false;
function closeWindow(){
if($('.gift-card-success-heading h2:contains("RM50.00 MYR gift card successfully issued")').length == 1){
if ($('#gift-card-issue-errors:contains("There ")').length == 0) {
//close the modal and restart!
$('a.close-modal').click();
console.log('last successful recipient id: ');
console.log(GM.getValue('last'));
setTimeout(function(){
generateCard(rec.pop());
}, 750);
} else {
console.log('generation error. last code:');
console.log(GM.getValue('last'));
success = false;
}
} else {
setTimeout(function(){ closeWindow(); }, 500);
}
}
closeWindow();
return success;
} else {
generateCard(code);
}
}
function begin(){
//wait for the page to load / not over-request the shopify server
setTimeout(function(){
generateCard(rec.pop());
}, 1500);
}
begin();
})();
有什么解决问题的建议吗?谢谢。
当rec
为空时不启动下一个计时器。
if (rec.length > 0) {
setTimeout(function(){
generateCard(rec.pop());
}, 750);
}
在调用setTimeout 中的generateCard
方法之前添加检查。
当前,在数组为空后使用 undefined
值调用此方法。
setTimeout(function() {
if (rec.length > 0) {
generateCard(rec.pop());
}
}, 1500);
您可以在每个数组项的函数中使用 reducer method 和您的代码。这样当你完成数组的最后一项时执行停止。
let yourArray = [...yourData];
const reducer = (accumulator, currentValue) => {
//your button clicking logic here
};
yourArray.reduce(reducer);
我正在尝试使用 TamperMonkey 自动执行一些按钮点击和将数据插入网页。但是,即使插入了数组中的所有数据后,javascript 仍会继续单击按钮。我如何设置它以便一旦数组中的数据插入完成,javascript 应该停止 运行。 这是代码,用于自动将礼品卡批量输入到 shopify 中。
// ==UserScript==
// @name Shopify Gift Card Generator
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Generate Gift Cards from a list
// @author You
// @grant GM.getValue
// @grant GM.setValue
// @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js
// @match https://[myshopname].myshopify.com/admin/gift_cards
// @run-at document-idle
// ==/UserScript==
/* globals $ */
(function() {
'use strict';
//add recipient list
var rec = ["2920469463099",
"2920466415675",
];
function generateCard(code){
if($('button:contains("Issue gift card")') !== "undefined"){
//click generate gift card
$('button:contains("Issue gift card")').click();
//set recipient based on id
$('#gift_card_customer_id').attr("value", code);
//select the dollar amount eq(0) = 10, eq(1) = 25, eq(2) = 50, eq(3) = 100
$('.segmented-control.large li:eq(2) label')[0].click();
//submit!
//$('form.new_gift_card')[0].submit();
$('input[type=submit]').click();
var success = false;
function closeWindow(){
if($('.gift-card-success-heading h2:contains("RM50.00 MYR gift card successfully issued")').length == 1){
if ($('#gift-card-issue-errors:contains("There ")').length == 0) {
//close the modal and restart!
$('a.close-modal').click();
console.log('last successful recipient id: ');
console.log(GM.getValue('last'));
setTimeout(function(){
generateCard(rec.pop());
}, 750);
} else {
console.log('generation error. last code:');
console.log(GM.getValue('last'));
success = false;
}
} else {
setTimeout(function(){ closeWindow(); }, 500);
}
}
closeWindow();
return success;
} else {
generateCard(code);
}
}
function begin(){
//wait for the page to load / not over-request the shopify server
setTimeout(function(){
generateCard(rec.pop());
}, 1500);
}
begin();
})();
有什么解决问题的建议吗?谢谢。
当rec
为空时不启动下一个计时器。
if (rec.length > 0) {
setTimeout(function(){
generateCard(rec.pop());
}, 750);
}
在调用setTimeout 中的generateCard
方法之前添加检查。
当前,在数组为空后使用 undefined
值调用此方法。
setTimeout(function() {
if (rec.length > 0) {
generateCard(rec.pop());
}
}, 1500);
您可以在每个数组项的函数中使用 reducer method 和您的代码。这样当你完成数组的最后一项时执行停止。
let yourArray = [...yourData];
const reducer = (accumulator, currentValue) => {
//your button clicking logic here
};
yourArray.reduce(reducer);