если ($ (var).css(‘display’) == «блокировать») с помощью slideToggle?

#javascript #jquery #css

#javascript #jquery #css

Вопрос:

Я пытаюсь изменить значок, отображаемый в заголовке опции ( .option-title ), когда содержимое ниже, например, ( .add_to_rotation ), переключается вверх или вниз. При нажатии вниз должна отображаться кнопка close ( .retract-icon ), а при нажатии вверх должна отображаться add ( .expand-icon ) .

Проблема, я думаю, заключается в задержке с момента slideToggle вызова, пока вызываемое свойство не изменится с display: hidden на display: block и наоборот.

Вот мой код:

 $('.option-title').click( function() {
      var name = $(this).attr('id');
      $('.'   name).slideToggle('slow');
      if($('.'   name).css('display') == "block") {
        $(this).html("Add to Rotation? <div class="retract-icon">");
      } else {
        $(this).html("Add to Rotation? <div class="expand-icon">");
      }
  });
  

Первая часть if() условия выполняется нормально, поэтому условие должно считаться истинным, но при повторном нажатии первое условие по-прежнему считается истинным, и содержимое .option-title не меняется.

Как я мог заставить его работать в соответствии с моим описанием выше?

Буду признателен за любую помощь ;).

Комментарии:

1. Попробуйте, if($(...).is(':visible')) { ... }

2. Ваш селектор идентификатора / имени выглядит странно: похоже, вы делаете что-то вроде взлома, и у вас есть такой элемент, <div id="foo"> который находит что-либо class="foo" и скрывает / показывает это. Это ваше намерение?

Ответ №1:

Я вижу два простых способа решить эту проблему.

Вместо использования slideToggle сначала определите условие, а затем используйте slideUp или slideDown, которые заставят ваше сообщение отображаться во время выполнения слайда:

 $('.option-title').click( function() {
      var name = $(this).attr('id');
      var slider = $('.'   name); // shortcut to the element that's being slid. There's probably a better variable name you can use but I don't know the context
      if(slider.css('display') == "block") {
            slider.slideUp('slow');
            $(this).html("Add to Rotation? <div class="retract-icon">");
      } else {
            slider.slideDown('slow');
            $(this).html("Add to Rotation? <div class="expand-icon">");
      }
  });
  

Или используйте обратный вызов, который будет означать, что ваше сообщение не появится до завершения слайда:

 $('.option-title').click( function() {
      var name = $(this).attr('id');
      var slider = $('.'   name); // shortcut to the element that's being slid. There's probably a better variable name you can use but I don't know the context
      slider.slideToggle('slow', function() {
        if(slider.css('display') == "block") {
            $(this).html("Add to Rotation? <div class="retract-icon">");
        } else {
            $(this).html("Add to Rotation? <div class="expand-icon">");
        }
      });
  });
  

Ответ №2:

По крайней мере, часть проблемы может заключаться в том, что вы смешиваете classes и ids .

Вы получаете id здесь

var name = $(this).attr('id');

но затем найдите class здесь

$('.' name).slideToggle('slow');

Не уверен, что это то, что вы пытаетесь сделать.

Если нет, измените $('.' name) на $('#' name)

Комментарии:

1. Проблема не в этом. .option-title имеет идентификатор, который совпадает с именем класса другого элемента. Глупо, я знаю.

2. В этом случае я бы использовал ответ от @gregmac re a callback function .