jQuery: привязать элемент, чтобы показать / скрыть при изменении его содержимого

Допустим, у меня есть сообщения на моей странице:

<div class="message one">Here is some text.</div>
...
<div class="message two">Here is other text for something else.</div>

У меня есть много событий, которые могут либо добавить текст в сообщение, либо очистить его.

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

Я хотел бы установить привязку, которая срабатывает при изменении любого сообщения div, так что если оно установлено пустым, оно скользит вверх, а если оно установлено с пустого на наличие текста, то оно скользит вниз.

Возможно ли это, и если да, то как?

3 ответа

Решение

По этой ссылке это называется "событием мутации", которое не поддерживается в JQuery: обнаружение изменений содержимого элемента с помощью jQuery.

Я бы рекомендовал просто создать вспомогательную функцию, чтобы объединить логику в одном месте. Например:

function updateElement(selector, newText)
{
    $(selector).text(newText);
    if (newText == '') $(selector.slideUp());
    else $(selector.slideDown());
}

Вот что-то не в моей голове, и это не совсем то, что вы ищете, а скорее функция, вызываемая при обновлении текста div, она потребует, чтобы вы изменили классы div из отдельных классов: 'message one'одному классу'message_one'

<script>
    $(function(){

        function show_message(class, message)
        {
            var $div = $('div[class='+class+']');

            $div.slideUp(250, function(){

                if (message.length > 0)
                {
                    $div.html(message);
                    $div.slideDown(250);
                }
            });
        }

        // example of calling this

        $('button').click(function(){
            // hide the div
            show_message('message_one', '');
        });

        $('someotherbutton').click(function(){
            // this will slideup and then slidedown
            show_message('message_two', "<p>Here's my message.</p>");
        });

    });
</script>

Попробуй это:

$("div").live("change", function() {

   if ( $(this).text().length == 0) {

       $(this).slideUp();

   }  else { $(this).slideDown();}

});
Другие вопросы по тегам