powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Несколько копий одного плагина - как написать?
2 сообщений из 2, страница 1 из 1
Несколько копий одного плагина - как написать?
    #39035608
maxapet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использую простейшую карусель .
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
/********************************************************/
/*                                                      */
/*  jquery.CarouselLifeExample.js                       */
/* Плагин "Карусель от LifeExample.ru" для jQuery        */
/*  Автор: Авдеев Марк                                   */
/*              2012г.                                 */
/*                                                      */
/* Для ипользования плагина необходимо определить     */
/* контейнер и вложить в него маркированный список:        */
/*                                                      */
/*  <div class="container">                             */
/*                <ul class="carousel">                 */
/*                        <li>1</li>                    */
/*                        <li>2</li>                    */
/*                        <li>3</li>                    */
/*                        <li>4</li>                    */
/*                        <li>5</li>                    */
/*                        <li>6</li>                    */
/*                </ul>                                 */
/*    </div>                                            */
/* После чего можно указать параметры для использования */
/* плагина                                               */
/* $('.container').Carousel({                           */
/*  visible: 3,  //количество отображаемых позиций 3   */
/*  rotateBy: 1, //прокручивать по 1                  */
/*  speed: 1000, //скорость 1 секунда                    */
/*  btnNext: null, // кнопка вперед не назначена     */
/*  btnPrev: null, // кнопка назад не назначена           */
/*  auto: true, // авто прокрутка включена             */
/*  margin: 10, // отступ между позициями               */
/*  position: "h",// расположение по горизонтали       */
/*  dirAutoSlide: false //направление движения           */
/*  });                                                 */
/*  Или использовать параметры по умолчанию              */
/*  $('.container').Carousel();                         */
/*                                                      */
/********************************************************/
(function($) {
    $.fn.Carousel = function(options) {
        // Настройки по умолчанию
        settings = {
            visible: 1,         // количество отображаемых позиций 1
            rotateBy: 1,     // прокручивать по 1
            speed: 1000,    //скорость 1 секунда
            btnNext: null,   // кнопка вперед не назначена
            btnPrev: null, // кнопка назад не назначена
            auto: false, // автопрокрутка отключена
            margin: 10,    // отступ между позициями
            position: "h",// расположение по горизонтали
            dirAutoSlide: false, //направление движения в перед для автопрокрутки
            slideCounter: -1 // счётчки сдвигов
        };
        return this.each(function() {
            if (options) {
                $.extend(settings, options); //устанавливаем пользовательские настройки 
            }

            // определяем переменные
            var $this = $(this); //родительский элемент (Блок в котором находится карусель)  
            var $carousel = $this.children(':first'); // получаем дочерний элемент (UL) т.е. саму карусель
            var itemWidth = $carousel.children().outerWidth() + settings.margin; // вычисляем ширину элемента
            var itemHeight = $carousel.children().outerHeight() + settings.margin; // вычисляем высоту элемента                   
            var itemsTotal = $carousel.children().length; // получаем общее количество элементов в карусели
            var slideCnt = settings.slideCounter;
            var running = false; //останавливаем процесс
            var intId = null; //очищаем интервал
            //size - размер для вычисления длины, зависит от ориентации карусели
            var size = itemWidth;
            if (settings.position == "v") size = itemHeight;
            //Если карусель вертикальная то
            if (settings.position == "v")
                $this.css({
                    'position': 'relative', // необходимо для нормального отображения в ИЕ6(7)
                    'overflow': 'hidden', // прячем все, что не влезает в контейнер
                    'height': settings.visible * size + 'px',// ДЛИНУ контейнера ставим равной ширине всех видимых элементов
                    'width': itemWidth - settings.margin //Ширина контейнера равна ширине элемента
                });
            else
                $this.css({
                    'position': 'relative', // необходимо для нормального отображения в ИЕ6(7)
                    'overflow': 'hidden', // прячем все, что не влезает в контейнер
                    'width': settings.visible * size + 'px',// ширину контейнера ставим равной ширине всех видимых элементов
                    'height': itemHeight - settings.margin
                });
            //вычисляем расстояние отступа от каждого элемента
            if (settings.position == "v")
                $carousel.children('li').css({
                    'margin-top': settings.margin / 2 + 'px',
                    'margin-bottom': settings.margin / 2 + 'px',
                    'float': 'left',
                    'width': '60px',
                    'height': '40px',
                    'padding': '0',
                    'font': '12pt Arial',
                    'color': 'white',
                    'border': 'none'
                });
            else
                $carousel.children('li').css({
                    'margin-left': settings.margin / 2 + 'px',
                    'margin-right': settings.margin / 2 + 'px',
                });
            // в зависимости от ориентации, увеличиваем длину или ширину карусели
            if (settings.position == "v")
                $carousel.css({
                    'position': 'relative', // разрешаем сдвиг по оси
                    'height': 300 + 'px', // увеличиваем ленту карусели
                    'left': 0,
                    'top': 0
                });
            else
                $carousel.css({
                    'position': 'relative', // разрешаем сдвиг по оси
                    'width': 999 + 'px', // увеличиваем ленту карусели
                    'top': 0,
                    'left': 0
                });
            function doSlide(dir) {
                var direction = !dir ? -1 : 1; // устанавливаем заданное направление
                var indent = 0; // смещение (для ul)
                if (!running) {
                    // если анимация завершена (или еще не запущена)
                    running = true; // ставим флажок, что анимация в процессе
                    if (intId) { // если запущен интервал
                        window.clearInterval(intId); // очищаем интервал                                         
                    }
                    if (!dir) { // если мы мотаем к следующему элементу (так по умолчанию)
                        /*
            * вставляем после последнего элемента карусели
           * клоны стольких элементов, сколько задано
           * в параметре rotateBy (по умолчанию задан один элемент)
          */
                        $carousel.children(':last').after($carousel.children().slice(0, settings.rotateBy).clone(true));
                    } else { // если мотаем к предыдущему элементу
                        /*
           * вставляем перед первым элементом карусели
          * клоны стольких элементов, сколько задано
          * в параметре rotateBy (по умолчанию задан один элемент)
        */
                        $carousel.children(':first').before($carousel.children().slice(itemsTotal - settings.rotateBy, itemsTotal).clone(true));
                        /*
          * сдвигаем карусель (<ul>)  на ширину/высоту  элемента,
          * умноженную на количество элементов, заданных
         * в параметре rotateBy (по умолчанию задан один элемент)
         */
                        if (settings.position == "v")
                            $carousel.css('top', -size * settings.rotateBy + 'px');
                        else $carousel.css('left', -size * settings.rotateBy + 'px');
                    }

                    /*
 * расчитываем  смещение
* текущее значение  + ширина/высота  одного элемента * количество проматываемых элементов * на направление перемещения (1 или -1)
  */
                    if (settings.position == "v")
                        indent = parseInt($carousel.css('top')) + (size * settings.rotateBy * direction);
                    else
                        indent = parseInt($carousel.css('left')) + (size * settings.rotateBy * direction);
                    var animateData;
                    if (settings.position == "v") {
                        animateData = { 'top': indent };
                    } else {
                        animateData = { 'left': indent };
                    } // запускаем анимацию
                    $carousel.animate(animateData, {
                        queue: false,
                        duration: settings.speed,
                        complete: function () {
                            // когда анимация закончена
                            if (!dir) { // если мы мотаем к следующему элементу (так по умолчанию)
                                // удаляем столько первых элементов, сколько задано в rotateBy
                                $carousel.children().slice(0, settings.rotateBy).remove();
                                // устанавливаем сдвиг в ноль
                                if (settings.position == "v")
                                    $carousel.css('top', 0);
                                else $carousel.css('left', 0);
                            } else { // если мотаем к предыдущему элементу
                                // удаляем столько последних элементов, сколько задано в rotateBy
                                $carousel.children().slice(itemsTotal, itemsTotal + settings.rotateBy).remove();
                            }
                            slideCnt--;
                            if (slideCnt == 0)
                                $(this).trigger('Carousel.drawComplete');
                            if (slideCnt != 0 && settings.auto) { // если карусель должна проматываться автоматически
                                // запускаем вызов функции через интервал времени (auto)
                                intId = window.setInterval(function () { doSlide(settings.dirAutoSlide); }, settings.auto);
                            }
                            running = false; // отмечаем, что анимация завершена
                            $(this).trigger('Carousel.animationComplete');
                        }
                    });
                }
                return false; // возвращаем false для того, чтобы не было перехода по ссылке
            }
            var methods = {
                init: function () {},
//прокрутка карусели в наравлении dir [true-вперед; false-назад]
                slide: function (dir) {
                    doSlide(dir);
                }
            };
// обеспечиваем внешний вызов методов плагина
            $.fn.Carousel = function(method) {
                // логика вызова метода
                if (methods[method]) {
                    return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
                } else if (typeof method === 'object' || !method) {
                    return methods.init.apply(this, arguments);
                } else {
                    //$.error('Метод с именем ' + method + ' не существует для jQuery.Carousel');
                }
            };
            
// назначаем обработчик на событие click для кнопки "вперед"
            $(settings.btnNext).click(function() {
                return doSlide(false);
            });
            // назначаем обработчик на событие click для кнопки "Назад"
            $(settings.btnPrev).click(function() {
                return doSlide(true);
            });

            if (settings.auto) { // если карусель должна проматываться автоматически
                // запускаем вызов функции через временной интервал
                intId = window.setInterval(function() { doSlide(settings.dirAutoSlide); }, settings.auto);
            }
        });
    };
})(jQuery);


Всё работало прекрасно ровно до тех пор, пока не понадобилось вставить на страницу ещё одну такую же карусель.

Делаю так:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
<script type="text/javascript">
    $(document).ready(function () {
        // настройка карусели победителей
        $('carousel1').Carousel({
            visible: 1,
            rotateBy: 1,
            speed: 1000,
            auto: true,
            position: 'h',
            margin: 10,
            slideCounter: 5,
            dirAutoSlide: true
        }).bind('Carousel.animationComplete', switchCarousel);
        $('#carousel2').Carousel({
            visible: 1,
            rotateBy: 1,
            speed: 50,
            auto: true,
            position: 'h',
            margin: 10,
            slideCounter: 6,
            dirAutoSlide: false
        }).bind('Carousel.animationComplete', switchCarousel);
    });
</script>



Обращение ко второму объекту вызывает ошибку вида "0x800a138f - Ошибка выполнения JavaScript:
Не удалось получить свойство "bind" ссылки, значение которой не определено или является NULL".
Хотя, сам объект carouse2 существует.
В чём может быть дело?
Есть какие-то особенности в написании плагинов, которые можно использовать несколько на одной странице?
...
Рейтинг: 0 / 0
Несколько копий одного плагина - как написать?
    #39045132
oaken
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maxapet,

мое предположение: проблема в carousel1, а не d carousel2, селектор неверный пропущен символ #
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Несколько копий одного плагина - как написать?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]