Подскажите по созданию плагина
Есть маленький плагин, ничего особого не делает, только выводит в консоль опции при создании объекта и при нажатие. Понимаю, что вопрос мега глупый, но данный код не работает с несколькими объектами, почему и как это сделать. Простите ребята, каюсь. :cray:
<script>
(function($) {
var pluginName = 'Plugin',
defaults = {
propertyName: "value"
};
options = {};
function Plugin( element, options ) {
this.element = element;
this.options = $.extend( {}, defaults, options) ;
this._defaults = defaults;
this._name = pluginName;
this.init();
}
Plugin.prototype = {
init: function (e) {
console.log(this.options);
}
};
$.fn.Plugin = function ( options,event ) {
this.each(function () {
plugin = new Plugin( this, options );
});
$(this).click(function(){
plugin.init();
});
}
})(jQuery);
$( document ).ready(function() {
$('#alert').Plugin({color:'green'});
$('#alert1').Plugin({color:'red'});
});
</script>
<div id='alert'>alert</div>
<div id='alert1'>alert1</div>
|
elink12,
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
</head>
<body>
<script>
(function($) {
var pluginName = 'Plugin',
defaults = {
propertyName: "value"
},
options = {};
function Plugin( element, options ) {
this.element = element;
this.options = $.extend( {}, defaults, options) ;
this._defaults = defaults;
this._name = pluginName;
this.init();
}
Plugin.prototype = {
init: function (e) {
console.log(this.options);
$(this.element).click(this.click.bind(this));
},
click : function(){
console.log(this.options);
}
};
$.fn.Plugin = function ( options,event ) {
return this.each(function () {
new Plugin( this, options );
});
}
})(jQuery);
$( document ).ready(function() {
$('#alert').Plugin({color:'green'});
$('#alert1').Plugin({color:'red'});
});
</script>
<div id='alert'>alert</div>
<div id='alert1'>alert1</div>
</body>
</html>
|
elink12,
$("input",this.element).click(this.click.bind(this));
|
elink12,
или так строка 36
$(this.element).on("click","input",this.click.bind(this));
|
elink12,
или так
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
</head>
<body>
<script>
(function($) {
var pluginName = 'Plugin',
defaults = {
propertyName: "value"
},
options = {};
function Plugin( element, options ) {
this.element = element;
this.options = $.extend( {}, defaults, options) ;
this._defaults = defaults;
this._name = pluginName;
this.init();
}
Plugin.prototype = {
init: function (e) {
console.log(this.options);
$(this.element).on({"click" : this.click},"input",this.options);
},
click : function(e){
this.value = e.data.color
}
};
$.fn.Plugin = function ( options,event ) {
return this.each(function () {
plugin = new Plugin( this, options );
});
}
})(jQuery);
$( document ).ready(function() {
$('#alert').Plugin({color:'green'});
$('#alert1').Plugin({color:'red'});
});
</script>
<div id='alert'>alert<input type="text"></input></div>
<div id='alert1'>alert<input type="text"></input></div>
</body>
</html>
|
$(this.element).on({"click" : this.click},"input",this.options);
Вот это мне очень помогло, получается происходит "сопряжение" действия с функцией, мне почему-то казалось, что по структуре и логике должно быть немного иначе и требуется это делать в fn, как контроллере, получается, что объект создается каждый раз при любом событие и обрабатывается в Init? |
jQuery boilerplate. Связывание переменной this с функцией.
elink12, еще вариант с полноценным джеквери бойлепрелтом.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
</head>
<body>
<script>
;(function ( $, window, undefined ) {
var pluginName = 'Plugin',
document = window.document,
defaults = {
propertyName: "value"
};
function Plugin( element, options ) {
this.element = element;
this.options = $.extend( {}, defaults, options) ;
this._defaults = defaults;
this._name = pluginName;
this.init();
}
Plugin.prototype = {
init: function (e) {
*!*
$(this.element).click($.proxy(this.click, this));
*/!*
},
click : function(){
console.log(this.options);
}
};
$.fn[pluginName] = function ( options ) {
return this.each(function () {
if (!$.data(this, 'plugin_' + pluginName)) {
$.data(this, 'plugin_' + pluginName, new Plugin( this, options ));
}
});
};
}(jQuery, window));
$(function() {
$('#alert').Plugin({color:'green'});
$('#alert1').Plugin({color:'red'});
});
</script>
<div id='alert'>alert</div>
<div id='alert1'>alert1</div>
</body>
</html>
|
Хм, а как в этих случаях правильно передать значение value в функцию?
у меня возвращается событие, можно конечно из него вытащить, но будет ли это верно? |
Блин, что-то не пойму, как из инит например вызвать другую функцию конструктора , какой синтаксис в плагине?
|
Цитата:
Plugin.prototype = {
click : function(e){
e.target.value = this.options.color;
}
};
Цитата:
Plugin.prototype = {
init: function (e) {
$(this.element).click($.proxy(this.click, this));
this.log('test');
},
click : function(e){
e.target.value = this.options.color;
},
log: function(msg) {
console.log(msg);
}
};
|
Да, из init проходит, а вот если из log вызвать log1 то получаю ошибку через this = Uncaught TypeError: this.log1 is not a function
Plugin.prototype = {
init: function (e) {
$(this.element).click($.proxy(this.click, this));
this.log('test');
},
click : function(e){
e.target.value = this.options.color;
},
log: function(msg) {
console.log(msg);
this.log1('test');
}
log1: function(msg) {
console.log(msg);
}
};
Цитата:
|
elink12,
строка 12, запятая где? |
Ночь, улица, фонарь, запятую забыл :) но это сути не поменяло. На jsfiddle создал , так же в консоли ошибка https://jsfiddle.net/9dykvku6/8/
<div id='alert'> 1.<input type="text"> </div> <div id='alert1'> 2.<input type="text"> </div>
(function($) {
var pluginName = 'Plugin',
defaults = {
color: "green",
},
options = {};
function Plugin( element, options ) {
this.element = element;
this.options = $.extend( {}, defaults, options) ;
this.defaults = defaults;
this.name = pluginName;
this.input_name = $(element).attr('name');
this.init();
}
Plugin.prototype = {
init: function (e) {
$(this.element).on({"keyup" : this.log},"input",this.options);
},
log: function(msg) {
console.log(msg);
this.log1('test');
},
log1: function(msg) {
console.log(msg);
}
};
$.fn.Plugin = function ( options,event ) {
return this.each(function () {
new Plugin( this, options );
});
}
})(jQuery);
$( document ).ready(function() {
$('#alert').Plugin({color:'ааа'});
$('#alert1').Plugin({color:'red'});
});
|
elink12,
$(this.element).keyup($.proxy(this.log, this)) или
$(this.element).on({"keyup" : this.log.bind(this)},"input",this.options);
только у вас msg === event в log |
| Часовой пояс GMT +3, время: 14:07. |