2016-08-02 2 views
-2

У меня есть два куска java-скрипта, один для показа процентного результата в индикаторе выполнения, один для отображения скорости в другой строке.Javascript, конфликтующий с eachover

В настоящий момент только один батон восстанавливает данные, другой нет.

JavaScrip

// Progress bar javascrip reults 
    { 
     var elem = document.getElementById("myBar"); 
     var width = 0; 
     var id = setInterval(frame, 50); 

     function frame() { 
      if (width >= document.getElementById("results-percentile-2").innerHTML) { 
       clearInterval(id); 
      } else { 
       width++; 
       elem.style.width = width + '%'; 
       document.getElementById("demo").innerHTML = width * 1 + '%'; 
      } 
     } 
    } 

    // End javascript progress bar results 

    // Progress bar javascrip speed 
    { 
     var elem = document.getElementById("myBarspeed"); 
     var width = 0; 
     var id = setInterval(frame, 50); 

     function frame() { 
      if (width >= document.getElementById("results-speed").innerHTML) { 
       clearInterval(id); 
      } else { 
       width++; 
       elem.style.width = width + '%'; 
       document.getElementById("speed").innerHTML = width * 1 + '%'; 
      } 
     } 
    } 

    // End javascript progress bar speed 

HTML

<div class="scale-container-main "> 
         <div id="percentile-scale" class="scale"> 

          results bar: Your results 
          <div id="demo">0%</div> 
          <div class="myProgress"> 
           <div id="myBar" style="width:0"></div> 
          </div> 

          speed bar: Your speed 
          <div id="speed">0%</div> 
          <div class="myProgress"> 
           <div id="myBarspeed" style="width:0"></div> 
          </div> 

         </div> 
        </div> 
+0

Это JS является недействительным – Liam

+0

вы затирания функцию кадра и var - эти два блока не являются изолированными областями - javascript не похож на C++ - если вы не используете 'let' вместо' var' в современных браузерах (это означает, что вы можете забыть IE) –

+0

@Liam - это действительно, просто не хорошо –

ответ

1

Вы можете использовать let вместо вар внутри каждого блока, и

let frame = function() { .... } 

но кадр должен быть перемещен выше setInterval линии

Кроме того, выше, работает только на недавних приличных кроссах, что означает, что он не будет работать в IE

Альтернативный, не менее важный способ - использовать IIFE - это работает в IE!

(function() { 
    var elem = document.getElementById("myBar"); 
    var width = 0; 
    var id = setInterval(frame, 50); 

    function frame() { 
     if (width >= document.getElementById("results-percentile-2").innerHTML) { 
      clearInterval(id); 
     } else { 
      width++; 
      elem.style.width = width + '%'; 
      document.getElementById("demo").innerHTML = width * 1 + '%'; 
     } 
    } 
}()); 

// End javascript progress bar results 

// Progress bar javascrip speed 
(function() { 
    var elem = document.getElementById("myBarspeed"); 
    var width = 0; 
    var id = setInterval(frame, 50); 

    function frame() { 
     if (width >= document.getElementById("results-speed").innerHTML) { 
      clearInterval(id); 
     } else { 
      width++; 
      elem.style.width = width + '%'; 
      document.getElementById("speed").innerHTML = width * 1 + '%'; 
     } 
    } 
}()); 

Единственное преимущество выше является то, что имена переменных могут быть полезными и значимыми и гарантированно не конфликтовать ни с чем (вроде)

+0

Хм немедленно вызывается функция, ОК +1 для не только рабочего ответа, но и для того, чтобы помочь мне улучшить и понять javascrip. Я все еще пытаюсь улучшить mt javascript, и это очень помогло, спасибо. – Beep

+0

Что касается использования let, это было бы более эффективно? – Beep

+1

эффективный? это более «современно», но я бы не знал об эффективности (я сам не ориентируюсь на n-ю степень) - проблема на данный момент - распространенность Internet Explorer, а это значит, что мы должны кодировать самый низкий общий знаменатель. Если вы хотите написать современный код, который все еще работает почти везде, посмотрите на такие вещи, как [babel] (http: // babeljs.io /) –

1

Вы не можете иметь две функции с тем же именем. Переименуйте функцию «frame» на что-то еще и измените ее в своем setInterval. Также используют различные переменные для хранения интервал в.

+0

Хмм, даже после изменения имени функции все еще доза не работает – Beep

+1

, потому что есть переменные, которые одинаковы –