为啥bootstrap要放弃jQuery,jQuery不适合现代的web开发了吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥bootstrap要放弃jQuery,jQuery不适合现代的web开发了吗相关的知识,希望对你有一定的参考价值。

jQuery的成就

jQuery是一个伟大的库,

它解决了dom api兼容的问题,使得dom操作更简便
它支持类似css选择器的方式来选择组件
支持批量的操作数组中的元素,也叫隐式迭代
支持链式操作,可以在一条语句中完成很复杂的逻辑
有易于使用的插件扩展机制
deffered的异步方案比promise更早。
等等。

jquery可以说在dom操作领域做的很棒了,几乎统治了一个时代,甚至影响了w3c,dom api中的querySelector就有jq的影子。

但是,如今使用jq的公司越来越少了,但这并不是说在dom操作领域有更好地库,而是因为mvvm的出现。

mvvm的出现

dom操作是业务无关的逻辑,不应该出现在业务的代码中,虽然使用jq简化了很多,但是代码依然是难以维护和复用的,直到mvvm的出现,把数据和视图的绑定变成了自动化的操作,进而把dom操作从业务代码中移除。业务代码因此变得更加的纯粹,也更容易复用。

技术的发展规律

其实,技术的发展趋势就是追求更高的复用性,更简便的业务代码写法,所以最终都会要求跨平台、都会彻底分离非业务逻辑。

jvm上的语言持续的火了10多年,java长期霸占语言排行榜榜首,很大的原因就是因为jvm的跨平台,这是技术发展的趋势,就像node的libuv平台层、react的vdom、游戏引擎的多端打包等一样,随着各种端和平台越来越多,跨平台几乎是对一个新技术基本的要求。

业务代码应该是纯粹的,任何业务代码都应该独立出去作为可复用资源而存在。比如dom操作的代码很多时候是业务无关的,所以mvvm实现了自动的绑定之后,逐渐的成为主流,jquery不符合这个趋势,所以也逐渐走向没落。

jQuery的没落

jQuery在dom操作领域已经做得很好了,但是它不符合技术发展的一般规律,所以最终肯定是会被取代q的,就像大润发战胜了所有的对手,却在互联网时代被阿里收购一样。只是因为它做事情的方式不是最佳的,对开发效率和代码复用性的追求最终导致了jquery的淘汰。

从jquery帝国一统,到如今mvvm诸雄割据,对效率和代码复用性的要求对技术做出了选择,顺应这个趋势的技术才能长盛不衰。

jQuery战胜了dom操作领域的所有对手,只是输给了时代。
参考技术A 现在项目采用的技术都是前后端分离模式。jquery虽然可以做到,但是总是会操作DOM,这对现在的项目很不友好。

Bootstrap 与 Jquery validate 结合使用——多个规则实现

进行开发的时候,遇到了需要有多个规则来校验,如新用户过来一套校验规则,老用户过来又是一套规则,这时候就要需要定义多套校验规则。

首先要熟悉Bootstrap和Jquery validate的使用,详情请参考Bootstrap 与 Jquery validate 结合使用——简单实现

然后开始进入正题。

基本的东西不变,只需要给form表单绑定不同的规则,自己定义几套规则即可。

(本人亲自尝试了多种方法,发现Jquery validate的校验规则只能在$(function(){})即网页加载完毕后才能绑定校验规则,不能动态的去更改绑定。即通过一个触发事件重新绑定新的校验规则)

给每个form表单绑定校验规则,根据业务显示对应的form表单即可

/* 表单数据校验 start */
    //设置默认值
    $.validator.setDefaults({
        errorElement : \'span\',
        errorClass : \'help-block\',
        debug: false, //调试模式取消submit的默认提交功能   
        focusInvalid: false, //当为false时,验证无效时,没有焦点响应 
        submitHandler: function(form){//表单提交句柄,为一回调函数,带一个参数:form 
            var datas = stitchParameter();
            if(paycount == 90){
                $(form).ajaxSubmit({
                    type : "POST",
                    dataType : "json",
                    async : false,
                    data : {"encrypt" : SecUtil.encrypt(datas,_keyPair)},
                    url : HOSTPATH+"/pay/unionPay",
                    success:function( jsondata ){
                        if( jsondata.meta.code == \'S002\' ){
                            //数据处理
                            $(".tab-pane").removeClass("in").removeClass("active");
                            $("#pay-successful").addClass("in").addClass("active");
                        }else{
                            alert(jsondata.meta.message);
                            //数据处理
                            $(".tab-pane").removeClass("in").removeClass("active");
                            $("#pay-failure").addClass("in").addClass("active");
                        }
                    }
                });
                //开始计时
                var paytimer = setInterval(function(){
                    paycount--;
                    if(paycount == 0){
                        clearInterval(paytimer);
                        paycount = 90;
                    }else{
                        if(payflag==1){
                            clearInterval(paytimer);
                        }
                    }
                },1000);
            }else{
                
            }
        },   

          //自定义错误消息放到哪里
        errorPlacement : function(error, element) {
            //区分普通输入框和输入框组,如果直接用element.next().remove();会错误删除标签(即输入框组的<span class="input-group-addon"></span>)
            element.nextUntil(".input-group-addon").remove();
            //element.next().remove();//删除显示图标
            element.after(\'<span class="glyphicon glyphicon-remove form-control-feedback" aria-hidden="true"></span>\');
            element.closest(\'.form-group\').append(error);//显示错误消息提示
        },
        //给未通过验证的元素进行处理
        highlight : function(element) {
            $(element).closest(\'.form-group\').addClass(\'has-error has-feedback\');
        },
        //验证通过的处理
        success : function(label) {
            var el=label.closest(\'.form-group\').find("input");
              //区分普通输入框和输入框组,如果直接用el.next().remove();会错误删除标签(即输入框组的<span class="input-group-addon"></span>)
            el.nextUntil(".input-group-addon").remove();
            //el.next().remove();//删除显示图标
            el.after(\'<span class="glyphicon glyphicon-ok form-control-feedback" aria-hidden="true"></span>\');
            label.closest(\'.form-group\').removeClass(\'has-error\').addClass("has-feedback has-success");
            label.remove();
        },
    });
    //新数据校验规则
    var newRules={
        rules:{
            new_name:{
                required : true,
                minlength : 2
            },
            new_idCard:{
                required : true,
                isIdCardNo : true
                
            },
            new_phone:{
                required : true,
                mobile : true
            },
            new_cardNo:{
                required : true,
                FixedLength : 16
            },
            new_cvn:{
                required : true,
                FixedLength : 3,
                
            },
            new_verifyCode:{
                required : true,
                FixedLength : 4,
                checkVerifyCode : true
            },
            new_expDate:{
                required:true,
                date : true
            }   
        },
        messages:{
            new_name:{
                required : "请输入姓名",
                minlength : "请输入正确的姓名"
            },
            new_idCard:{
                required : "请输入身份证号"
            },
            new_phone:{
                required : "请输入手机号码"
            },
            new_cardNo:{
                required :"请输入银行信用卡",
                FixedLength : "请输入正确的银行信用卡"
            },
            new_cvn:{
                required : "请输入CVN",
                FixedLength : "请输入3位的CVN"
            },
            new_verifyCode:{
                required : "请输入验证码",
                FixedLength : "请输入有效的验证码",
            },
            new_expDate:{
                required : "请输入有效日期"
            }
        },    
    };
    //旧数据校验规则
    var oldRules={
        rules:{
            old_cvn:{
                required : true,
                FixedLength : 3,
                
            },
            old_verifyCode:{
                required : true,
                FixedLength : 4,
                checkVerifyCode : true
            }
        },
        messages:{
            old_cvn:{
                required : "请输入CVN",
                FixedLength : "请输入3位的CVN"
            },
            old_verifyCode:{
                required : "请输入验证码",
                FixedLength : "请输入有效的验证码",
            }
        },    
    };
    //生成校验规则
    var validate_new = jQuery.extend({}, $.validator.defaults, newRules);
    var validate_old = jQuery.extend({}, $.validator.defaults, oldRules);
    //表单绑定校验#userPay-old
    $("#userPay-new").validate(validate_new);
    $("#userPay-old").validate(validate_old);
    /* 表单数据校验 end */

对应的页面文件

<!-- 新数据表单 -->
<form id="userPay-new">
    <table>
        <tr>
            <td>
                <div class="form-group">
                    <label for="dtp_input3" class="label-title control-label">姓名:</label>
                    <div class="input-group input-div">
                        <input id="new_name" name="new_name" class="form-control readonly-input" size="16" type="text" value="">
                    </div>
                </div>
            </td>
            <td class="float-td">
                <div class="form-group">
                    <label for="dtp_input3" class="label-title control-label">身份证:</label>
                    <div class="input-group input-div">
                        <input id="new_idCard" name="new_idCard" class="form-control readonly-input" size="16" type="text" value="">
                    </div>
                </div>
            </td>
        </tr>
        <tr>
            <td>
                <div class="form-group">
                    <label for="dtp_input3" class="label-title control-label">手机:</label>
                    <div class="input-group input-div">
                        <input id="new_phone" name="new_phone" class="form-control readonly-input" size="16" type="text" value="">
                    </div>
                </div>
            </td>
        </tr>
        <tr>
            <td>
                <div class="form-group bank-card-div">
                    <label for="dtp_input3" class="label-title control-label">银行卡:</label>
                    <div class="input-group date input-div">
                        <span class="caret"></span>
                        <input id="new_cardNo" name="new_cardNo" class="form-control dropdown-toggle" data-toggle="dropdown" size="16" type="text" value=""/>
                        <!-- <span class="input-group-addon" data-toggle="dropdown">
                            <span class="glyphicon     glyphicon glyphicon-arrow-down"></span>
                        </span> -->
                         <span class="input-group-addon addCard">
                            <span class="glyphicon glyphicon glyphicon-plus"></span>
                        </span>
                        <ul class="userCards dropdown-menu">
                            <!-- <li role="presentation"><span>信用卡(7757)</span><a href="#">删除</a></li>
                            <li role="presentation" class="divider"></li>
                            <li role="presentation"><span onclick="javascript: selectCard(this);">信用卡(7757)</span><a href="#" onclick= "return ">删除</a></li>
                            <li role="presentation" class="divider"></li>
                            <li role="presentation"><span onclick="javascript: selectCard(this);">信用卡(7757)</span><a href="#" onclick= "return ">删除</a></li>
                            <li role="presentation" class="divider"></li>
                            <li role="presentation"><span onclick="javascript: selectCard(this);">信用卡(7757)</span><a href="#" onclick= "return ">删除</a></li> -->
                        </ul>
                    </div>
                </div>
            </td>
            <td class="float-td">
                <div class="form-group">
                    <label for="dtp_input3" class="label-title control-label">CVN:</label>
                    <div class="input-group input-div">
                        <input id="new_cvn" name="new_cvn" class="form-control" size="3" type="text" value="">
                    </div>
                </div>
            </td>
        </tr>
        <tr>
            <td>
                <div class="form-group verify-code-div">
                    <label for="dtp_input3" class="label-title control-label">验证码:</label>
                    <div class="input-group input-div">
                        <input id="new_verifyCode" name="new_verifyCode" class="form-control" data-toggle="dropdown" size="16" type="text" value="">
                        <span class="input-group-addon verify-code-span"><a class="btn btn-primary verify-code-a">获取验证码</a></span>
                    </div>
                </div>
            </td>
            <td class="float-td">
                <div class="form-group exp-date-div">
                    <label for="dtp_input2" class="label-title control-label">有效期:</label>
                    <div class="datepicker input-group date form_date input-div">
                        <input id="new_expDate" name="new_expDate" class="form-control" data-toggle="dropdown" size="16" type="text" value="" readonly>
                        <span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span></span>
                    </div>
                </div>
            </td>
        </tr>
    </table>
    <input id="submit-btn-inner" class="btn btn-primary submit-button" data-loading-text="正在提交" type="submit" value="确认支付"/>
</form>
<!-- 旧数据表单 -->
<form id="userPay-old" style="display: none;">
    <table>
        <tr>
            <td>
                <div class="form-group">
                    <label for="dtp_input3" class="label-title control-label">姓名:</label>
                    <div class="input-group input-div">
                        <input id="old_name" name="old_name" class="form-control readonly-input" size="16" type="text" value="">
                    </div>
                </div>
            </td>
            <td class="float-td">
                <div class="form-group">
                    <label for="dtp_input3" class="label-title control-label">身份证:</label>
                    <div class="input-group input-div">
                        <input id="old_idCard" name="old_idCard" class="form-control readonly-input" size="16" type="text" value="">
                    </div>
                </div>
            </td>
        </tr>
        <tr>
            <td>
                <div class="form-group">
                    <label for="dtp_input3" class="label-title control-label">手机:</label>
                    <div class="input-group input-div">
                        <input id="old_phone" name="old_phone" class="form-control readonly-input" size="16" type="text" value="">
                    </div>
                </div>
            </td>
        </tr>
        <tr>
            <td>
                <div class="form-group bank-card-div">
                    <label for="dtp_input3" class="label-title control-label">银行卡:</label>
                    <div class="input-group date input-div">
                        <span class="caret"></span>
                        <input id="old_cardNo" name="old_cardNo" class="form-control dropdown-toggle readonly-input" data-toggle="dropdown" size="16" type="text" value="" readonly/>
                       <!--  <span class="input-group-addon" data-toggle="dropdown">
                            <span class="glyphicon     glyphicon glyphicon-arrow-down"></span>
                        </span> -->
                         <span class="input-group-addon addCard">
                            <span class="glyphicon glyphicon glyphicon-plus"></span>
                        </span>
                        <ul class="userCards dropdown-menu" aria-labelledby="old_cardNo">
                            <!-- <li role="presentation"><span>信用卡(7757)</span><a href="#">删除</a></li>
                            <li role="presentation" class="divider"></li>
                            <li role="presentation"><span onclick="javascript: selectCard(this);">信用卡(7757)</span><a href="#" onclick= "return ">删除</a></li>
                            <li role="presentation" class="divider"></li>
                            <li role="presentation"><span onclick="javascript: selectCard(this);">信用卡(7757)</span><a href="#" onclick= "return ">删除</a></li>
                            <li role="presentation" class="divider"></li>
                            <li role="presentation"><span onclick="javascript: selectCard(this);">信用卡(7757)</span><a href="#" onclick= "return ">删除</a></li> -->
                        </ul>
                    </div>
                </div>
            </td>
            <td class="float-td">
                <div class="form-group">
                    <label for="dtp_input3" class="label-title control-label">CVN:</label>
                    <div class="input-group input-div">
                        <input id="old_cvn" name="old_cvn" class="form-control" size="3" type="text" value="">
                    </div>
                </div>
            </td>
        </tr>
        <tr>
            <td>
                <div class="form-group verify-code-div">
                    <label for="dtp_input3" class="label-title control-label">验证码:</label>
                    <div class="input-group input-div">
                        <input id="old_verifyCode" name="old_verifyCode" class="form-control" data-toggle="dropdown" size="16" type="text" value="">
                        <span class="input-group-addon verify-code-span"><a class="btn btn-primary verify-code-a">获取验证码</a></span>
                    </div>
                </div>
            </td>
            <td class="float-td">
                <div class="form-group exp-date-div">
                    <label for="dtp_input2" class="label-title control-label">有效期:</label>
                    <div class="datepicker input-group date form_date input-div">
                        <input id="old_expDate" name="old_expDate" class="form-control readonly-input" data-toggle="dropdown" size="16" type="text" value="" >
                        <span class="input-group-addon"><span class="glyphicon glyphicon-calendar"></span></span>
                    </div>
                </div>
            </td>
        </tr>
    </table>
    <input id="submit-btn-inner" class="btn btn-primary submit-button" data-loading-text="正在提交" type="submit" value="确认支付"/>
</form>

结果可行。

如有更加好的方法,请留言。本来小菜一枚,如有不足之处,请多多指教!

以上是关于为啥bootstrap要放弃jQuery,jQuery不适合现代的web开发了吗的主要内容,如果未能解决你的问题,请参考以下文章

Bootstrap 与 Jquery validate 结合使用——多个规则实现

惊闻放弃jQuery,拥抱Bootstrap,FineUI新版效果超炫!

请问Bootstrap中的bootstrap.min.js下载到本地为啥不能用?

taginput ,complete使用笔记

初识JQuery

jQuery制作进度条