Несколько таймеров обратного отсчета, сравнивающих заданное время и текущее время?

Действительно борется с этой частью по какой-то причине.

Я создаю таймер, который могу использовать для отслеживания ставок. Я хочу иметь возможность сравнить два раза и показать разницу (в минутах и ​​секундах) в столбце обратного отсчета. Он должен сравнивать время начала торгов и время прямо сейчас.

Возможно, когда он достигнет начала ставки, он также может измениться, чтобы показать, сколько времени осталось до окончания ставки. В конце концов, я хочу добавить фоновые изменения, когда время приближается, и, возможно, возможность устанавливать будильник с окном подсказки.

Вот код, который у меня есть до сих пор:

HTML

    <table>
<tr>
    <td>Item Name</td>
    <td><input id="itemNameField" placeholder="" type="text"></td>
</tr>
<tr>
    <td></td>
    </tr>
    <tr>
        <td>Time of Notice</td>
        <td><input id="noticeField" type="time"></td>
    </tr>
</table>


<input id="addButton" onclick="insRow()" type="button" value="Add Timer">
<div id="errorMessage"></div>
<hr>
<div id="marketTimerTableDiv">
    <table border="1" id="marketTimerTable">
        <tr>
            <td></td>
            <td>Item Name</td>
            <td>Time of Notice</td>
            <td>Bid Start</td>
            <td>Bid End</td>
            <td>Countdown</td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td>
                <div id="itembox"></div>Example Item
            </td>
            <td>
                <div id="noticebox"></div>12:52
            </td>
            <td>
                <div id="bidstartbox"></div>13:02
            </td>
            <td>
                <div id="bidendbox"></div>13:07
            </td>
            <td>
                <div id="countdownbox"></div>
            </td>
            <td><input id="delbutton" onclick="deleteRow(this)" type="button" value="X"></td>
        </tr>
    </table>
</div>

ЯВАСКРИПТ

    function deleteRow(row) {
var i = row.parentNode.parentNode.rowIndex;
if (i == 1) {
    console.log = "hi";
} else {
    document.getElementById('marketTimerTable').deleteRow(i);
}
}

function insRow() {
    if (itemNameField.value == "" || noticeField.value == "") {
        var div = document.getElementById('errorMessage');
        div.innerHTML = "*Please fill in the fields*";
        div.style.color = 'red';
        document.body.appendChild(div);
    } else {
        var div = document.getElementById('errorMessage');
        div.innerHTML = "";
        var x = document.getElementById('marketTimerTable');
        var new_row = x.rows[1].cloneNode(true);
        var len = x.rows.length;
        var inp1 = new_row.cells[1].getElementsByTagName('div')[0];
        inp1.id += len;
        inp1.innerHTML = itemNameField.value;
        itemNameField.value = "";
        var inp2 = new_row.cells[2].getElementsByTagName('div')[0];
        inp2.id += len;
        inp2.innerHTML = noticeField.value;
        noticeField.stepUp(10);
        var inp3 = new_row.cells[3].getElementsByTagName('div')[0];
        inp3.id += len;
        inp3.innerHTML = noticeField.value;
        noticeField.stepUp(5);
        var inp4 = new_row.cells[4].getElementsByTagName('div')[0];
        inp4.id += len;
        inp4.innerHTML = noticeField.value;
        var inp5 = new_row.cells[5].getElementsByTagName('div')[0];
        inp5.id += len;
        inp5.innerHTML = "";
        noticeField.value = "";
        x.appendChild(new_row);
    }
}

Я заранее извиняюсь, потому что мой код, вероятно, очень грязный и плохо отформатирован. А вот и JSFIDDLE! Спасибо :)


person Sarah    schedule 14.07.2017    source источник


Ответы (2)


Чтобы вычислить разницу между текущим и заданным временем, вы можете использовать setInterval

Пример :

var noticeTime = noticeField.value.split(":");
    const interval = setInterval(function(){
      var currentDate = (new Date());
      var diffInHours = currentDate.getHours() - noticeTime[0];
      var diffInMinutes = currentDate.getMinutes() - noticeTime[1];
      inp5.innerHTML = diffInHours + ":" + diffInMinutes;
      if(diffInHours === 0 && diffInMinutes === 0) {
        clearInterval(interval);
      }
    },1000)
person Anurag Singh Bisht    schedule 14.07.2017
comment
Я пытался использовать это, но мне кажется очень грязным и неудобным заставить его делать то, что я хочу, из-за noteField.value.split.... Я чувствую, что было бы лучше преобразовать время уведомления в секунды а затем выяснить разницу оттуда. Хотя изо всех сил пытаюсь понять это - person Sarah; 14.07.2017
comment
Поскольку есть только объект Date, который мы можем использовать для получения разницы в миллисекундах, нам нужно будет преобразовать часы и минуты в миллисекунды. Это потребовало бы больше усилий и расчетов с нашей стороны, поэтому было предложено вышеуказанное решение. Дайте мне знать, если вы найдете какой-либо другой способ решить эту проблему. - person Anurag Singh Bisht; 14.07.2017
comment
Вместо этого я пробовал это, но расчеты идут совершенно неправильно, и я не могу понять, почему. Так запутался.. var noticeTimeMinutes = (noticeTime[0] * 60) + noticeTime[1] + 5; var currentTimeMinutes = (currentDate.getHours() * 60) + currentDate.getMinutes(); var diffTotalMinutes = (noticeTimeMinutes - currentTimeMinutes); - person Sarah; 14.07.2017
comment
Вы изменили свои значения noticeField, выполнив функцию noticeField.step(). Поэтому, если вам нужно исходное время, вы должны сначала сохранить его в другом значении. - person Anurag Singh Bisht; 14.07.2017
comment
Хм, я не думаю, что проблема в этом.. StepUp добавляет только 15 минут с момента уведомления, и мне все равно нужно время начала торгов, поэтому я добавил 5 минут ко времени, чтобы противодействовать stepUp. Я даже полностью отключил stepUp, но проблема осталась. Значение, которое я получаю, составляет более 500000 минут, хотя на самом деле это всего 10 минут. Хотя не уверен как.. - person Sarah; 14.07.2017
comment
Хорошо, я, наконец, понял это .... Я получал странные числа, потому что они все еще разделялись. Таким образом, в основном это делало 30: 540 + 10: 540, что равнялось бы 40: 1080, вместо того, чтобы добавлять все это до 1120.. Не уверен, что я могу сделать, чтобы обойти это :( - person Sarah; 14.07.2017

Мне удалось это сделать с помощью кода от ProgXx.

Я добавил следующий код:

var noticeTime = noticeField.value.split(":");
var originalTime = noticeField.value.split(":");
const interval = setInterval(function(){
  var currentDate = (new Date());
  noticeTime[1] = originalTime[1] - currentDate.getMinutes() + 10;
  noticeTime[1] = noticeTime[1] + (originalTime[0] * 60) - (currentDate.getHours() * 60);

Вот JSFIDDLE готового кода: http://jsfiddle.net/joefj8wb/

person Sarah    schedule 14.07.2017