Удаление и добавление Bootstrap 4 классов оповещений нарушает тип оповещения - PullRequest
0 голосов
/ 04 мая 2020

Я создаю систему оповещения для веб-приложения с Bootstrap 4. Вот мой код:

function bsalert(str1, str2) {

    $(".alert").addClass('show');

    $(".alert").addClass('alert-'+str1);

    $('.alert').html(str2);

    setTimeout( function() {
        $(".alert").removeClass('show');
        $(".alert").removeClass('alert-'+str1);
    }, 2000 );

}
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">


<div class="alert alert-dismissible fade text-center" role="alert" id="alert"></div>

<button type="button" class="btn btn-outline-primary" onclick="bsalert('danger', 'ALERT!');">one</button>

<button type="button" class="btn btn-outline-primary" onclick="bsalert('success', 'nice');">two</button>


<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>

Проблема, с которой я сталкиваюсь, заключается в том, что если вы сделаете это слишком быстро, то перед тем, как таймер удалит класс, он лишится возможности изменять типы оповещений. Как я могу это исправить? Есть ли в Bootstrap встроенная улучшенная функция?

Редактировать: В этом примере я упростил количество типов предупреждений, поскольку на самом деле это больше, чем просто danger и success.

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Теперь, если вы используете функцию заданного времени ожидания, предупреждение будет скрываться с интервалом в 2 секунды, поэтому в то же время, если на уведомление нажимают много раз непрерывно, оно все равно будет скрывать элемент в течение 2 секунд, что может создать эффект там, где вы его видите. очень быстро, есть несколько решений, к которым можно либо добавить элемент с различным идентификатором для каждого уведомления, либо ограничить вызов функции или задержать его через две секунды, либо отключить кнопку уведомления на 2 секунды, чтобы вызывать уведомление только через каждые 2 секунды вы также можете использовать функцию очистки тайм-аута javascript.

var timeoutElem;

function bsalert(str1, str2) {
  var alertClassString = 'alert-' + str1;
  var existingClass = '';
  clearTimeout(timeoutElem);
  existingClass = (str1 === "danger") ? 'alert-success' : 'alert-danger';
  $(".alert").removeClass(existingClass);
  $(".alert").addClass(alertClassString);
  $(".alert").removeClass('show');
  $(".alert").addClass('show');
  $('.alert').html(str2);
  timeoutElem = setTimeout(function() {
    $(".alert").removeClass('show');
  }, 2000);
}
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">


<div class="alert alert-dismissible fade text-center" role="alert" id="alert"></div>

<button type="button" class="btn btn-outline-primary" onclick="bsalert('danger', 'ALERT!');">one</button>

<button type="button" class="btn btn-outline-primary" onclick="bsalert('success', 'nice');">two</button>


<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
0 голосов
/ 04 мая 2020

Я надеюсь, что это поможет вам

var timer;
function bsalert(str1, str2) {

      clearTimeout(timer)
      $(".alert").removeClass('show');
      $(".alert").removeClass('alert-danger');
      $(".alert").removeClass('alert-success');

    $(".alert").addClass('show');

    $(".alert").addClass('alert-'+str1);

    $('.alert').html(str2);
    
    timer=setTimeout( function() {
        $(".alert").removeClass('show');
        $(".alert").removeClass('alert-'+str1);
    }, 2000 );

}
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">


<div class="alert alert-dismissible fade text-center" role="alert" id="alert"></div>

<button type="button" class="btn btn-outline-primary" onclick="bsalert('danger', 'ALERT!');">one</button>

<button type="button" class="btn btn-outline-primary" onclick="bsalert('success', 'nice');">two</button>


<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...