原生与组件

  框架用的越多越觉得繁琐,是没有理解代码还是需求更新的太快?谁知道呢,写一个form感叹下

原生form

        <form action="next.html" method="get">
            <input type="text" name="name" value="" />
            <input type="text" name="pass" value="" />
            <input type="submit" value=""/>
        </form>

不知道还有没有人使用这种代码,他用起来很简单,不用js,是的,那个时候也没什么js,只要你点击submit按钮,就会自动跳转到下一个页面,很棒很酷,传递的参数也是最为标准的

复杂对象-->数据结构的改变

数据量的提升(我是说一个页面中的form的属性),严格来说这不是问题,form属性不管变得多多,都可以在后台接受,转换并处理,问题就在于后台希望前端传过去的数据是一种直接区分好的方式,比如

        <form action="next.html" method="get">
            基础信息
            <input type="text" name="user.name" value="" />
            权限信息
            <input type="text" name="role.name" value="" />
            地址信息
            <input type="text" name="address.name" value="" />
            <input type="submit" value=""/>
        </form>

后端在处理时会根据.来将数据处理成不同的model,以方便后台的调用,复杂对象中,数组传递的格式绝逼是千奇百怪我见过温顺点的,重名变数组(需要对接受数据进行判断),也见过暴躁点的,数据必须[],里面填写index,当然更著名的方式就是json

既然传递json格式form的写法就变得复杂,必须搭配动态收集数据的方式(而非原生),比如js/jquery,jq中的$("form").serialize()可以很好的将表单序列化,但是并没有转换为json,我也是在这个地方写了我第一个jq方法,serializeJSON/serializeObject,偶尔会换着名字玩,这个方法我会不断的变更,不同的程序猿的数组的理解不一样,可能会要求在json中的其他数组使用,.|甚至@@@来分割数组的

复杂需求-->action的无奈

表单验证+无刷新

无刷新的请求流行之后,action的实现基本被淘汰,至此这个属性已经可以被遗忘(我用这个属性好多年,通过他修改url,好方便的,偶尔也会用action='',配合路由用来刷新页面),至于表单验证,当年也是找了好久验证的组件...

至此一个form可能会长成这样

        <form id="form">

            <input id="user" type="text" name="user" value="" />

            <input id="name" type="text" name="pass" value="" />

            <input id="submit" type="button" value="" />
        </form>
        <script type="text/javascript">
            $("#user").validation({
                //    ...
            })
             $("#name").validation({
                //    ...
            })
             $("#submit").on("click", function() {
                var formdata = $("#form").serializeJSON();
                $.post("login.do", formdata).done(function() {
                    //...
                })
            })
        </script>

如果你做过,你会发现这就是我们的工作,很难维护,也很恶心...

再往下走就是两条道了

js整合-->ext

form中的组件过于分散,觉得不好维护,不好找,对吧,很简单,写一个$.form,由$.form去创建里面的input,这样所有相关组件都在form当中

        <form id="form"></form>
        <script type="text/javascript">
            $("#form").form({
                items: [{
                    label: "",
                    type: "input",
                    name: "name"
                    validation: ""
                }, {
                    label: "",
                    type: "input",
                    name: "user"
                    validation: ""
                }],
                buttons: [{
                    icons: 1,
                    onCilck: function() {
                        var formdata = $("#form").serializeJSON();
                        $.post("login.do", formdata).done(function() {
                            //...
                        })
                    }
                }]
            })
        </script>

至此,html就是为了创建form而生,其他全是js,其实仔细想想,html中的form好像也没用存在的必要了,比如

        <form id="form"></form>
        <script type="text/javascript">
            create("form")({
                render:"#form",
                items: [{
                    label: "",
                    type: "input",
                    name: "name"
                    validation: ""
                }, {
                    label: "",
                    type: "input",
                    name: "user"
                    validation: ""
                }],
                buttons: [{
                    icons: 1,
                    onCilck: function() {
                        var formdata = $("#form").serializeJSON();
                        $.post("login.do", formdata).done(function() {
                            //...
                        })
                    }
                }]
            })
        </script>

将render改成window,在运行到render时,直接在window中创建form,所有功能全由js生成。。。

特点是简单,至少识别起来很简单,唯一的问题就是太长了,一行能解决的事情,写个5,6行,如果你喜欢这种风格或者你们公司计算代码量,可以尝试一下

html增强-->mv*

如果你怀念当年有爱的原生form,可以尝试着修改html解析引擎,或者在html中定义自己的属性,做完之后大概是这样的

        <form id="form">

            <input id="user" validation="" type="text" name="user" value="" />

            <input id="name"  validation="" type="text" name="pass" value="" />

            <input id="submit" type="button" value="" />
        </form>
        <script type="text/javascript">
        
             $("#submit").on("click", function() {
                var formdata = $("#form").serializeJSON();
                $.post("login.do", formdata).done(function() {
                    //...
                })
            })
             
             $("[validation]").each(function(){
                 $(this).validation({
                     //...
                 })
             })
        </script>

submit不太好弄,他有一个回调,而这个回调并非原生的,我们很难定位(因为分散),统一起来就舒服多了,比如这样

        <form id="form" ajax="url">
            <input id="user" validation="" type="text" name="user" value="" />

            <input id="name"  validation="" type="text" name="pass" value="" />

            <input id="submit" type="submit" aftersubmit:"aftersubmit" value="" />
        </form>
        <script type="text/javascript">
             $.cy={
                 aftersubmit:function(){
                     //...原来的done
                 }
                 
             }
             
             //----------------------变成<script src="" type="text/javascript" charset="utf-8">
             $("[validation]").each(function(){
                 $(this).validation({
                     //...
                 })
             })
             
             $("form[ajax]").each(function(){
                 var submit=$(this).find("[type=submit]"),url=$(this).attr("ajax"),
                 formdata=$(this).serializeJSON(),fnName=submit.attr("aftersubmit");
                 var fn= $.cy[fnName];
                 submit.on("click",function(){
                     $.ajax(url,formdata).done(fn)
                 })
                 
             })
        </script>

简单来说定义一个作用域,而所解析的所有html都会从此作用域中获取数据,

污染html是必须的,html的属性会爆炸式的增长,像原生的一样使用,很适合有初恋情怀的你

原文地址:https://www.cnblogs.com/liuCy/p/4620524.html