Я написал сценарий для выполнения некоторых автоматических действий на веб-сайте (который не мой).JS игнорирует мой setInterval
Этот сайт является своего рода интернет-магазином для ПК-игры. Пользователь выбирает элемент и нажимает кнопку «снять». Когда сайт находится под большой нагрузкой (довольно часто), пользователь часто получает сообщение с надписью «Тяжелая загрузка - повторите попытку!». и он должен нажать одну и ту же кнопку снова и снова, пока он не получит предмет или не получит сообщение «Товар уже продан!».
Все работает внутри хромированного удлинителя!
Мой сценарий выполняет следующие действия:
Добавить событие OnClick для кнопки, чтобы запустить функцию
Нажмите "отзывать"
Прочитайте сообщение, которое приходит от сайт
Зависит от сообщения:
«Предложение отправляется ...» - Ничего не делать и читать снова после того, как интервал
«Пункт был уже продан!» - Остановить интервал
«Тяжелая нагрузка - попробуйте еще раз!» - Нажмите на элемент, чтобы удалить сообщение и «вывести» снова
Проблема:
интервал установлен в 2000 мс, но сценарий просто кажется, спамить кнопку вывести nonstop и, похоже, игнорирует clearInterval().
Мой код:
function buy() {
//Get the innerHTML for the box that displays the message
var message = document.getElementsByClassName("pm-content")[0].innerHTML;
//Message: Offer is being sent! - DO NOTHING!
if (message == "Please wait while your trade offer is being sent...") {
console.log("Loading: Going on!")
}
//Message: Item is gone! - STOP EVERYTHING!
if (message == "Items unavailable") {
console.log("Unavailable: Stopping!")
clearInterval(buyInterval);
}
//Message: Transaction successfull! - STOP EVERYTHING
if (message.includes("Trade offer has been sent! Code: ")) {
console.log("Success: Stopping!")
clearInterval(buyInterval);
}
if (message == "Heavy load! - Try again!") {
console.log("Overload: Going on!")
document.getElementById("pgwModal").click(); //Click to remove the message
document.getElementById("withdraw").click(); //Click withdraw again
}
}
function forceBuy() {
buyInterval = setInterval(function(){ buy() }, 2000);
}
var button = document.getElementById("withdraw");
withdraw.onclick=function(){ forceBuy() };
Любая помощь приветствуется!
Edit_1
код прямо сейчас:
(function(){ //creating isolated scope to avoid using global variables.
var buyInterval; // declaring sharing variables.
function buy() {
var message = document.getElementsByClassName("pm-content")[0].innerHTML;
if (message == "Please wait while your trade offer is being sent...<br><small>(this might take up to 5 minutes)</small>") {
console.log("Loading: Going on!")
}
if (message == "You cannot afford that withdrawal.") {
console.log("Broke: Stopping!")
document.getElementById("pgwModal").click();
clearInterval(buyInterval);
}
if (message == "Items unavailable") {
console.log("Unavailable: Stopping!")
document.getElementById("pgwModal").click();
clearInterval(buyInterval);
}
if (message.includes("Trade offer has been sent!")) {
console.log("Success: Stopping!")
clearInterval(buyInterval);
}
if (message.includes("missing")) {
console.log("Missing: Stopping")
document.getElementById("pgwModal").click();
clearInterval(buyInterval);
}
if (message == "You can have only one pending deposit or withdrawal.") {
console.log("Pending: Stopping!")
document.getElementById("pgwModal").click();
clearInterval(buyInterval);
}
if (message == "Too many active trades") {
console.log("Overload: Going on!")
document.getElementById("pgwModal").click();
document.getElementById("withdraw").click();
}
}
function forceBuy() {
return setInterval(function(){ buy(); }, 2000); // not necessary but // will be more readable
}
var button = document.getElementById("withdraw");
withdraw.onclick=function(){ //making a closure to catch buyInterval variable
buyInterval = forceBuy();
};
}())
Благодаря Vitalii для этого кода - это, кажется, работает лучше, так как это не постоянно спамить кнопку больше. К сожалению, другая проблема остается: Если сценарий достигает, например, эту часть кода:
if (message.includes("Trade offer has been sent!")) {
console.log("Success: Stopping!")
clearInterval(buyInterval);
}
Он успешно читает сообщение и выводит «Success: Остановка» - раз в две секунды ... продолжается, пока я не прекращу это делать вручную. Похоже, clearInterval (buyInterval); все еще игнорируется.
Что я здесь делаю неправильно?
Pls показать, как и где вы объявляете buyInterval – Vitalii
Что такое соответствующий HTML (кнопки и, возможно, окружающие формы)? – devnull69
buyInterval объявляется внутри функции forceBuy. Я новичок в JS, и я думаю, что я узнал, что перед ним не должно быть «var», чтобы сделать его доступным для всего скрипта. Это неправильно? (Будет добавлен соответствующий html к моему оригинальному сообщению через несколько минут. Не на компьютере прямо сейчас - но это просто кнопка ususal, ничего особенного и фактический щелчок на кнопке не работает.) –