对于JQuery的学习,已经有3年多的时间了,直到去年与我的组长一起做项目,看到他写的JS,确实特别漂亮,有时甚至还看不太懂,

我才发现其实我不太会JQuery。所以我有时间就会去看看他写的JS代码,直到今天我都会很怀恋那段在清大的日子,是我人生思想道路上的一次艳遇。

我到现在都一直喜欢去看一些牛人的js文章,譬如像 (叶小钗,司徒正美,tom大叔)等人的文章都是很不错的。

上面的话说多了,来看看我如何输写JS代码,模块化的思路整理,大概有下面的几种情况:

第一种:教你如何在项目中编写一个可以通用的弹框,废除掉 alert("shit")

var alertBox = function (option) {
//扩展区域
var options = {
w: '',
title: '提示:',
msg: '',
msgExt: '',
MsgArr: [],
yes_btn: "确定",
no_btn: "取消",
yesBool: true,
noBool: true,
ok_Fun: null,
backgroundColor: '#DC0100',
AutoFun: null //----自执行函数----
}
//---继承合并,形成组合的options参数----
option = $.extend({}, options, option || {});
//--随机生成一个ID--
var obj_msgprint = "msgprint_" + parseInt(Math.random() * );
//--确定--
option.yes_btn = option.yesBool ? "<a id='a_activateYes' style= background-color:" + option.backgroundColor + " href='javascript:;'>" + option.yes_btn + '</a>' : "";
//--取消--
option.no_btn = option.noBool ? '<a id="a_activateNo" class="cancel" href="javascript:;">' + option.no_btn + '</a>' : "";
if (option.noBool) {
noBtn = "";
} var allMsgArr = [];
if (option.MsgArr.length > ) {
for (var item in option.MsgArr) {
allMsgArr.push("<p class='big'>" + option.MsgArr[item] + "</p>");
};
}
if (option.msg != '') {
allMsgArr.push("<p class='big'>" + option.msg + "</p>");
}
if (option.msgExt != '') {
allMsgArr.push("<p style='text-align:center;'>" + option.msgExt + "</p>");
} var boxContentArr = ["<div id='" + obj_msgprint + "' class='albox' style='position:absolute;z-index:1002;display:block;width:" + option.w + "'>
<div class='headbox' style='background-color: " + option.backgroundColor + "'>", "<p>" + option.title + "</p>", "</div>
<div class='conbox' style='border-color: " + option.backgroundColor + "'><div class='txt'>" + allMsgArr.join('') + "</div>
<div class='btnbox'>", option.yes_btn, option.no_btn, "</div></div></div>"]; $("body").append(boxContentArr.join(''));
$("#a_activateNo,#a_closeActivate,#a_activateYes").click(function () {
$("#" + obj_msgprint).hide();
mask.hide();
$("#" + obj_msgprint).remove();
mask.remove();
if (option.ok_Fun && (typeof (option.ok_Fun) === 'function') && $(this).is("#a_activateYes")) {
option.ok_Fun.apply();
}
});
//按下回车键
$(document).keypress(function (e) {
var ev = e || event;
if (ev.keyCode == ) {
$("#a_activateYes").trigger("click");
}
});
//***************创建遮罩效果*****************/
var mask = $("<div id=\"maskOfDiv\"></div>"); //--Div遮罩----
$("body").append(mask);
var sh = document.documentElement.scrollHeight,
ch = document.documentElement.clientHeight,
height = sh > ch ? sh : ch;
mask.css({
"position": "absolute",
"top": "",
"right": "",
"bottom": "",
"left": "",
"z-index": "",
"background-color": "#000000",
"display": "none",
"height": height
});
mask.show().css("opacity", "0.3");
$("#" + obj_msgprint).show();
//***************创建遮罩效果******************/
//-------居中提示类型---------
var dom_obj = document.getElementById(obj_msgprint);
dom_obj.style.top = ((document.documentElement.clientHeight - $("#" + obj_msgprint).height()) / ) + "px";
dom_obj.style.left = (document.documentElement.scrollLeft + (document.documentElement.clientWidth - $("#" + obj_msgprint).width()) / ) + "px";
//------自动执行函数--------
if (option.AutoFun && (typeof (option.AutoFun) === 'function')) {
option.AutoFun.apply();
}
}
window.alertBox = alertBox;

调用插件:

<script type="text/javascript">
alertBox({ msg: "干掉alert,你看行不行!", yes_btn: "alertBox"});
</script>

大家可以重点去学习,$.extend():

               //---继承合并,形成组合的options参数----

option = $.extend({}, options, option || {});

截图效果:

              

==========================================================

第二种: 教你如何用js的 prototype 原型链模式,做一个通用的验证插件。

var FormValidateCommon = function (containerObj, tipContainerFlag) {
this.valObj = containerObj; //验证对象
this.tipContainerBool = tipContainerFlag || false; //插入的位置标示 {true:本身,false:最后一个td}
this.validatorArr = {}; // 验证对象容器 //********************************************
//---------现有可提供的枚举验证类型-------//
//********************************************
this.regexEnum = {
idCard: /^[-]([-]{}|[-]{})([-]|X)$/, //身份证
num: /^\-?([-]\d*)$/, //数字
email: /^([-9A-Za-z\-_\.]+)@([-9a-z]+\.[a-z]{,}(\.[a-z]{})?)$/, //邮箱
phone: /^[|||]\d{}$/, //电话
chinese: /^[\u0391-\uFFE5]{,}$/, //2-6位中文
password: /^[a-zA-Z0-9_]{,}$/, //6-16位密码验证
passwordBase: /^[a-zA-Z0-9_]*$/
} };
//=============扩展的原型方法============
FormValidateCommon.prototype =
{
init: function () {
var scope = this;
$(scope.valObj).find('.Validate').each(function () { //循环验证
var el = $(this);
scope.initItem(el);
})
},
initItem: function (el) {
if (typeof el == 'string') el = $("#" + el);
var scope = this; //FormValidateCommon的作用域
var cfg = el.attr('data-val'); //若是未开启验证便退出该项初始化
if (cfg.check && cfg.check == false) {
return false;
} if (cfg && cfg.length > ) {
cfg = eval('(' + cfg + ')'); //转成对象 var check = cfg.check || true,
id = el.attr('id') || Math.random(),
initMsg = cfg.initMsg || '请填入信息',
sucMsg = cfg.sucMsg || '格式正确',
errorMsg = cfg.errorMsg || '请注意格式',
requred = cfg.requred || false;
cfg.id = id;
cfg.check = check;
cfg.initMsg = initMsg; //默认信息
cfg.sucMsg = sucMsg; //验证成功信息
cfg.errorMsg = errorMsg; //验证错误信息
cfg.requred = requred;
var tips = $("<span class='xx_czmsg'><img src='http://static.eee114.com/new_parents/images/xx_tmulspan.gif'>" + initMsg + "</span>"); if (scope.tipContainerBool) { //插入到最后一个td
$("#" + id).parent().parent().find("td:last").html(tips);
}
else { //插入到元素之间
tips.insertAfter(el);
}
cfg.el = el;
cfg.tipEl = tips; //该表单的验证
cfg.validate = function () {
scope.funcValidate(cfg);
}; //文本框验证
el.blur(function () {
scope.funcValidate(cfg);
}); //下拉框验证
if ($("#" + id).is("select")) {
el.change(function () {
scope.funcValidate(cfg);
});
}
scope.validatorArr[id] = cfg; //生成相关验证对象
}
},
funcValidate: function (cfg) {
var id = cfg.id;
var el = cfg.el;
var check = cfg.check; //判断是否开启验证
var _this = this; //取消事件不执行逻辑
if (!this.validatorArr[id])
return false; //若是没有开启验证便忽略
if (!check) {
alert("验证");
this.validatorArr[id]['state'] = 'ignore';
return false;
}
var type = cfg.type;
var regexObj = cfg.regexObj; //用户扩张的验证
var ajaxObj = cfg.ajaxObj; //ajax扩张的验证
var compareObj = cfg.compareObj; //对比验证
var msg = '';
var isPass = ; //{0:初始化提示,1:成功,-1:错误,2:必填} //--【1】----首先验证非空-------------------------
if (cfg.requred) {
if (el.val() == '' || el.val() == '' || el.val() == null) {
isPass = ; //必须项
//msg=cfg.initMstg;
} else {
msg = cfg.sucMsg;
}
}
//--【2】-----type优先,预定于的正则验证---------
if (isPass == && el.val().length > && typeof type == 'string') {
var reg = this.regexEnum[type]; if (reg.test(el.val())) {
msg = cfg.sucMsg;
} else {
isPass = -;
msg = cfg.errorMsg;
}
}
//--【3】------自身扩展的正则验证---------------
if (isPass == && el.val().length > && regexObj) {
var reg = regexObj; if (reg.test(el.val())) {
msg = cfg.sucMsg;
} else {
isPass = -;
msg = cfg.errorMsg;
}
}
//--【4】-------验证比较字符串--------------------------
if (isPass == && el.val().length > && compareObj) {
var compareArr = compareObj.split('|');
if (compareArr.length == ) {
var _type = compareArr[]
var _id = compareArr[];
var _flag = compareArr[];
var _v = el.val();
var _cv = $('#' + _id).val();
if (_type == 'num') {
_v = parseInt(_v);
_cv = parseInt(_cv);
} if (_flag == '=') {
if (_v == _cv) {
msg = cfg.sucMsg;
} else {
isPass = -;
msg = '两次密码输入不一致';
}
}
}
}
//--【5】------------ajax验证-----------------------------
if (isPass == && el.val().length > && ajaxObj) {
var ajaxArr = ajaxObj.split('|');
if (ajaxArr.length >= ) {
var url = ajaxArr[];
var _param = {};
_param[ajaxArr[]] = el.val(); //文本框参数
//--------------扩展参数---------------------------
for (var i = ; i < ajaxArr.length; i++) {
var arrObjParam = ajaxArr[i].split('=');
_param[arrObjParam[]] = arrObjParam[];
} $.post(url, _param, function (data) {
if (typeof data == 'string') {
fata = eval('(' + data + ')');
}
if (data.code) {
msg = data.msg || cfg.sucMsg;
} else {
isPass = -;
msg = data.msg;
}
ShowResult(_this, isPass);
});
return false; //在此中断后操作
}
} ShowResult(_this, isPass); //----------显示消息----------------
function ShowResult(scope, isPass) {
if (msg == '') isPass = ;
switch (isPass) {
case : //默认 scope.validatorArr[id]['state'] = 'tip';
scope.validatorArr[id]['tipEl'].html('<img src=http://static.eee114.com/new_parents/images/xx_tmulspan.gif>' + cfg.initMsg);
break;
case : //成功
scope.validatorArr[id]['state'] = 'success';
scope.validatorArr[id]['tipEl'].html('<img src=http://static.eee114.com/new_parents/images/xx_right.gif>' + msg);
break;
case -: //验证有误
scope.validatorArr[id]['state'] = 'error';
scope.validatorArr[id]['tipEl'].html('<img src=http://static.eee114.com/new_parents/images/xx_no.gif>' + msg);
break;
case : //必填验证有误
scope.validatorArr[id]['state'] = 'error';
scope.validatorArr[id]['tipEl'].html('<img src=http://static.eee114.com/new_parents/images/xx_tmulspan.gif>' + cfg.initMsg);
break;
default:
break;
}
}
},
validatorAll: function () {
for (var k in this.validatorArr) {
var v = this.validatorArr[k];
v.validate();
}
},
validatorState: function () {
for (var k in this.validatorArr) {
if (this.validatorArr[k].state == 'error') {
return false;
}
}
return true;
}
}

调用插件:

<form class="familyClass">
<input type="text" class="Validate" name="Phone" id="Phone" value="@Model.Phone"
data-val="{type:'phone',initMsg:'请输入您的手机号!',sucMsg:'手机号码验证成功!',errorMsg:'请输入正确的手机号!'}"/>
<form>
<script type="text/javascript">
var familyForm = new FormValidateCommon(".familyClass", false);
familyForm.init();
familyForm.validatorAll();
</script>

上面的调用实现了很灵活的自动式标签绑定验证,但是只适合一种一个项目的通用样式的提示。

大家可以重点去学习,FormValidateCommon.prototype = {} :

截图效果:

============================================

第三种:用js制作实现一个漂亮的下拉框插件:selectPlus

(function ($) {
$.fn.selectPlus = function (option) {
option = $.extend({ index: , defaultClick: true }, option);
return this.each(function () {
var _this = $(this);
var newSelect = _this.find(".seleitem");
var _itemClick = null;
newSelect.live({
click: function () {
_itemClick = $(this);
//没有数据,则无效
if ($(this).find("p>a").length <= ) {
return;
} else {
//---------------------------
if ($(this).hasClass("click")) {
closeSelect(this);
} else {
$(this).addClass("click");
$(this).find("p>a").show("fast").css("style", "display:block");
$(this).find("p>a.current").hide();
}
}
},
mouseleave: function () {
closeSelect(this);
}
}); //隐藏p,移除click样式
function closeSelect(obj) {
$(obj).find("p>a").hide("fast");
$(obj).removeClass("click");
} //给p下面的a添加点击事件
$(".seleitem p>a").live("click", function (e) {
var src = e.target;
var thisLink = $(this); if (src.tagName == "A") {
var PObj = thisLink.parent();
var a_show = PObj.siblings("a"); PObj.siblings("a").text(src.innerHTML);
PObj.siblings("a").attr("value", thisLink.attr("value")); thisLink.parents(".seleitem").removeClass("click");
thisLink.addClass("current").siblings().removeClass("current"); //----------------------
thisLink.parents(".seleitem").children("[data-name='data']").attr("value", src.innerHTML);
thisLink.parents(".seleitem").children("[data-value='data']").attr("value", thisLink.attr("value"));
closeSelect(".seleitem"); }
});
//--------自动触发一下----------------------
(function () {
if (option.defaultClick) {
_this.find(".seleitem p>a").eq(option.index).trigger("click");
_this.find(".seleitem p>a").eq(option.index).attr("style", "display:none");
}
}());
});
}
})(jQuery);

调用插件:

 <div class="order">  
<div style="width: 124px;" class="seleitem">
<input type="hidden" name="pay-name" data-name="data" value="已支付">
<input type="hidden" name="orderPayNum" data-value="data" value="">
<i id="opOption"></i>
<a id="orderPay" class="show" href="javascript:void(0);" value="">已支付</a>
<p style="width: 140px; height: 55px;">
<a value="" href="javascript:void(0)" style="display: none;" class="">全部</a>
<a value="" href="javascript:void(0)" style="display: none;">未支付</a>
<a value="" href="javascript:void(0)" style="display: none;" class="current">已支付</a>
</p>
</div>
</div>
<script type="text/javascript">
$(function () {
         //-------------插件调用-------------------------------
         $(".order").selectPlus({ index: 0 });//--支付状态,{index:为选中第一个}
     
      });
   </script>

截图效果:

======================================================================

第四种: 续 : selectPlus                               

对于上面的selectPlus我还有话要说,对于插件的思想,未必真的就很好,看了BootStrap的一些插件源代码,你会发现,它还结合了一种绑定式的思想。

对于上面提到的所有插件式写法,其实我们都可以用绑定式的思想去简化代码量。

在上面的代码中加上,加上如下代码:

(function ($) {
$.fn.selectPlus = function (option) {
//.........可以参考上面的selectPlus.......
} //----------很简单的关键代码-------------------
$(window).on('load', function () {
        //取得元素上带data-tip="on"的元素
        $('[data-select="on"]').each(function () {
            $(this).selectPlus();
        })
    })
});

调用变成了这样:

 <div class="order" data-select="on">
//..............
</div>

希望小伙伴们也都能领悟,吃饭了哦!

如果你只会JQuery的插件式开发, 那么你可以进来看看?的更多相关文章

  1. JQuery的插件式开发

    如果你只会JQuery的插件式开发, 那么你可以进来看看? 对于JQuery的学习,已经有3年多的时间了,直到去年与我的组长一起做项目,看到他写的JS,确实特别漂亮,有时甚至还看不太懂, 我才发现其实 ...

  2. MEF 插件式开发 - 小试牛刀

    原文:MEF 插件式开发 - 小试牛刀 目录 MEF 简介 实践出真知 面向接口编程 控制反转(IOC) 构建入门级 MEF 相关参考 MEF 简介 Managed Extensibility Fra ...

  3. 从零开始实现ASP.NET Core MVC的插件式开发(一) - 使用ApplicationPart动态加载控制器和视图

    标题:从零开始实现ASP.NET Core MVC的插件式开发(一) - 使用Application Part动态加载控制器和视图 作者:Lamond Lu 地址:http://www.cnblogs ...

  4. 从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板

    标题:从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11155 ...

  5. 从零开始实现ASP.NET Core MVC的插件式开发(八) - Razor视图相关问题及解决方案

    标题:从零开始实现ASP.NET Core MVC的插件式开发(八) - Razor视图相关问题及解决方案 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun ...

  6. C#学习笔记-----基于AppDomain的"插件式"开发

    很多时候,我们都想使用(开发)USB式(热插拔)的应用,例如,开发一个WinForm应用,并且这个WinForm应用能允许开发人员定制扩展插件,又例如,我们可能维护着一个WinService管理系统, ...

  7. ctkPlugin插件系统实现项目插件式开发

    插件式开发体会: 自开始写[大话QT]系列就开始接触渲染客户端的开发,说是开发不如更多的说是维护以及重构,在接手这块的东西之前自己还有点犹豫,因为之前我一直认为客户端嘛,没什么技术含量,总是想做比较有 ...

  8. 基于AppDomain的"插件式"开发

    很多时候,我们都想使用(开发)USB式(热插拔)的应用,例如,开发一个WinForm应用,并且这个WinForm应用能允许开发人员定制扩展插件,又例如,我们可能维护着一个WinService管理系统, ...

  9. 从零开始实现ASP.NET Core MVC的插件式开发(三) - 如何在运行时启用组件

    标题:从零开始实现ASP.NET Core MVC的插件式开发(三) - 如何在运行时启用组件 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/112 ...

随机推荐

  1. 1833: [ZJOI2010]count 数字计数 - BZOJ

    Description给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次.Input输入文件中仅包含一行两个整数a.b,含义如上所述.Output输出文件中包含一 ...

  2. 【BZOJ】【2194】快速傅里叶之二

    FFT c[k]=sigma a[i]*b[i-k] 这个形式不好搞…… 而我们熟悉的卷积的形式是这样的 c[k]=sigma a[i]*b[k-i]也就是[下标之和是定值] 所以我们将a数组反转一下 ...

  3. .Net 使用 Oracle 提供组件访问数据库

    向导式安装客户端组件 32位下载: http://www.oracle.com/technetwork/topics/dotnet/utilsoft-086879.html   批处理式安装客户端组件 ...

  4. iOS开发 .framework的Optional(弱引用)和Required(强引用)区别

    首先,参考文档:https://blog.stackmob.com/2013/03/objective-c-tip-of-the-month-optional-frameworks/ 强引用(Requ ...

  5. Unity3D脚本中文系列教程(九)

    Unity3D脚本中文系列教程(八) name 对象名称hideFlags 该物体是否被隐藏,保存在场景中或被用户修改继承的函数 GetInstanceID 返回该物体的实例id继承的类函数 oper ...

  6. Test a ; vs Test a( ) ;

    一. Test a();   Test a;  //前提声明了Test类 前者声明一个返回值为Test,名为a的函数,后者声明了Test类的一个对象(把Test当成int) struct Test{ ...

  7. 为什么android的R类要定义成16进制

    联想到c语言中的宏定义:我想是一个原因 如: #define SDL_INIT_TIMER 0x00000001 #define SDL_INIT_AUDIO 0x00000010 #define S ...

  8. SQLMap使用

    http://www.freebuf.com/articles/web/29942.html http://sqlmap.org/ http://blog.csdn.net/zgyulongfei/a ...

  9. POJ1004Financial Management

    这个题犯了一个小小的错误,double输出的时候用f才对,输入用lf即可.... http://poj.org/problem?id=1004 #include<stdio.h> int ...

  10. moto xt800 刷机到2.2.2

    老机器啊,原来2.1的系统大多数软件都不能装sbf刷机包+工具+教程下载地址:http://u.115.com/file/bhdlwl2x 刷完之后如果RSD Lite显示刷机结果为失败,不要担心,手 ...