Проблема с настройкой html элемента через jQuery и PHP

У меня есть td с именем класса «seminar_date_time», для которого я пытаюсь установить внутренний html после преобразования даты и времени в формат строки, который я хочу. Вот мой код...

if ($stmt->execute()) {
    $stmt->bind_result($id, $seminar_date, $am_pm, $room, $building, $speaker_lname, $speaker_fname, $title);

    while($stmt->fetch()) {
        ?>
            <script>
                var date_object = new Date("<?php echo $seminar_date; ?>");

                var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
                var month = monthNames[date_object.getMonth()];
                var day = date_object.getDay();
                var year = date_object.getFullYear();
                var hour = date_object.getHours();
                var mins = date_object.getMinutes();
                var time_string = null;
                var ampm = null;

                if (hour > 12) {
                    hour -= 12;
                    ampm = "PM";
                }
                else {
                    ampm = "AM";
                }

                if (mins === 0) {
                    mins = "00";
                }

                time_string = `${hour}:${mins} ${ampm}`;

                // using ES6 string template literal for date string
                var date_string = `${month} ${day}, ${year} at ${time_string}`;

                console.info(`date and time: ${date_string}`);

                                $(".seminar_date_time").html(date_string);
            </script>
            <tr class = "clickable_row" data-href = "seminar_attendance.php?id=<?php echo $id; ?>">
                <td class = "seminar_date_time"></td>
                <td><?php echo $room; ?></td>
                <td><?php echo $building; ?></td>
                <td><?php echo "$speaker_lname, $speaker_fname"; ?></td>
                <td><?php echo $title; ?></td>
            </tr>
        <?php
    }
}

Когда я отображаю это на странице, строка даты в этом td одинакова для каждой строки. Когда я console.info() мою недавно сформированную строку даты, она каждый раз записывает ее идеально. Следующая строка после этого console.info() устанавливает html через jQuery на td с именем класса «seminar_date_time».

Я знаю, что код php устанавливается на стороне сервера, поэтому я предполагаю, что существует проблема гонки между настройкой содержимого на стороне сервера и настройкой на стороне клиента jQuery?

Как я могу правильно ввести новую строку даты в td каждой строки?


Обновлено:

Похоже, здесь все согласны с тем, что мне нужно форматировать дату в PHP, а не через JS. Это то, что я планирую сделать сейчас, но, возможно, эти ответы все еще могут помочь кому-то еще, кому нужно таким образом смешать PHP и JS. Спасибо всем, что ответили.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
56
3

Ответы 3

Переменные, которые вы объявляете в теге <script>, являются глобальными переменными, они не привязаны к текущей записи в цикле. Это означает, что когда вы добавляете несколько таких тегов сценария, вы в конечном итоге изменяете переменную, а не создаете новую. Что вам нужно сделать, так это создать область для переменных, которая не является глобальной.

if ($stmt->execute()) {
    $stmt->bind_result($id, $seminar_date, $am_pm, $room, $building, $speaker_lname, $speaker_fname, $title);

    while($stmt->fetch()) {
        ?>
            <script>
            (function(){
                var date_object = new Date("<?php echo $seminar_date; ?>");

                var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
                var month = monthNames[date_object.getMonth()];
                var day = date_object.getDay();
                var year = date_object.getFullYear();
                var hour = date_object.getHours();
                var mins = date_object.getMinutes();
                var time_string = null;
                var ampm = null;

                if (hour > 12) {
                    hour -= 12;
                    ampm = "PM";
                }
                else {
                    ampm = "AM";
                }

                if (mins === 0) {
                    mins = "00";
                }

                time_string = `${hour}:${mins} ${ampm}`;

                // using ES6 string template literal for date string
                var date_string = `${month} ${day}, ${year} at ${time_string}`;

                console.info(`date and time: ${date_string}`);

                $(".seminar_date_time").html(date_string);
            }());
            </script>
            <tr class = "clickable_row" data-href = "seminar_attendance.php?id=<?php echo $id; ?>">
                <td class = "seminar_date_time"></td>
                <td><?php echo $room; ?></td>
                <td><?php echo $building; ?></td>
                <td><?php echo "$speaker_lname, $speaker_fname"; ?></td>
                <td><?php echo $title; ?></td>
            </tr>
        <?php
    }
}

Это должно сработать для вас.

Но я должен отметить, что это не лучший способ смешивать php и JavaScript. Вы должны попытаться сделать все это только на php, а не смешивать это на веб-интерфейсе и бэкэнде.

Действительно? Добавлять один и тот же код JavaScript снова и снова для каждого семинара? Не поймите меня неправильно, это сработает, но это не очень хорошее решение...

Leroy Stav 18.02.2019 17:07

Спасибо за совет, я попробую вместо этого сделать все преобразования дат в PHP

jtylerm 18.02.2019 17:10

Не состояние гонки, нет. Это потому, что вы добавляете один и тот же javascript снова и снова, каждый раз переопределяя date_string, а затем заменяя весь соответствующий контент $(".seminar_date_time") самым новым date_string

Лучшим решением было бы создать массив отдельных дат и добавить только javascript однажды после цикла как функция, затем добавить массив как новый объект javascript и запустить функцию для каждого элемента массива.

Или, если вы уже занимаетесь обработкой и построением html в PHP... просто сделать все это в PHP, таким образом, дата будет правильной с самого начала.

Спасибо за совет, я попробую вместо этого сделать все преобразования дат в PHP

jtylerm 18.02.2019 17:10

Вы не должны подвергать такую ​​обработку внешнему интерфейсу через javascript. Но с js вот мой вариант:

<?php
if ($stmt->execute()) {
    $stmt->bind_result($id, $seminar_date, $am_pm, $room, $building, $speaker_lname, $speaker_fname, $title);
?>
    <script>
            (function() {
                var fn_date_string = function(dt) {
                    var date_object = new Date(dt);

                    var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
                    var month = monthNames[date_object.getMonth()];
                    var day = date_object.getDay();
                    var year = date_object.getFullYear();
                    var hour = date_object.getHours();
                    var mins = date_object.getMinutes();
                    var time_string = null;
                    var ampm = null;

                    if (hour > 12) {
                        hour -= 12;
                        ampm = "PM";
                    }
                    else {
                        ampm = "AM";
                    }

                    if (mins === 0) {
                        mins = "00";
                    }

                    time_string = `${hour}:${mins} ${ampm}`;

                    // using ES6 string template literal for date string
                    var date_string = `${month} ${day}, ${year} at ${time_string}`;

                    return date_string;
                };
                $(function () {
                    // DOM is fully loaded
                    $(.seminar_date_time).each(function () {
                        $(this).html(fn_date_string($(this).data('dt'));
                    }
                });
            })();
    </script>
?>
    while($stmt->fetch()) {
        ?>
            <tr class = "clickable_row" data-href = "seminar_attendance.php?id=<?php echo $id; ?>">
                <td class = "seminar_date_time" data-dt = "<?php echo $seminar_date; ?>"></td>
                <td><?php echo $room; ?></td>
                <td><?php echo $building; ?></td>
                <td><?php echo "$speaker_lname, $speaker_fname"; ?></td>
                <td><?php echo $title; ?></td>
            </tr>
        <?php
    }
}

Другие вопросы по теме