Помогите нубу. TypeError "Имя_переменной.имя_функции" is not a function

fortuner

Хранитель порядка
Регистрация
26 Июн 2012
Сообщения
631
Реакции
1.238
Я понимаю, что наверняка сделал что-то неправильно и криво. Вот код:
Код:
    updateSlider : function(jsonData){
      
        var slider = $('dl.products').bxSlider({
            infiniteLoop: false,
            //slideSelector: 'dt',
            minSlides: 1,
            maxSlides: 2,
            slideWidth: 400,
            slideMargin: 10,
            moveSlides: 1
        });
      
        if (parseInt(jsonData.nbTotalProducts) > 0)
        {
            slider.reloadSlider();
        }
        else
        {
            slider.destroySlider();
        }
    },

Который выдает ошибку
Uncaught TypeError: slider.reloadSlider is not a function
Задача простая - запустить слайдер при добавлении товара в корзину, перезагрузить, если товар уже есть и удалить, если товаров нет. Все работает, кроме этого вызова slider.reloadSlider(); и slider.destroySlider();

Помогите, кто чем может!

Вот ссылка на документацию слайдера:
Для просмотра ссылки Войди или Зарегистрируйся
Что я делаю не так??? :(
 
slider.length что у вас вернет? Если больше 1, то как-то так, наверное:
HTML:
var slider = [],
  el = $('dl.products');
  el.each(function(){
      slider.push($(this).bxSlider());
  });
var q = el.length;
if (parseInt(jsonData.nbTotalProducts) > 0) {
  while(q--){
  slider[q].reloadSlider();
  }
} else {
  while(q--){
  slider[q].destroySlider();
  }
}
 
Огромное спасибо!
Можно несколько вопросов?
1. Почему-то не срабатывает destroySlider. То есть не удаляется <div class="bxslider">...</div>. Например, добавляем товары в корзину, потом все убираем и добавляем заново. Предыдущий div остался, под ним создался новый. Честно, не знаю как правильно - удалить предыдущий или пытаться в него снова добавлять товары?
2. Я правильно понимаю, что настройки самого слайдера надо прописывать здесь: slider.push($(this).bxSlider({ настройки: бла-бла })); ?
 
1. Почему-то не срабатывает destroySlider. То есть не удаляется <div class="bxslider">...</div>. Например, добавляем товары в корзину, потом все убираем и добавляем заново. Предыдущий div остался, под ним создался новый. Честно, не знаю как правильно - удалить предыдущий или пытаться в него снова добавлять товары?
2. Я правильно понимаю, что настройки самого слайдера надо прописывать здесь: slider.push($(this).bxSlider({ настройки: бла-бла })); ?
1. Вы, как я понял, не на .bxslider вызываете плагин, а на dl.products? Выложите этот участок HTML - так проще будет.
2. Да, верно. Обычный объект передается. Можно вынести в переменную перед циклом для упрощения.
var a = { настройки: бла-бла };
slider.push($(this).bxSlider(a));
 
1. Да, на dl.products. По идее, destroySlider должен удалять его а reloadSlider перезапускать? Но на практике получается что-то не то. Дивы <div class="bxslider">...</div> и другие добавляет сам слайдер.
Вот кусок кода. Извините, что получилось так громоздко:
Скрытое содержимое доступно для зарегистрированных пользователей!


Видно, что слайдер запустился два раза.

ПС. Еще раз огромное спасибо за вашу помощь! Скиньте номер Вебмани или какой-либо другой удобный вам кошелек, отправлю вам восемь шт. бельгийского пива :)
 
1. Да, на dl.products. По идее, destroySlider должен удалять его а reloadSlider перезапускать? Но на практике получается что-то не то. Дивы <div class="bxslider">...</div> и другие добавляет сам слайдер.
Вот кусок кода. Извините, что получилось так громоздко:
при выполнении updateSlider слайдер инициализируется на элементах вновь и вновь, создавая такие обертки.
Выход 1: вынести инициализацию за пределы функции updateSlider (это более правильный выход). Например в ready.
Выход 2: Ставить проверку и писать (куда-то) наш массив. Поскольку неизвестно точно что у вас с this там творится и вы привели лишь часть конструкции - запишем через data, должно работать:
HTML:
var el = $('dl.products');
if('sliderArray' in el.data() === false){
 var arr = el.map(function(){
      return $(this).bxSlider();
  });
  el.data('sliderArray', arr);
}
var sliderArray = el.data('sliderArray');
if (parseInt(jsonData.nbTotalProducts) > 0) {
    $.each( sliderArray, function(){
       this.reloadSlider();
    });
} else {
    $.each(sliderArray, function(){
       this.destroySlider();
    });
}
Скиньте номер Вебмани или какой-либо другой удобный вам кошелек, отправлю вам восемь шт. бельгийского пива :)
Пиво - отлично. Особенно европейское))
Отправил в лс))
 
Последнее редактирование:
Назад
Сверху