zoukankan      html  css  js  c++  java
  • 原生与组件

      框架用的越多越觉得繁琐,是没有理解代码还是需求更新的太快?谁知道呢,写一个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的属性会爆炸式的增长,像原生的一样使用,很适合有初恋情怀的你

  • 相关阅读:
    Java SE(2)
    Java SE(1)
    第二次作业
    Markdown 进阶
    关于主题
    Markdown入门指南
    网络游戏架构与微服务架构简单对比
    微服务框架的存储架构
    轻量级微服务框架的通信架构
    页面静态化
  • 原文地址:https://www.cnblogs.com/liuCy/p/4620524.html
Copyright © 2011-2022 走看看