#javascript #jquery #class #plugins #static
#javascript #jquery #класс #Плагины #статический
Вопрос:
(function ($, window, undefined) {
'use strict';
class Slider {
static init(loop) {
Slider.loop = loop;
return Slider.loop;
}
};
$.fn.blueSlider = function(loop, options) {
var defaults = {
}
var loop = Slider.init(loop);
console.log(loop);
$.extend(defaults, options);
};
}(jQuery))
$('div').blueSlider(true);
<div></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Я новичок в создании кода с использованием class function
поэтому, пожалуйста, извините за любые другие ошибки, которые я не упомянул в вопросе.
Я пытаюсь объединить class function
и плагин jQuery. Эта строка: $.fn.blueSlider = function(loop, options)
функция инициализации jQuery имеет 2 параметра, и loop
параметр на самом деле является Slider.init()
параметром ‘s. Итак, я должен объявить новую переменную, подобную этой, var loop = Slider.init(loop);
для доступа к loop
значению.
Я ожидаю поместить loop
параметр внутри options
, чтобы он мог быть вызван методом инициализации jQuery, когда я хочу изменить значение loop
следующим образом:
$(className).blueSlider({
loop: false,
// etc.
})
Я пытался создать объект options
и поместить его в loop
параметр для передачи значения другому объекту, но это не сработало:
$.fn.blueSlider = function(options) {
var defaults = {
}
var options = {
loop: Slider.init(loop),
}
$.extend(defaults, options);
};
Есть ли какие-либо способы исправить эту проблему?
Ответ №1:
Если вы собираетесь использовать 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>
Комментарии:
1. Спасибо за отличный пример. Я так долго искал в Google и github, пытаясь выяснить, как они работают.