JavaScript插件编写指南form验证

在jQuery大量使用的环境下,目前网上的众多jQuery插件也能基本满足要求,但是在项目具体需求下,有时候依旧需要自己造轮子,本文介绍了依赖jQuery库进行原生JavsScript插件的编写。

插件需要满足的条件

一个可复用的插件需要满足以下条件:

  • 插件自身的作用域与用户当前的作用域相互独立,也就是插件内部的私有变量不能影响使用者的环境变量;
  • 插件需具备默认设置参数;
  • 插件除了具备已实现的基本功能外,需提供部分API,使用者可以通过该API修改插件+ 功能的默认参数,从而实现用户自定义插件效果;
  • 插件支持链式调用。

1,基本插件格式

实现私有作用域,最好的办法就是使用闭包。可以把插件当做一个函数,插件内部的变量及函数的私有变量,为了在调用插件后依旧能使用其功能,闭包的作用就是延长函数(插件)内部变量的生命周期,使得插件函数可以重复调用,而不影响用户自身作用域。

故需将插件的所有功能写在一个立即执行函数中:

(function(window, factory, plug) {
    factory(jQuery, plug)
})(this, function(jQuery, plug) {
   ...
}, "dataResult");

2,插件默认参数

插件的主要功能可以总结至几个关键参数,通过这几个关键参数即可修改插件的主要功能,也是第三步API设置的关键参数。

将默认参数放置在全局函数的最前面,参数变量名为options,通过对象字面量进行赋值:

var options = {
key1: para1,
key2: para2,
key3: para3,
...
keyn: paran
}

//插件默认
    var define = {
        initEvent: "input",
        plugName: "dir"
    };
    //数据校验
    var _RULES_ = {
        "regexp": function(data) {
            return new RegExp(data).test(this.val());
        },
        "required": function(data) {
            return this.val();
        },
        "min-length": function(data) {
            return this.val().length > data;
        },
        "confirm": function() {
            var passElement = $(":password")[0];
            if (passElement.value == "" || this.val() == passElement.value) {
                return false;
            } else {
                return true;
            }
        }
    }

3,插件API、参数设置

因为API指向的是使用者,故需要在用户调用插件时将API暴露给用户,因用户API时是通过插件提供的名字进行使用,故将API设置为Object类型,用户就可以通过调用API的key进行使用,

$.fn[plug] = function(options) {
        if (!this.is('form')) { return }
        this.find = this.find('input');
        $.extend(this, define, options);
        this.find.on(this.initEvent, function() {
            var _this = $(this);
                _this.siblings('p').remove();
            $.each(_RULES_, function(key, fn) {
                var $fileName = _this.data(define.plugName + "-" + key);
                var $message = _this.data(define.plugName + "-" + key + "-message");
                
                if ($fileName) {
                    var result = fn.call(_this, $fileName);
                    if (!result) {
                        _this.after("

" + $message + "

") } } }) }) }

4,html前台配置调用

html部分

            

js部分

$('form').dataResult();

5,拓展

js插件部分

$.fn[plug].extendResult = function(options) {
            $.extend(_RULES_, options);
        } //jQuery.prototype.dataResult

js调用部分

$.fn.dataResult.extendResult({
        "max-length":function(data){
            console.log(data)
            return this.val().length <= data;
        }
    })

源码使用

html





    
    
    
    
    
    



    

js 插件部分

(function(window, factory, plug) {
    factory(jQuery, plug)
})(this, function(jQuery, plug) {
    //插件默认
    var define = {
        initEvent: "input",
        plugName: "dir"
    };
    //数据校验
    var _RULES_ = {
        "regexp": function(data) {
            return new RegExp(data).test(this.val());
        },
        "required": function(data) {
            return this.val();
        },
        "min-length": function(data) {
            return this.val().length > data;
        },
        "confirm": function() {
            var passElement = $(":password")[0];
            if (passElement.value == "" || this.val() == passElement.value) {
                return false;
            } else {
                return true;
            }
        }
    }
    $.fn[plug] = function(options) {
        if (!this.is('form')) { return }
        this.find = this.find('input');
        $.extend(this, define, options);
        this.find.on(this.initEvent, function() {
            var _this = $(this);
                _this.siblings('p').remove();
            $.each(_RULES_, function(key, fn) {
                var $fileName = _this.data(define.plugName + "-" + key);
                var $message = _this.data(define.plugName + "-" + key + "-message");
                
                if ($fileName) {
                    var result = fn.call(_this, $fileName);
                    if (!result) {
                        _this.after("

" + $message + "

") } } }) }) } $.fn[plug].extendResult = function(options) { $.extend(_RULES_, options); } //jQuery.prototype.dataResult }, "dataResult");

你可能感兴趣的:(JavaScript插件编写指南form验证)