setValue и ширина индикатора выполнения начальной загрузки не совпадают в функции jquery setInterval

#javascript #jquery #twitter-bootstrap

#javascript #jquery ( jquery ) #twitter-bootstrap

Вопрос:

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

 var timeInterval;
// For procedure parameter
var choice;
if (document.getElementById('myonoffswitch').checked == false) {
    choice = 1;
    timeInterval = 300;
} else {
    choice = 2;
    timeInterval = 13400;
};

var $bar = $('.progress-bar');
var $barWidth = $('#pBar');
var barIntervalLength = 0;
var curBarWidth = 0;
var setWidth = 0;

var percentDisplay = 0;

$bar.width(0);

var progress = setInterval(function () {
barIntervalLength = $barWidth.width() / 20;
curBarWidth = $bar.width();
setWidth = barIntervalLength   curBarWidth;

    percentDisplay = percentDisplay   5;
if (percentDisplay > 100) {
    clearInterval(progress);
    $('.progress').removeClass('active');
} else {
    $bar.width(setWidth);
    $bar.text(percentDisplay   "%");

    console.log("set: "   setWidth);
    console.log("barWidth: "   $barWidth.width());
    console.log("barIntervalLength: "   barIntervalLength);
    console.log("bar.width: "   $bar.width());
    };

}, timeInterval);
 

Ниже приведены результаты из консоли:

 set: 27.9
barWidth: 558
barIntervalLength: 27.9
bar.width: 0
set: 46.9
barWidth: 558
barIntervalLength: 27.9
bar.width: 19
set: 67.9
barWidth: 558
barIntervalLength: 27.9
bar.width: 40
 

2-я полоса.ширина: должна быть 27,9, а 3-я должна быть 55,8 (или очень близка к этим числам).

Это результаты, если флажок установлен (вариант 2), они верны:

 set: 27.9
barWidth: 558
barIntervalLength: 27.9
bar.width: 0
set: 55.9
barWidth: 558
barIntervalLength: 27.9
bar.width: 28
set: 83.9
barWidth: 558
barIntervalLength: 27.9
bar.width: 56
set: 111.9
 

Я просто бьюсь головой о свой стол, пытаясь разобраться в этом.

Надеюсь, кто-нибудь сможет объяснить мне, что происходит.

Ответ №1:

Индикаторы выполнения начальной загрузки расширяются / укорачиваются с помощью css-перехода. Функция jquery width() возвращает фактическую ширину элемента. Когда choice=1 ваш интервал составляет 300 мс, что намного меньше времени перехода. Таким образом, вы извлекаете ширину, которая находится между начальной шириной и заданной вами шириной.

Вот демонстрация того, что происходит:

 $(function() {
  setInterval(function() {
    $('.progress').width(1000);
  }, 1000);
  setInterval(function() {
    console.log($('.progress').width());
  }, 100);
}); 
 .progress {
  width: 0;
  height: 40px;
  background: blue;
  transition: linear 10s;
} 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="progress"></div> 

Вместо этого сохраните фактическую ширину, которую вы хотите, чтобы элемент был в js. Что — то вроде:

 var $bar = $('.progress-bar');
var $barWidth = $('#pBar');
var barIntervalLength = 0;
var curBarWidth = 0;

var percentDisplay = 0;

$bar.width(curBarWidth);

var progress = setInterval(function () {
barIntervalLength = $barWidth.width() / 20;
curBarWidth  = barIntervalLength ;

    percentDisplay = percentDisplay   5;
if (percentDisplay > 100) {
    clearInterval(progress);
    $('.progress').removeClass('active');
} else {
    $bar.width(curBarWidth);
    $bar.text(percentDisplay   "%");

    console.log("barWidth: "   $barWidth.width());
    console.log("barIntervalLength: "   barIntervalLength);
    console.log("bar.width: "   $bar.width());
    };

}, timeInterval);