Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Проблема с присвоением класса (https://javascript.ru/forum/jquery/14424-problema-s-prisvoeniem-klassa.html)

bayrach 16.01.2011 03:39

Проблема с присвоением класса
 
Есть список отзывов, структура html такая (генерируется php кодом):
<div id="message">
   <input type="checkbox" name="msg_id[]" value="id"><span>msg_text...</span>
</div>

Необходимо, чтобы каждому диву содержащему в себе выделенный чекбокс присваивался класс .todelete. Вот код, который работает в 1.3.2. Сейчас обновился до 1.4.4 и этот код уже не работает.
$("#message input:checkbox:checked").parents("#message").addClass("todelete");

x-yuri 16.01.2011 04:17

откуда такой извращенный способ поиска?
$('#message').has('input:checkbox:checked').addClass("todelete")

bayrach 16.01.2011 13:56

Теперь всё правильно работает только 1 раз, при 2-й попытке удаления, удаление происходит в бд, а на экране блоки #message не исчезают, смотрю через firebug и действительно блокам #message не присвоен класс .todelete.
вот код:
$("span.loader").ajaxStart(function(){
    $(this).show();
    $("#message").has("input:checkbox:checked").addClass("todelete");
    $("#del_btn:input").attr({disabled: 'disabled'});
  });
    formData = $('#msg_form input:checkbox').serialize();
    $.post('admin/guestbook.php', formData, function(res){
      var json = eval("("+res+")");
      $("span.loader").hide();
      $(".todelete").animate({opacity:'hide'},"slow");
      $("span.res").html(json.status);
      $('#msg_form').trigger('reset');
      $("#del_btn:input").removeAttr('disabled');
    });

bayrach 16.01.2011 14:22

Проблема решена добавлением перед #message div, то есть:
$("div#message")
, хотя в ранней версии без див работало ;)
x-yuri, спасибо, действительно, ваш метод логичнее и правильнее

x-yuri 16.01.2011 15:58

минутку, у тебя на странице несколько элементов с одинаковым id? Никогда так не делай ;)

bayrach 16.01.2011 18:59

спасибо, согласен, вот сейчас переделал структуру и получилось примерно следующее: (то что внутри формы генерируется php кодом)
<input type="checkbox" id="check_all" name="id" value="">On/Off All
<form id="msg_form" action="#">
<div id="message<?=$id;?>" class="msg_row">
  <input type="checkbox" class="checkbox" name="id_msg[]" value="<?=$id?>">
  <div class="author">name</div>
  <div class="msg_text">msg...</div>
</div>

Необходимо, чтобы при выделении чекбокса или чекбоксов менялся фон блока/блоков с классом msg_row. Решил проблему, но как мне кажется извратившись:
/* Включение/отключение всех чекбоксов */
  $("#check_all").click(function(){
      if (!$(this).is(":checked"))
        $(".checkbox").removeAttr("checked").parents(".msg_row").removeClass("select_row");
      else
        $(".checkbox").attr("checked","checked").parents(".msg_row").addClass("select_row");
  });
  
  /* Выделение блоков содержащих выделенный чекбокс */
  
  $("#msg_form input:checkbox").click(function(){
    if ($(this).is(":checked")) {
      $(this).parents(".msg_row").addClass("select_row");
    }
    else {
        $(this).parents(".msg_row").removeClass("select_row");
    }
    });

Можно как-то оптимизировать код? Спасибо.

x-yuri 16.01.2011 20:04

не обязательно все в одну строку писать:
$(".checkbox").removeAttr("checked");
$(".msg_row").removeClass("select_row");


попробуй будет ли работать так:
$(".checkbox").attr("checked", true)


есть closest:
$(this).closest(".msg_row").addClass("select_row");


а еще можно делать так:
var f =   $(this).is(':checked')   ? 'addClass'   : 'removeClass';
$(this).closest(".msg_row")[f]("select_row");

bayrach 16.01.2011 22:14

спасибо ^)


Часовой пояс GMT +3, время: 13:23.