Сообщение об успехе не отображается после одного раза

Я пытаюсь показать сообщение при добавлении новой записи. При первом добавлении записи появляется сообщение. Но если я добавлю еще одну запись, сообщение не появится, хотя запись добавлена ​​правильно.

Это мой HTML-код

<button id = "add">Add Name To Table</button>
<input type = "text" placeholder = "Enter Name" id = "name" style = "display: none;">
<input type = "text" placeholder = "Enter Class" id = "class" style = "display: none;">

<button id = "save" style = "display: none;">Add Name</button>
<table>
    <thead>
        <tr>
            <th>Name</th>
            <th>Class</th>
            <th>Action</th>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>

<span id = "message"></span>
<div id = "editdiv"></div>

Это мой код jquery

 $(document).ready(function () {

        var value;
        var Nclass;

        $('#add').click(function () {

            $('#name').show();
            $('#class').show();
            $('#save').show();
        });
        $('#save').click(function () {
            if ($('#name').val().length != "" && $('#class').val().length != "") {
                value = $('#name').val().trim();
                Nclass = $('#class').val().trim();

                if (value != "") {
                    var cell = $('<td>').text(value);
                    var classval = $('<td>').text(Nclass);
                    var deletebtn = $('<button>').text('Delete').attr('class', 'delete');
                    var editbtn = $('<button>').text('Edit').attr('class', 'edit');
                    var row = $('<tr>').append(cell, classval, deletebtn, editbtn);
                    $('tbody').append(row);
                    row.hide().fadeIn();
                    $('#message').text("Data Added Successfully").css("color", "green");
                    setTimeout(function () {
                        $('#message').fadeOut();
                    }, 2000);
                    $('#name').val('');
                    $('#class').val('');

                }
            } else {
                $('#message').text("You Cannot Submit While Input Fields Are Empty").css('color', 'red');
                setTimeout(function () {
                    $('#message').fadeOut();
                }, 2000);
            }
        });

    });

это потому, что FadeOut() добавляет CSS display:none поверх HTML, и вы никогда не вызываете его для удаления.

Death-is-the-real-truth 01.05.2024 08:34
Поведение ключевого слова "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) для оценки ваших знаний,...
1
1
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Сообщение не отображается во второй раз, потому что в первый раз был код, позволяющий его скрыть: $('#message').fadeOut(). Чтобы решить эту проблему, вызовите вызов .show() или .fadeIn() при отображении текста:

$('#message').text(".......").css('color', "....").fadeIn();

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

Поскольку у вас есть два места, где вы показываете сообщение, включая вызов setTimeout, где вы снова скрываете сообщение, у вас есть возможность избежать повторения кода и ввести функцию, которая выполняет эту работу, например:

function notify(message, color) {
    $('#message').text(message).css('color', color).show();
    setTimeout(function () {
        $('#message').fadeOut();
    }, 2000);
}

Некоторые другие комментарии:

  • В документации jQuery рекомендуется использовать $(function () вместо $(document).ready(function () {.

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

  • Используйте более современные ключевые слова const или let вместо var. Они имеют блочную область действия и делают var ненужным.

  • Объединяйте селекторы jQuery, когда вы выполняете с ними одни и те же действия, например $('#name, #class, #save').show();

  • Поскольку вы хотите избежать добавления пустых строк, сначала обрежьте входные значения. В настоящее время ваш код позволяет добавлять Nclass как пустую строку (если вы введете несколько пробелов).

  • Не сравнивайте так: .length != "". Это сравнение числа со строкой работает так, как вы задумали, но более последовательно сравнивать либо входную строку с "", либо ее длину с 0. В этом случае вы можете даже просто проверить истинность (обрезанного) числа. введите строку и отбросьте оператор сравнения.

  • Не начинайте имя переменной, например Nclass, с заглавной буквы. Обычной практикой является резервирование имен PascalCase для конструкторов/классов и использование CamelCase для других имен переменных. Я бы посоветовал className.

$(function () {  // Preferred way
    $('#add').click(function () {
        $('#name, #class, #save').show(); // Combine
    });
    
    $('#save').click(function () {
        // Use const/let instead of var. Scope at the right level
        // Perform trim first and then perform the IF
        const value = $('#name').val().trim();
        const className = $('#class').val().trim();
        // Don't compare length (number) with a string. Just look at truthiness:
        if (value && className) { // Simplified condition
            // No nested IF
            var cell = $('<td>').text(value);
            var classval = $('<td>').text(className);
            var deletebtn = $('<button>').text('Delete').attr('class', 'delete');
            var editbtn = $('<button>').text('Edit').attr('class', 'edit');
            var row = $('<tr>').append(cell, classval, deletebtn, editbtn);
            $('tbody').append(row);
            row.hide().fadeIn();
            // Reuse code:
            notify("Data Added Successfully", "green");
            $('#name, #class').val(""); // Combine
        } else {
            // Reuse code:
            notify("You Cannot Submit While Input Fields Are Empty", "red");
        }
    });

});

function notify(message, color) {
    $('#message').text(message).css('color', color).fadeIn();
    setTimeout(function () {
        $('#message').fadeOut();
    }, 2000);
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<button id = "add">Add Name To Table</button>

<input type = "text" placeholder = "Enter Name" id = "name" style = "display: none;">
<input type = "text" placeholder = "Enter Class" id = "class" style = "display: none;">

<button id = "save" style = "display: none;">Add Name</button>

<table>
    <thead>
        <tr>
            <th>Name</th>
            <th>Class</th>
            <th>Action</th>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>

<span id = "message" style = "display:none"></span>
<div id = "editdiv"></div>

Спасибо, сэр! Это решение не только решило мою проблему, но и научило меня более эффективному подходу к кодированию.@trincot

Zahab Abbas 01.05.2024 12:23

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