JQuery `val()` для элемента ввода, возвращающего пустой

Я пытаюсь создать таблицу элементов в HTML, а затем при нажатии кнопки редактирования (которая находится рядом со строкой, которую вы хотите отредактировать) текстовые элементы превращаются в элементы <input>.

Однако после того, как вы введете значения в поля ввода и снова нажмете кнопку редактирования (сохранив изменения), предполагается, что исходные текстовые элементы будут содержать те, которые были введены в поле ввода.

Я также пробовал использовать функцию text(), и она также возвращает пустое значение.

Это мой HTML...

<table>
    <tr id='0'>
        <td id='editable' style = "border:1px solid #000;padding:7px">Title</td>
        <td id='editable' style = "border:1px solid #000;padding:7px">0 mins</td>
        <td id='editable' style = "border:1px solid #000;padding:7px">Genre</td>
        <td id='editable' style = "border:1px solid #000;padding:7px">[]</td>
        <td id='editable' style = "border:1px solid #000;padding:7px">0</td>

        <td>
            <button id = "editButton" style = "background-color:#ADD8E6" />&#128393;
        </td>
    </tr>
</table>

И это мой jQuery...

$("#editButton").click(function() {
    if ($(this).attr('id') === "editButton") {
        $(this).parent().parent().children("#editable").html("<input type='text' id='editable'/>");

        $(this).attr("id", "saveable")
    } else {
        $(this).parent().parent().children("#editable").each(function(i) {
            $(this).html("<td>" + $(this).val() + "</td>")
        })

        $(this).attr("id", "editButton")
    }
});

Я тестировал это на JSFiddle: https://jsfiddle.net/ajecdm5n/1/.

Кроме того, если я могу внести какие-либо улучшения, пожалуйста, сообщите мне.

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

CBroe 26.02.2024 11:13

где ты пишешь кодировку для сохранения?

Vel 26.02.2024 11:18

@CBroe Могу ли я тогда просто перебрать все дочерние элементы(), чтобы изменить каждый элемент?

Alec Southward 26.02.2024 11:24

@Vel Я просто использую это для проверки редактирования элементов таблицы. Экономия пока отдельная.

Alec Southward 26.02.2024 11:24

Проверьте эту скрипку jsfiddle.net/pymftrdw Вы так выглядите?

Vel 26.02.2024 11:31

В принципе да, но я хочу, чтобы она выглядела как стартовая таблица, но с новыми значениями.

Alec Southward 26.02.2024 11:33
Поведение ключевого слова "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) для оценки ваших знаний,...
2
6
73
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Во-первых, id должен быть уникальным идентификатором одного элемента на странице, тогда как у вас их несколько с одинаковым идентификатором. Если вам нужно, чтобы многие элементы имели один и тот же идентификатор, лучше вместо этого присвоить им class.

Далее, ваши элементы #editable — это ваши элементы <td>, а также редактируемое текстовое поле, поэтому фактически отображаемый HTML предположительно выглядит как <td id='editable'><input type='text' id='editable' />. Это вызывает проблемы в вашем цикле for, потому что вы сначала устанавливаете html на <td>, что удаляет <input>, а затем пытаетесь зациклиться на вводе. Кроме того, у <td> нет .val(), поэтому вызов вашего метода пуст.

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

Может быть, что-то вроде этого будет лучше?

<table>
    <tr id='0'>
        <td class='editable' style = "border:1px solid #000;padding:7px">Title</td>
        <td class='editable' style = "border:1px solid #000;padding:7px">0 mins</td>
        <td class='editable' style = "border:1px solid #000;padding:7px">Genre</td>
        <td class='editable' style = "border:1px solid #000;padding:7px">[]</td>
        <td class='editable' style = "border:1px solid #000;padding:7px">0</td>

        <td>
            <button class = "editButton" style = "background-color:#ADD8E6" />&#128393;
        </td>
    </tr>
</table>
$(".editButton").click(function() {
    const btn = $(this);
    const row = btn.parent().parent();

    if (btn.data("editing") === "true") {
        row.children(".editable").each(function(i) {
            const editField = $(":first-child", $(this)); //only element is input
            $(this).html("<td>" + editField.val() + "</td>")
        });
        btn.data("editing", "false");
    } else {
        row.children(".editable").html("<input type='text' class='editable-field'/>"); //give it a different class so we can look it up by that if needed
        btn.data("editing", "true");
    }
});

При попытке сохранить изменения с помощью этого я получаю TypeError: editField.val is not a function.

Alec Southward 26.02.2024 11:30

Ох, моя вина, я давно не пользовался jQuery! Я дал вам сырой HTMLElement вместо одного, завернутого в jQuery, сейчас обновлю

Luke 26.02.2024 11:46

Спасибо! Это именно то, чего я пытался достичь.

Alec Southward 26.02.2024 12:00

$("#editButton").click(function() {
  if ($(this).attr('id') === "editButton") {
    $(this).parent().parent().children(".editable").html("<input name='test[]' type='text' id='editable' value=''/>");
    
    $(this).attr("id", "saveable")
  } else {
    let Inputhtml ='';
    $(this).closest("tr").find(".editable input").each(function(i) {
    Inputhtml + = "<td>" + $(this).val() + "</td>";
        //$(".testtable").html("<td>" + $(this).val() + "</td>")
    })
    $(".testtable").html(Inputhtml);
    $(this).attr("id", "editButton")
  }
});
.table {
  margin-left: 20px;
  width: 80%;
}

.input {
  margin-left: 20px;
  width: 10px;
}

.td {
  margin-right: 10px;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<table class = "testtable">
  <tr id='0'>
    <td class='editable' style = "border:1px solid #000;padding:7px">Title</td>
    <td class='editable' style = "border:1px solid #000;padding:7px">0 mins</td>
    <td class='editable' style = "border:1px solid #000;padding:7px">Genre</td>
    <td class='editable' style = "border:1px solid #000;padding:7px">[]</td>
    <td class='editable' style = "border:1px solid #000;padding:7px">0</td>
    <td style = "color:blue">0</td>
    <td>
      <button id = "editButton"style = "background-color:#ADD8E6"/>&#128393;
    </td>
    <td>
      <button style = "background-color:#F08080"/>&#9932;
    </td>
  </tr>
</table>

Обновить ссылку на скрипку

https://jsfiddle.net/pymftrdw/2/

По сути, это то, что я ищу, однако я хочу, чтобы она выглядела как стартовая таблица, но с новыми значениями.

Alec Southward 26.02.2024 11:35

я тебя не понял

Vel 26.02.2024 11:37

Неважно, я пропустил Inputhtml. Все работает именно так, как я хочу, спасибо за помощь!

Alec Southward 26.02.2024 11:41

Пожалуйста, проверьте ссылку на обновление скрипта

Vel 26.02.2024 11:42

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