Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.06.2018, 10:50
Новичок на форуме
Отправить личное сообщение для Fijeralt123 Посмотреть профиль Найти все сообщения от Fijeralt123
 
Регистрация: 05.06.2018
Сообщений: 4

Как реализовать выполнение скрипта по действиям с отображением?
Проектирую систему массового обслуживания, столкнулся с такой проблемой: нужно отрисовывать поступающие заявки и через определенный промежуток времени задать анимацию выхода, а затем удалить их. Проблема в том, что скрипт выполняется моментально (это меня не удивляет). Пробовал задать и setTimeout и setInterval, выходило со всем не то, что нужно, либо я не правильно писал. Знаю, что нельзя остановить выполнение скрипта, как это делает sleep в c++. И поэтому не получается решить это

<div class="simulator-QS">
  <div class="simulator-QS__channel"></div>
</div>
<p class="all-applications"></p>
<p class="valid-applications"></p>
<p class="invalid-applications"></p>



let allApplications = document.getElementsByClassName("all-applications");
let validApplications = document.getElementsByClassName("valid-applications");
let invalidApplications = document.getElementsByClassName("invalid-applications");
function simulationQS() {
  let lambda = 1, all = 0, valid = 0, invalid = 0, time = 0 ;
  let simulatorQS = document.getElementsByClassName("simulator-QS");
  for (var i=0; i<3600; i++)  {
    if(Math.random() < 1/60){
   		all++; 
      allApplications[0].innerHTML = "Всего поступающих заявок: " + all;
      if (time == 0) {
        let newApplication = document.createElement("div");
        simulatorQS[0].appendChild(newApplication);
        newApplication.className = "simulator-QS__application";
        valid++;
        validApplications[0].innerHTML = "Заявки на обслуживание: " + valid;
        time = 70;
      } else {
        invalid++;
        invalidApplications[0].innerHTML = "Отказано в обслуживании: " + invalid;
      }
    }
    if(time==2){
      let newChild = document.getElementsByClassName("simulator-QS__application");
      newChild[0].classList.add("simulator-QS__application--leave");
    }
    if(time==1){
   		let newChild = document.getElementsByClassName("simulator-QS__application");
      simulatorQS[0].removeChild(newChild[0]);
   	}		
   	if(time>0){
   		time--;
   	} 		
  }
}

simulationQS();




Код:
.simulator-QS__channel {
  width: 50px;
  height: 50px;
  background: #000; }

.simulator-QS__application {
  width: 20px;
  height: 20px;
  border-radius: 10px;
  position: relative;
  left: 15px;
  background: red;
  animation: valid-app 0.1s ease-in-out; }

.simulator-QS__application--leave {
  animation: valid-app--leave 0.1s ease-in-out; }

@keyframes valid-app {
  from {
    bottom: -30px;
    left: 30px; }
  to {
    bottom: 0;
    left: 15px; } }

@keyframes valid-app--leave {
  from {
    bottom: 0;
    left: 15px; }
  30% {
    left: -15px;
    opacity: 1; }
  to {
    bottom: -40px;
    left: -30px;
    opacity: 0; } }

Последний раз редактировалось Fijeralt123, 05.06.2018 в 10:55.
Ответить с цитированием
  #2 (permalink)  
Старый 05.06.2018, 11:56
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

Fijeralt123,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">

.simulator-QS__channel {
   position: relative;
  width: 50px;
  height: 50px;
  background: #000; }

.simulator-QS__application {
  width: 20px;
  height: 20px;
  border-radius: 10px;
  position: relative;
  left: 15px;
  bottom: -30px;
  background: red;
  }
.simulator-QS__application.app  {
    animation: valid-app 0.1s ease-in-out forwards;
}
.simulator-QS__application.leave {
  animation: valid-app--leave 0.1s ease-in-out forwards; }

@keyframes valid-app {
  from {
    bottom: -30px;
    left: 30px; }
  to {
    bottom: 0;
    left: 15px; } }

@keyframes valid-app--leave {
  from {
    bottom: 0;
    left: 15px; }
  30% {
    left: -15px;
    opacity: 1; }
  to {
    bottom: -40px;
    left: -30px;
    opacity: 0; } }
  </style>

  <script>
document.addEventListener("DOMContentLoaded", function() {
    var allApplications = document.getElementsByClassName("all-applications");
    var validApplications = document.getElementsByClassName("valid-applications");
    var invalidApplications = document.getElementsByClassName("invalid-applications");

    function addCls(elem, cls, parent) {
        return function() {
            parent && parent.appendChild(elem);
            elem.classList.add(cls)
        }
    }

    function removeElem(elem, parent) {
        return function() {
            parent.removeChild(elem)
        }
    }

    function simulationQS() {
        var lambda =
            1,
            all = 0,
            valid = 0,
            invalid = 0,
            time = 0;
        var simulatorQS = document.getElementsByClassName("simulator-QS");
        var parent = simulatorQS[0];
        for (var i = 0; i < 20; i++) {
            all++;
            allApplications[0].innerHTML = "Всего поступающих заявок: " + all;
            var newApplication = document.createElement("div");
            newApplication.className = "simulator-QS__application";
            if (Math.random() < .5) {
                valid++;
                validApplications[0].innerHTML = "Заявки на обслуживание: " +
                    valid
            } else {
                invalid++;
                invalidApplications[0].innerHTML = "Отказано в обслуживании: " + invalid
            }
            window.setTimeout(addCls(newApplication, "app", parent), i * 100);
            window.setTimeout(addCls(newApplication, "leave"), i * 100 + 60 * 105);
            window.setTimeout(removeElem(newApplication, parent), i * 100 + 60 * 105 + 100)
        }
    }
    simulationQS()
});
  </script>
</head>

<body>
<div class="simulator-QS">
  <div class="simulator-QS__channel"></div>
</div>
<p class="all-applications"></p>
<p class="valid-applications"></p>
<p class="invalid-applications"></p>

</body>
</html>
Ответить с цитированием
  #3 (permalink)  
Старый 05.06.2018, 12:02
Новичок на форуме
Отправить личное сообщение для Fijeralt123 Посмотреть профиль Найти все сообщения от Fijeralt123
 
Регистрация: 05.06.2018
Сообщений: 4

Да, почти то, что нужно. А как сделать, чтобы перед появлением второй заявки, первая уходила. То есть не образовывалась очередь, а была только одна заявка в очереди
Класс, у меня даже так не получалось сделать.
Ответить с цитированием
  #4 (permalink)  
Старый 05.06.2018, 12:13
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

Fijeralt123,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">

.simulator-QS__channel {
   position: relative;
  width: 50px;
  height: 50px;
  background: #000; }

.simulator-QS__application {
  width: 20px;
  height: 20px;
  border-radius: 10px;
  position: relative;
  left: 15px;
  bottom: -30px;
  background: red;
  }
.simulator-QS__application.app  {
    animation: valid-app 0.1s ease-in-out forwards;
}
.simulator-QS__application.leave {
  animation: valid-app--leave 0.1s ease-in-out forwards; }

@keyframes valid-app {
  from {
    bottom: -30px;
    left: 30px; }
  to {
    bottom: 0;
    left: 15px; } }

@keyframes valid-app--leave {
  from {
    bottom: 0;
    left: 15px; }
  30% {
    left: -15px;
    opacity: 1; }
  to {
    bottom: -40px;
    left: -30px;
    opacity: 0; } }
  </style>

  <script>
document.addEventListener("DOMContentLoaded", function() {
    var allApplications = document.getElementsByClassName("all-applications");
    var validApplications = document.getElementsByClassName("valid-applications");
    var invalidApplications = document.getElementsByClassName("invalid-applications");

    function addCls(elem, cls, parent) {
        return function() {
            parent && parent.appendChild(elem);
            elem.classList.add(cls)
        }
    }
    let i = 20,
        all = 0,
        valid = 0,
        invalid = 0,
        simulatorQS = document.getElementsByClassName("simulator-QS"),
        parent = simulatorQS[0];

    function removeElem(elem, parent) {
        return function() {
            parent.removeChild(elem);
            --i && simulationQS()
        }
    }

    function simulationQS() {
            all++;
            allApplications[0].innerHTML = "Всего поступающих заявок: " + all;
            var newApplication = document.createElement("div");
            newApplication.className = "simulator-QS__application";
            if (Math.random() < .5) {
                valid++;
                validApplications[0].innerHTML = "Заявки на обслуживание: " +
                    valid
            } else {
                invalid++;
                invalidApplications[0].innerHTML = "Отказано в обслуживании: " + invalid
            }
            window.setTimeout(addCls(newApplication, "app", parent), 0);
            window.setTimeout(addCls(newApplication, "leave"), 300);
            window.setTimeout(removeElem(newApplication, parent), 450)
        }

    simulationQS()
});
  </script>
</head>

<body>
<div class="simulator-QS">
  <div class="simulator-QS__channel"></div>
</div>
<p class="all-applications"></p>
<p class="valid-applications"></p>
<p class="invalid-applications"></p>

</body>
</html>
Ответить с цитированием
  #5 (permalink)  
Старый 05.06.2018, 12:17
Новичок на форуме
Отправить личное сообщение для Fijeralt123 Посмотреть профиль Найти все сообщения от Fijeralt123
 
Регистрация: 05.06.2018
Сообщений: 4

рони,
Вы мне очень сильно помогли. Огромное спасибо!
Ответить с цитированием
  #6 (permalink)  
Старый 05.06.2018, 13:57
Новичок на форуме
Отправить личное сообщение для Fijeralt123 Посмотреть профиль Найти все сообщения от Fijeralt123
 
Регистрация: 05.06.2018
Сообщений: 4

рони,
Хоть убейте, не могу ваш код переделать под свои условия. Либо делаю переполнение стека браузера, либо начинают выводиться все заявки сразу, либо и то и другое вместе. Прошу еще раз помощи.
У меня есть условная единица времени i она равняется секунде. Мне нужно провести симуляцию одного часа. Заявка поступает в секунду с вероятностью Math.random() < .02. И после, эта заявка попадает на обслуживание равное time. Следующие заявки, если поступают, когда заявка обслуживается(time !=0) отклоняются. Когда заявка обслужится она уходит и след. заявка может попасть на обслуживание
Ответить с цитированием
  #7 (permalink)  
Старый 05.06.2018, 15:22
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,121

Fijeralt123,
не могу представить, ... что вам нужно
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнение скрипта если есть html элемент Янковиц Элементы интерфейса 2 24.10.2017 21:47
Боковая навигация для LandingPage как реализовать? Black_Star jQuery 4 21.02.2017 21:37
Как включить синхронное выполнение строк? SkaN Элементы интерфейса 1 26.04.2012 22:28
Как остановить выполнение скрипта? ichisen Events/DOM/Window 2 12.04.2012 14:21
Остановить выполнение скрипта Nonam Общие вопросы Javascript 22 04.05.2009 01:45