Обработка дат не работает в Internet Explorer, но работает в Chrome и FF - PullRequest
0 голосов
/ 31 января 2019

В проекте Symfony 4 у меня есть элемент формы, который работает в Chrome и Firefox, но не в Explorer, и я не могу понять, почему.Рендеринг кажется идентичным, поэтому я должен обрабатывать поле при отправке формы, но опять же, для меня нет ничего очевидного в том, почему он не работает.

Мой класс сущностей:

class Person
{
    /**
     * @ORM\Column(type="date", nullable=true)
     */
    private $dob;

    // ....
}

Мой тип формы:

class PersonFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('dob', DateType::class, [
                'label' => 'DOB (m/d/yyyy)',
                'widget' => 'single_text',
                'format' => 'M/d/yyyy',
                'attr' => ['autocomplete' => 'off', 'class' => 'js-dob'],
                'html5' => false,
            ]);
    }
}

и, наконец, javascript, который обрабатывает при отправке формы:

$('.js-save-button').on('click', function() {
    // convert 2-digit years to 4-digit version in dob field
    $('.js-dob').each(function() {
        let date = new Date($(this).val());
        if (date instanceof Date && !isNaN(date)) {
            if (date > new Date()) {
                date.setFullYear(date.getFullYear() - 100);
            }
            $(this).val(date.toLocaleDateString("en-US"));
        }
    });
});

Код javascript довольно понятен, но идеязаключается в том, что если пользователь вводит dob, например 1 июня 1923 года, как «6/1/23», то он будет преобразован в «6/1/1923» при отправке формы.В настоящее время все отлично работает в Chrome / FF, но в IE я получаю ошибку проверки формы от Symfony с сообщением «Это значение недопустимо».независимо от того, как я ввожу дату.

enter image description here

1 Ответ

0 голосов
/ 31 января 2019

Вооружившись комментарием от @Tushar выше, я отследил ошибку, с которой столкнулся, в методе toLocaleDateString().Есть хорошая короткая статья по этому вопросу здесь с решением в комментариях к этой статье, которое решено проблемой.По сути, регулярное выражение удаляет проблемную строку, возвращаемую функцией toLocaleDateString.

Мой модифицированный код JavaScript теперь следующий, который работает в Chrome и IE (не тестировался в FF).

$('.js-save-button').on('click', function() {
    // convert 2-digit years to 4-digit version in dob field
    $('.js-dob').each(function() {
        let date = new Date($(this).val());

        if (date instanceof Date && !isNaN(date)) {
            if (date > new Date()) {
                date.setFullYear(date.getFullYear() - 100);
            }
            var newDate = date.toLocaleDateString("en-US")
                .replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '');
            $(this).val(newDate);
        }
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...