jquery — изменение атрибута объекта после создания экземпляра в document.ready()

#php #javascript #jquery #bxslider

#php #javascript #jquery #bxslider

Вопрос:

я использую плагин bxSlider (слайдер, похожий на jcarousel) в пользовательском магазине Magento.

Пока ползунок установлен в documet.ready() (в разделе head html) таким образом:

 jQuery('#slider2').bxSlider({
    pause: 4000,
    auto: true,
    autoControls: true,
    displaySlideQty: 4,
    moveSlideQty: 1
});
  

Я хочу изменить атрибут auto на false в коде php, если количество элементов слайдера меньше 5. Я пытался изменить его с помощью:

 <?php
    // slider items count
    $prom_count = $this->getPromotionalProducts()->count();;
?>
<?php if($prom_count<5): ?>
    <script>
        $("#slider2").attr('auto','false');    
    </script>
<?php endif; ?> 
  

но это не работает, поэтому я не уверен, что атрибут объектов, созданных в dom ready, может быть изменен таким образом. кто-нибудь может помочь?

Ответ №1:

attr -Метод из библиотеки jQuery работает с атрибутами для HTML-элементов:

 <img src="..." alt="...">
  

В этом случае src и alt являются «атрибутами».

bxSlider настраивается путем предоставления bxSlider -функции массива. Вы не можете изменить этот массив после того, как он был передан функции.

Что вы можете сделать, чтобы переключить автоматическое отображение, это использовать stopShow() -функцию bxSlider. Вероятно, для этого вам потребуется сохранить созданный вами экземпляр bxSlider:

 var slider = jQuery('#slider2').bxSlider({
   ...
});
  

Таким образом, вы можете вызвать функцию для этого объекта:

 slider.stopShow();
  

Делать это с PHP и JavaScript смешанным способом (как вы предложили) некрасиво, и его следует избегать.

Вместо этого вы должны использовать решение только для JavaScript:

 var slider = jQuery('#slider2').bxSlider({
   auto: true,
   ...
});
if (slider.getSlideCount() < 5){
  slider.stopShow();
}
  

Обратите внимание, что getSlideCount() возвращает количество слайдов, которое не гарантируется количеством изображений в галерее! Количество отображаемых слайдов одновременно может быть установлено displaySlideQty -атрибутом. Однако значение по умолчанию равно 1.


Похоже, что есть ошибка, из-за которой startShow и stopShow -функции не работают:https://github.com/wandoledzep/bxslider/pull/43

В качестве грязного обходного пути вы могли бы сделать что-то вроде этого:

 <?php
    echo "<script type="text/javascript">
        jQuery('#slider2').bxSlider({
            pause: 4000,
            autoControls: true,
            displaySlideQty: 4,";
    if($prom_count >= 5) echo "auto: true,";
    echo "moveSlideQty: 1
        });
    </script>";
?>
  

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

1. Спасибо. ну, я попробовал ваше решение, но все еще не работает. это код в файле general .js, вызываемом в разделе head document: dpaste.com/648712 это не работает, и я могу подсчитывать элементы только в разделе тела…

2. Я понял, что это проблема, и есть исправление, которое ожидает извлечения в проекте: github.com/wandoledzep/bxslider/pull/43 Поэтому вам нужно подождать или найти другое решение…

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

4. Предполагается создавать автоматический слайд только при наличии более 5 изображений. Это должно выполнить задание.

5. Обновил мой ответ. Это должно работать, пока не будет найден лучший способ.

Ответ №2:

Похоже, для этого нет функции API. Возможно, конфигурация будет загружена снова, если вы используете reloadShow(). Если это не поможет, вам нужно прочитать исходный код.

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

1. Существует функция, которая делает это. Смотрите мой пост.

Ответ №3:

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

Вы не можете установить правильное auto значение при запуске плагина, поместив сначала php-код?

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

1. нет, поскольку шаблон и php-код, которые генерируют html-раздел слайдера, не совпадают с головной частью … я могу учитывать элементы слайдера только в основной HTML-секции