IE无法评估第二个if条件(&&)

时间:2018-11-06 14:38:20

标签: javascript if-statement internet-explorer

所以我有这个脚本:

        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 >= '08:00:00' && currentTimeFormatted <= '16:30:00'){
            makeActive();
        }

在Chrome中可以完美地工作,但是在IE中不会添加该类。

如果我删除

&& currentTimeFormatted <= '16:30:00'

IE也添加了该类。为什么还要添加第二个条件,从而在IE中破坏此脚本?

3 个答案:

答案 0 :(得分:1)

使此操作比必须使用&&和||更容易混合,或者如果您的值存储在静态文件中的某个位置等。您可以通过将每个部分相乘来创建一种伪时间。

例如

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");
}

答案 1 :(得分:0)

您正在进行字符串比较,这意味着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

现在您的其余代码将正常工作(假设您是UTC时间08:00:00和16:30:00)。

(2)提取new Date()的小时和分钟部分,并将它们与整数进行比较:

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

(3)使用Keith的出色解决方案(见下文),我认为这是最好的解决方法

答案 2 :(得分:-1)

IE的date.toLocaleTimeString()实现将不可打印的字符添加到字符串中。处理它们的最简单方法是从字符串中修剪它们;

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

在处理本地时区和时区比较时,可能值得尝试像moment.js这样的库,该库也可以使用isBetween funciton来比较值。

修改

如其他解决方案所建议的那样-使用toLocaleTimeString()并不是执行日期比较的安全方法,应避免使用。