2016-06-10 3 views
2

Я написал сценарий для выполнения некоторых автоматических действий на веб-сайте (который не мой).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); все еще игнорируется.

Что я здесь делаю неправильно?

+2

Pls показать, как и где вы объявляете buyInterval – Vitalii

+0

Что такое соответствующий HTML (кнопки и, возможно, окружающие формы)? – devnull69

+0

buyInterval объявляется внутри функции forceBuy. Я новичок в JS, и я думаю, что я узнал, что перед ним не должно быть «var», чтобы сделать его доступным для всего скрипта. Это неправильно? (Будет добавлен соответствующий html к моему оригинальному сообщению через несколько минут. Не на компьютере прямо сейчас - но это просто кнопка ususal, ничего особенного и фактический щелчок на кнопке не работает.) –

ответ

2
(function(){ //creating isolated scope to avoid using global variables. 
var buyInterval; // declaring sharing variables. 

    function buy() { 
      ... buying action 
    } 

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

}()) 
+0

Итак, я могу просто добавить мой код if в функцию «купить функцию», чтобы сделать эту работу? Я думаю, что я лишь частично понимаю ваш код, но поиск изолированных областей и переменных обмена может помочь. Я попробую, как только сайт выйдет из режима обслуживания и даст обратную связь! Спасибо, Виталий! –

+0

Эй, кнопка спама остановилась, но clearInterval все еще не работает. Я добавил что-то до конца моего оригинального сообщения. Я не понимаю, почему это не останавливает сценарий ... спасибо заранее! –

+0

Хорошо, плохо возьмите свой код и проверьте. Скоро вернется – Vitalii

0

переписать функцию forceBuy, как это -

function forceBuy() { 
    if(buyInterval) clearInterval(buyInterval); 
    buyInterval = setInterval(function(){ buy() }, 2000); 
} 
Смежные вопросы