Почему эта функция jQuery частично работает в некоторых браузерах? - PullRequest
0 голосов
/ 03 апреля 2020

Я использую эту функцию jQuery в функциях. Файл php для вычисления и отображения даты, которая будет через определенное количество дней, начиная с сегодняшнего дня, но исключая выходные и праздничные дни.

jQuery(function($) {
  if ($('body.page-id-5749').length > 0) {
    var monthNames = ["gennaio", "febbraio", "marzo", "aprile", "maggio", "giugno", "luglio", "agosto", "settembre", "ottobre", "novembre", "dicembre"];
    var dayNames = ["domenica", "lunedì", "martedì", "mercoledì", "giovedì", "venerdì", "sabato"];
    var holidays = ["2019, 12, 8", // 8 DICEMBRE 2019
      "2019, 12, 25", // 25 DICEMBRE 2019
      "2019, 12, 26", // 26 DICEMBRE 2019
      "2020, 1, 1", // CAPODANNO 2020
      "2020, 1, 6", // EPIFANIA 2020
      "2020, 4, 13", // PASQUETTA 2020
      "2020, 4, 25", // 25 APRILE 2020
      "2020, 5, 1", // 1 MAGGIO 2020
      "2020, 6, 2", // 2 GIUGNO 2020
      "2020, 8, 15", // 15 AGOSTO 2020
      "2020, 11, 1", // 1 NOVEMBRE 2020
      "2020, 12, 8", // 8 DICEMBRE 2020
      "2020, 12, 25", // 25 DICEMBRE 2020
      "2020, 12, 26", // 26 DICEMBRE 2020
      "2021, 1, 1"
    ]; // 1 GENNAIO 2021
    var endDate = "",
      noOfDaysToAdd = $(".valMixBeatVoce").html(),
      count = 0;
    var someDate = new Date(new Date().toDateString());
    var numberOfDaysToAdd = noOfDaysToAdd;
    someDate.setDate(someDate.getDate());
    while (count < noOfDaysToAdd) {
      endDate = new Date(someDate.setDate(someDate.getDate() + 1));
      var isHoliday = holidays.find(holiday => endDate.getTime() == new Date(holiday).getTime());
      if (isHoliday) {
        console.log('holiday, skipping');
      } else if (endDate.getDay() != 0 && endDate.getDay() != 6) {
        count++;
      }
    }
    $('#DateMixBeatVoce').html(dayNames[endDate.getDay()] + ' ' + endDate.getDate() + ' ' + monthNames[endDate.getMonth()]);
    $('#DateMixBeatVoce2').html(dayNames[endDate.getDay()] + ' ' + endDate.getDate() + ' ' + monthNames[endDate.getMonth()]);
  }
});

Но, хотя на Chrome (для настольных ПК) и Firefox (для настольных компьютеров) он работает отлично, в Safari (для настольных ПК) и во всех мобильных браузерах (Chrome, Firefox, Safari) вычисляется дата исключая выходные, но не исключая праздничные дни. Я не понимаю, почему.

Вот настольные консоли:

Chrome (рабочий):

holiday, skipping (index):880
[Violation] Forced reflow while executing JavaScript took 40ms
(Warning) DevTools failed to parse SourceMap: https://stats.wp.com/s.js.map

Firefox (рабочий):

(Warning) This page uses the non standard property “zoom”. Consider using calc() in the relevant property values, or using “transform” along with “transform-origin: 0 0”. example.com
holiday, skipping example.com:880:17
(Warning) This site appears to use a scroll-linked positioning effect. This may not work well with asynchronous panning example.com

Safari (выходные дни не пропускаются):

[Info] Successfuly preconnected to https://fonts.gstatic.com/
[Error] Failed to load resource: the server responded with a status of 404 () (s.js.map, line 0)

Вот воспроизводимый пример: как вы можете видеть, он работает только на Chrome (рабочий стол) и Firefox (рабочий стол) ), в то время как выходные дни не рассчитываются в Safari (для настольных ПК) и во всех мобильных браузерах (Chrome, Firefox, Safari), в результате отображается другая дата:

https://jsfiddle.net/englishsound/pf3zg4xj/7/

Решение: https://jsfiddle.net/englishsound/pf3zg4xj/14/

1 Ответ

1 голос
/ 03 апреля 2020

2019, 12, 25 не является стандартным форматом для JavaScript дат. Форматы, которые можно использовать для переноса: даты ISO 8601, например 2019-12-25, или даты RF C 2822, например December 12, 2019.

. Вы можете изменить массив holidays так, чтобы он содержал массивы, а не строки * 1007. *

var holidays = [
    [2019, 12, 8], // 8 DICEMBRE 2019
    [2019, 12, 25], // 25 DICEMBRE 2019
    [2019, 12, 26], // 26 DICEMBRE 2019
    [2020, 1, 1], // CAPODANNO 2020
    [2020, 1, 6], // EPIFANIA 2020
    [2020, 4, 13], // PASQUETTA 2020
    [2020, 4, 25], // 25 APRILE 2020
    [2020, 5, 1], // 1 MAGGIO 2020
    [2020, 6, 2], // 2 GIUGNO 2020
    [2020, 8, 15], // 15 AGOSTO 2020
    [2020, 11, 1], // 1 NOVEMBRE 2020
    [2020, 12, 8], // 8 DICEMBRE 2020
    [2020, 12, 25], // 25 DICEMBRE 2020
    [2020, 12, 26], // 26 DICEMBRE 2020
    [2021, 1, 1]
];

, а затем передайте их как отдельные аргументы new Date():

  var isHoliday = holidays.find(holiday => endDate.getTime() == new Date(holiday[0], holiday[1]-1, holiday[2]).getTime());

Обратите внимание, что вы должны вычесть 1 из месяца, потому что JavaScript считает месяцы, начиная с 0 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...