JavaScript изменяет текст только первой итерации с помощью тимелеафа

Надеюсь, у вас все хорошо.

У меня есть школьное задание, и я хочу иметь возможность динамически менять название «проекта». Это задание относится к проектам. То, как я сделал это прямо сейчас, работает с первым «проектом» из списка «проектов», повторяемых с помощью тимелеафа. Я осознаю, что то, что я сделал прямо сейчас, является абсолютно плохим поведением кода, но у нас еще не было обучения JS. Но я очень хотел эту функцию. Я не знаю, как заставить это работать для каждого предварительного просмотра проекта, сейчас это работает для первого предварительного просмотра, но в остальном он просто стирает имя проекта из базы данных. (см. рисунок)

<div class = "projects" th:each = "projectNames : ${listOfProjects}">
                <form action = "deleteProjectPost" method = "post">
                    <input type = "hidden" th:value = "${projectNames.projectID}" name = "deleteID">
                    <input type = "image" src = "delete.png"  alt = "Submit" align = "right" class = "deleteProject" onclick = "return confirm('Are you sure that you want to delete this project?')">
                </form>
                <form action = "/editProjName" method = "post">
                    <input type = "hidden" name = "projectID" th:value = "${projectNames.projectID}">
                    <input type = "hidden" id = "oldName" th:value = "${projectNames.projectName}">
                    <input type = "hidden" id = "newName" name = "projectName">
                    <input type = "image" src = "edit.png"  alt = "Submit" onclick = "change_text()" align = "right" class = "editProject">
                </form>
                <form action = "/projectPost" method = "post">
                    <input class = "projectInfo" name = "projectID" type = "text" th:value = "'Project No.: ' + ${projectNames.projectID}" readonly = "readonly">
                    <input class = "projectInfo"  type = "text"  th:value = "'Project name: ' + ${projectNames.projectName}" readonly = "readonly">
                    <input class = "projectInfo" type = "text" th:value = "${projectNames.projectStartDate}  + ' - ' + ${projectNames.projectEndDate}" readonly = "readonly">
                    <input type = "submit" value = "OPEN" class = "openProject">
                </form>
            </div>

<script>
    function change_text() {
        var changedText;
        var projectName = prompt("Please enter name of project:");
        var oldName = document.getElementById("oldName").value;
        if (projectName === null || projectName === "") {
            changedText = oldName;
        } else {
            changedText = projectName;
        }
        document.getElementById("newName").value = changedText;
    }
</script>

Первая форма в HTML — это красный крест для удаления всего «проекта». Вторая форма предназначена для изменения имени, отображаемого в «предварительном просмотре проекта», но работает только при первом предварительном просмотре и удаляет имя проекта из остальных. Последняя форма является фактическим предварительным просмотром. Я не мог найти другого способа иметь несколько форм и делать разные POSTS при работе с Java Spring и Thymeleaf.
Я хочу, чтобы функция change_text() работала для каждого «предварительного просмотра проекта».

С наилучшими пожеланиями!

Основная проблема заключается в том, что вы повторяете идентификаторы. Ожидается, что идентификаторы будут уникальными в пределах одной страницы. document.getElementById(...) всегда будет возвращать только первое совпадение в контексте, то есть все document

Taplar 19.12.2020 00:30

Ах я вижу. Это имеет большой смысл. Можно ли получить по имени или как-то так? Если ты знаешь, конечно

rasm937k 19.12.2020 00:42

Если вы переключитесь на querySelector(<selector>) или querySelectorAll(<selector>), вы можете использовать строки выбора. по этой причине вы можете искать вещи по '.class' или '#id' или '[attribute = "value"]' (например, '[name = "whatever"]'), чтобы назвать некоторые из основ

Taplar 19.12.2020 00:43

О, спасибо за ваш вклад. Я считаю, что мои необученные знания JS мне здесь не помогут. Можно ли изменить <script>, который у меня есть прямо сейчас, на то, что вы упомянули выше, чтобы получить по имени? Как бы у вас было время и желание, возможно, представить ответ? или это более или менее невыполнимо, как я это сделал?

rasm937k 19.12.2020 00:48
Поведение ключевого слова "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
4
110
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
function change_text(imageInput) {
  var changedText;
  var projectName = prompt("Please enter name of project:");
  var oldName = imageInput.parentNode.querySelector('.old-name').value;
  
  if (projectName === null || projectName === "") {
    changedText = oldName;
  } else {
    changedText = projectName;
  }
  
  imageInput.parentNode.querySelector('.new-name').value = changedText;
}
  <form action = "/editProjName" method = "post">
    <input type = "hidden" name = "projectID" th:value = "${projectNames.projectID}">
    <input type = "hidden" class = "old-name" id = "oldName" th:value = "${projectNames.projectName}">
    <input type = "hidden" class = "new-name" id = "newName" name = "projectName">
    <input type = "image" src = "edit.png" alt = "Submit" onclick = "change_text(this)" align = "right" class = "editProject">
  </form>

Итак, я сделал несколько изменений. Во-первых, обратите внимание, что входные данные с oldName и newName теперь имеют классы. Их можно повторить. Если вы не используете идентификаторы ни для чего другого, кроме скрипта, вы должны удалить их. В противном случае, если у вас есть правила стиля для них, вам следует подумать об изменении этих правил CSS, чтобы вместо этого использовать класс, чтобы вы могли удалить недопустимые повторяющиеся идентификаторы.

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

Затем, глядя на логику, метод теперь принимает imageInput, который является this из onclick.

Используя imageInput.parentNode, мы поднимаемся по дереву DOM к родительскому элементу ввода, который в данном случае является формой. Затем мы можем развернуться и использовать querySelector, чтобы найти другой элемент в форме, которой мы хотим манипулировать. И он найдет элемент только в нашей конкретной форме, потому что это то, что мы выбираем.

Большое спасибо, Таплар! Ты великолепен. Хорошего дня!

rasm937k 19.12.2020 14:05

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