Отдельная область действия плагина jQuery для каждого элемента

#javascript #jquery #html

#javascript #jquery #HTML

Вопрос:

Я разрабатываю плагин carousel jquery. Я пытаюсь вызвать более одного элемента карусели div, например

 <div class="carousel-container">...</div>
<div class="carousel-container2">...</div>
...
  

Где я вызываю плагин

 $(".carousel-container").mycarousel({
  // Properties
});

$(".carousel-container2").mycarousel({
  // Properties
});
  

Код плагина:

 (function($) {
   $.fn.mycarousel = function(options) {
      var settings = $.extend({
        indicators : true,
        autoplay : true,
        autoplayDir : "forward",
        slidesToShow : 1,
        slidesToScroll : 1
    }, options);

    return this.each(function() {
      // JavaScript code like constructor function and its prototypes

      // variable declarations and initialization
      var outerCarouseWidth, imageWidth;
      var elements, carousel;
      ...

      // jquery code for selectors, events etc.
      var carouselInner = $(".carousel-inner");
      var carouselOuter = $(".carousel-outer");
      ...

      $(".next-link").on("click", function(e) {
            slide("next", "first");
      });
      ...
    });
   };
}(jQuery));
  

Ну, прямо сейчас я пытаюсь получить доступ к дочерним элементам, используя $(this) внутри каждой функции. Например, $(this).children()[0].text(«abc»).

Проблема, с которой я сталкиваюсь здесь, заключается в том, что оба элемента карусели div разделяют область видимости переменных, селекторов и т. Д. Когда я перемещаю одну карусель, другая карусель также перемещается и сталкивается с некоторыми другими техническими проблемами. Как я могу разделить область действия кода плагина jquery для каждого элемента, с помощью которого я вызываю этот плагин?

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

1. Что, если вы попробуете это $(this).find(".next-link").on("click", function(e) { ... ??

Ответ №1:

Область поиска элементов для текущего элемента, к которому применяется плагин.

Используйте carouselEl в качестве родительского селектора для всех вложенных элементов.

Вот так:

«`

 return this.each(function() {
  var carouselEl = $(this);
  ...

  // jquery code for selectors, events etc.
  var carouselInner = carouselEl.find(".carousel-inner");
  var carouselOuter = carouselEl.find(".carousel-outer");
  ...

  carouselEl.find(".next-link").on("click", function(e) {

        slide(carouselEl, "next", "first"); // This must also be scoped.. I cant see the code for this function. 
  });
  ...
});
  

«`

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

1. Должны ли настройки находиться внутри каждой функции или снаружи? Как будто я добавил его снаружи.

2. Он может быть снаружи, как сейчас. Настройки одинаковы для каждого элемента, с которым применяется mycarousel() .