如何在同一页面上复制JavaScript

z9ju0rcb  于 11个月前  发布在  Java
关注(0)|答案(2)|浏览(108)

这里有一些秒表的代码:https://github.com/Aerodyll/Stopwatch
正如你所看到的,计数器改变了4个标签的html,分别是小时、分钟、秒和毫秒。它与3个按钮联系在一起,开始、停止和清除。
当屏幕上只有一个计数器的时候,这很好用,但是我如何修改这段代码,使它同时为屏幕上的多个计数器工作(它们都独立工作)?当我复制它的时候,它就坏了。我理解为什么它坏了,因为它指向相同的html对象,但是我如何在页面上复制计数器,而不为每个计数器编写一个全新的脚本呢?
(我发现了其他用户这样做的几个例子,但他们的代码对我来说很难理解。

vwkv1x7d

vwkv1x7d1#

当屏幕上只有一个计数器时工作正常,但我如何修改此代码以使其同时为屏幕上的多个计数器工作......
1.将HTML元素 Package 到div中以创建多个块。如果您想单独针对这些块,则给予此 Package 器id。或者,如果您想针对所有块,则只需给予相同的class
1.将整个代码 Package 到一个函数中。这将封装逻辑。
1.使用元素id或元素本身调用该函数。
1.在函数中获取元素中span s的引用。这可以通过classnth-child选择器完成。

示例:

  • 下面的示例是您的原始代码,只是按照上述要点进行了重构。*
var allWatches = document.getElementsByClassName('stopwatch'), 
    firstWatch = document.getElementById('sw1')
;

// One way to call stopwatch on individual blocks
//stopWatch('sw1'); // pass id to the function

// Another way to call stopwatch on individual blocks
//stopWatch(firstWatch); // pass the element ref to the function

// One way to call stopwatch on all blocks
for(i=0; i < allWatches.length; i++) {
  stopWatch(allWatches[i]);
}

function stopWatch(element) {
  /* Declaring the html objects that will contain the time */
  var hrs, mins, secs;
  /* Declaring the html buttons */
  var start, stop, clear;
  /* Other variables */
  var seconds = 0, minutes = 0, hours = 0, t;
  // check if id is passed or the actual element reference
  if (typeof element === 'string') {
    element = document.getElementById(element);
  }
  // get reference to component elements inside
  hrs = element.querySelector('.hours');
  mins = element.querySelector('.minutes');
  secs = element.querySelector('.seconds');
  start = element.querySelector('.start');
  stop = element.querySelector('.stop');
  clear = element.querySelector('.clear');

  function runWatch() {
    seconds++;
    if (seconds >= 60) {
      seconds = 0; minutes++;
      if (minutes >= 60) {
        minutes = 0; hours++;
      }
    }

    /* Hours */
    if (hours == null) {
      hrs.textContent = "00";
    } else {
      hrs.textContent = hours > 9 ? hours : "0" + hours;
    }

    /* Minutes */
    if (minutes == null) {
      mins.textContent = "00";
    } else { 
      mins.textContent  = minutes > 9 ? minutes : "0" + minutes;
    }

    /* Seconds */
    if (seconds == null) {
      secs.textContent = "00";
    } else { 
      secs.textContent  = seconds > 9 ? seconds : "0" + seconds;
    }

    t = setTimeout(runWatch, 1000);

  } // End of runWatch
	
  runWatch();
	
  /* Start button */
  start.onclick = runWatch;

  /* Stop button */
  stop.onclick = function() { clearTimeout(t); }

  /* Clear button */
  clear.onclick = function() {
    hrs.textContentL = "00"; mins.textContent = "00"; secs.textContent = "00";
    clearTimeout(t);
    seconds = 0; minutes = 0; hours = 0;
  }	
}
* { box-sizing: border-box; margin: 0; padding: 0; }
div.stopwatch {
  width: 180px; border: 1px solid #999;
  margin: 8px; display: inline-block;
}
div.stopwatch > div { display: flex; margin: 8px; } 
div.stopwatch > div > * { flex: 1 1 auto; }
div.stopwatch > div > span { 
  text-align: center; 
  font-family: sans-serif; font-size: 1.7em;
}
div.stopwatch > div > button { 
  padding: 2px 4px;
}
<div id="sw1" class="stopwatch">
  <div>
    <span class="hours">00</span>
    <span class="minutes">00</span>
    <span class="seconds">00</span>
  </div>
  <div>
    <button class="start">start</button>
    <button class="stop">stop</button>
    <button class="clear">clear</button>	
  </div>
</div>

<div id="sw2" class="stopwatch">
  <div>
    <span class="hours">00</span>
    <span class="minutes">00</span>
    <span class="seconds">00</span>
  </div>
  <div>
    <button class="start">start</button>
    <button class="stop">stop</button>
    <button class="clear">clear</button>	
  </div>
</div>
nvbavucw

nvbavucw2#

如果你想让秒表的多个示例工作,你显然需要更多的开始/停止按钮。你可以用一个参数来调用添加时间的函数,这个参数是按钮id。按钮id会告诉函数要添加时间的秒表。当然,秒表也需要用唯一的id来定义,这样你就可以指向它:)
祝你学习顺利!

相关问题