Если вы собираетесь использовать синтаксис class
, вы не хотите предоставлять пользовательскую функцию init
;вместо этого предоставьте конструктор и используйте new
.
Также важно помнить, что jQuery основан на множестве , что означает, что this
при вызове является объектом jQuery, содержащим набор элементов.В большинстве случаев плагин должен действовать так, как если бы он был вызван для каждого из этих элементов в отдельности.Например:
(function ($, window, undefined) {
'use strict';
// Moved defaults out of the function, added
// more for the example
const defaults = {
someOption: "foo",
someOtherOption: "bar",
color: "green"
};
// The class
class Slider {
constructor(loop = true, options) {
// Handle initialization in the constructor
this.options = defaults;
this.setOptions(loop, options);
}
setOptions(loop, options) {
this.loop = loop;
this.options = Object.assign({}, this.options, options);
// In ES2017+, you could use:
// this.options = {...defaults, ...this.options};
}
// Use a method to handle applying the slider to an element
apply($el) {
// ...do slider's thing on $el...
$el.css("color", this.options.color);
$el.text("loop = " + this.loop);
}
}
$.fn.blueSlider = function(loop, options) {
// Loop through the elements
this.each(function() {
// Create or reuse an instance for each element
const $el = $(this);
let slider = $el.data("blueSlider");
if (slider) {
// Element already has a slider
slider.setOptions(loop, options);
} else {
// Create slider for element, remember it
slider = new Slider(loop, options);
$el.data("blueSlider", slider);
}
slider.apply($el);
});
};
}(jQuery))
$('div.a').blueSlider(true, {color: "blue"});
$('div.b').blueSlider(false);
setTimeout(() => {
$('div.a:first').blueSlider(false);
}, 800);
<div class="a"></div>
<div class="a"></div>
<div class="b"></div>
<div class="b"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>