我开始做jQuery插件,所以我没有太多的经验,今天我想要做的就是为我正在处理的插件创建一个自定义事件。
我有一个很好的例子来向您展示我想要做的是bootstrap tooltip plugin,使用此插件我可以做类似的事情:
$('.my-tooltip').tooltip('show');
强制插件执行操作,在这种情况下执行show()
插件函数
对于我的具体情况,我正在使用jQuery validate插件在网站周围自定义验证表单的插件,我不想做类似的事情:
$('form#whatever').validateForm('showInlineChecks');
强制插件为某些特定字段运行验证。
让我们来看看我的代码:
/*
* jQuery plugin to validate forms around segurosdigitales
* requires jquery validate plugin
* */
if( typeof Object.create !== 'function' ){
Object.create = function( obj ) {
function F(){};
F.prototype = obj;
return new F();
}
}
(function($){
var validator = {
// init the plugin
init: function(options, element){
var self = this;
self.options = $.extend( {}, $.fn.validateForm.options, options );
self.elem = element;
self.$elem = $(element);
self.validateTheForm();
},
// Set default options for jQuery validate plugin
setValidationOptions: function(){
var self = this;
// Default options for all forms around the app
// These are the default options for jquery validate plugin
var jQueryValidatePluginOptions = {
onfocusout: function(e){
// Validate all elements when 'blur' event happens, except if it has a 'datepicker-open' class, I'm adding this class because datepicker causes that the input element loses focus and validation error is triggered
if(!$(e).hasClass('datepicker-open')){
this.element(e);
}
},
errorElement: 'span',
errorClass: 'error help-block',
errorPlacement: function(error, element){
if(element.is('input[type="checkbox"]')){
error.insertAfter(element.parent());
} else {
error.insertAfter(element);
}
},
// Highlight occurs when element has erros
highlight: function(element, errorClass, validClass){
$(element).addClass(errorClass).removeClass(validClass);
var control_group = $(element).closest('.control-group, .controls-row');
control_group.addClass(errorClass).removeClass(validClass);
// Remove any valid icon
control_group.find('i.icon-ok').remove();
},
// Unhighlight occurs when element is valid
unhighlight: function(element, errorClass, validClass){
$(element).removeClass(errorClass).addClass(validClass);
// get the parent of the field
var control_group = $(element).closest('.control-group, .controls-row');
// is field empty?
var element_is_empty = ( $(element).val() === '' );
if (!element_is_empty && !control_group.find('i.icon-ok').length) {
var label = control_group.find('label');
// Prevent to add more than one icon if control group contains more than one label (ie. when we have checkboxes and radio buttons)
$.each(label, function () {
$(this).prepend('<i class="icon-ok green"></i>');
return false;
});
// add class only if element is valid and not empty
control_group.removeClass(errorClass).addClass(validClass);
}
}
};
// add other options depending of validateForm plugin options
if( self.options.errorMessages ){
jQueryValidatePluginOptions.messages = self.options.errorMessages;
}
if( self.options.rules ){
jQueryValidatePluginOptions.rules = self.options.rules;
}
if( self.options.showNotification ){
jQueryValidatePluginOptions.invalidHandler = function(event, validator){
var errors = validator.numberOfInvalids();
if(errors){
generateNotification('error', false, 'Por favor corrige los errores en los campos resaltados en rojo para poder continuar.');
}
}
}
return jQueryValidatePluginOptions;
},
// Validate form
validateTheForm: function(){
var self = this;
var validateOpts = self.setValidationOptions();
self.$elem.validate(validateOpts);
}
};
$.fn.validateForm = function(options){
return this.each(function(){
var validate = Object.create(validator);
validate.init(options, this);
});
};
$.fn.validateForm.options = {
errorMessages: null,
rules: null,
showNotification: true
}
})(jQuery);
我该怎么做?
答案 0 :(得分:8)
使用jquery创建,发布和订阅自定义事件非常简单。
要发出自定义事件,您只需调用触发器
即可 $(elem).trigger('myCustomEvent.myNS')
我建议始终使用命名空间,以便更轻松地管理自定义事件
然后,您就像常规活动一样订阅您的活动
$(elem).on('myCustomEvent.myNS', function(event) {
})
您还可以添加传递给事件处理程序的其他参数,例如
$(elem).trigger('myCustomEvent.myNS', ['p1', 'p2'])
$(elem).on('myCustomEvent.myNS', function(event, param1, param2) {
console.log(param1) // outputs p1
console.log(param2) // outputs p2
})
总的来说,在某些用户操作上,例如点击按钮,您将发出自定义事件,就像这样
$(elem).on('click', 'button.save', function (e) {
$(elem).trigger('validate.myCtrl', [e, this])
})
另请注意,如果您的事件与正在定义事件的对象上的某个方法具有相同的名称,则jquery将在调用
trigger
时尝试调用此方法。要避免这种行为,请使用triggerHandler
jquery方法。
更新:@cristiangrojas,我建议你在这里检查设置jquery插件的不同“标准”方式https://github.com/shichuan/javascript-patterns/tree/master/jquery-plugin-patterns'