jQuery插件创建自定义事件

时间:2013-05-21 14:31:01

标签: jquery jquery-plugins

我开始做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);

我该怎么做?

1 个答案:

答案 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'