IE Невозможно оценить второе условие if (&&)

Поэтому у меня есть этот скрипт:

        function makeActive() {
            var element, name, arr;
            element = document.getElementById("liveChat");
            name = "active";
            arr = element.className.split(" ");
            if (arr.indexOf(name) == -1) {
                element.className += " " + name;
            }
        }

        var currentTime = new Date();
        var currentTimeFormatted = currentTime.toLocaleTimeString();

        if(currentTimeFormatted >= ང:00:00' && currentTimeFormatted <= ཌ:30:00'){
            makeActive();
        }

Что отлично работает в Chrome, однако в IE класс не добавляется.

Если я удалю

&& currentTimeFormatted <= ཌ:30:00'

IE также добавляет класс. Почему бы добавить второе условие, разбить этот скрипт в IE?

Всего 3 ответа

Автоматический диспенсер мыльной пены от xiaomi.


Вы выполняете строковые сравнения, а это значит, что зависимый от браузера и locale вывод toLocaleTimeString() закручивает ваш код в IE и, возможно, также в других браузерах или регионах, потому что эта функция предназначена исключительно для создания пользовательского представления времени.

Поэтому вы должны:

(1) Использовать строковое представление, стандартизованное, например, обращение toISOString() . Это также избавит вас от проблем с часовым поясом, потому что результат всегда будет в UTC:

var currentTimeFormatted = new Date().toISOString(); // 2018-11-07T12:28:12.448Z'
currentTimeFormatted = currentTimeFormatted.substr(currentTimeFormatted.indexOf('T') + 1, 8); // 12:27:12

Теперь остальная часть вашего кода будет работать (если вы 08:00:00 и 16:30:00 - UTC).

(2) Извлеките часовую и минутную части new Date() и сравните их с целыми числами:

    var currentTime = new Date();
    if(currentTime.getHours() >= 8 
       && // similarly a comparison to < 16:30
    ) {
        makeActive();
    }

(3) Используйте великое решение Кейта (см. Ниже), который, я думаю, лучший способ пойти


Чтобы сделать это немного проще, чем использовать && и || mix, или если ваши значения хранятся где-то в статическом файле и т. д. Вы могли бы создать своего рода псевдо-время, умножая каждую секцию.

например.

 const cTime = new Date(); const ptime = cTime.getHours() * 10000 + cTime.getMinutes() * 100 + cTime.getSeconds(); if (ptime >= 80000 && ptime <= 163000) { console.log("Active"); } else { console.log("InActive"); } 


Реализация IE date.toLocaleTimeString () добавляет непечатаемые символы в строку. Самый простой способ справиться с ними - обрезать их из строки;

currentTimeFormatted = currentTime.toLocaleTimeString().replace(/[^ -~]/g,'')

Когда вы работаете с локализованными часовыми поясами и сравнением с часовым поясом , возможно, стоит попробовать библиотеку, например moment.js, которая также может иметь дело со сравнением значений с помощью функции isBetween funciton

редактировать

Как предложили другие решения - использование toLocaleTimeString() не является безопасным методом сравнения дат, и его следует избегать.


Есть идеи?

10000