form表单和模板引擎

632 阅读2分钟

一、回顾form表单知识点

1.你还记得什么是表单吗?

表单就是用来采集数据的,

标签的属性则是用于规定如何将采集到的数据发送到服务器上

2.form表单的基本属性有哪些?

action 对应的是URL地址,即我们将表单中的数据传输到哪里去

method 对应的是方式,相比看过我上一篇文章的UU们应该直到有哪些吧,没错,就是大家都老朋友:GET 和 POST,即我们以何种方式将数据提交到 action 里面去

target 对应的是在何处打开我们的URL地址

enctype 对应的是在发送表单之前我们如何对数据进行编码(暂时可以忽略)

具体表现请看如下代码:(代码中还有贴心小提示哦)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <!-- action 的默认值是当前页面的URL地址 如果想要改变地址,可以在 action 栏里面填入URL地址-->
    <!-- target 页面打开位置 默认是“ _self ”当前页面打开 “ _blank ”在一个新的页面打开-->
    <!-- method 页面打开方式 默认是“ get ”将数据直接传递给URL地址,和 action 默认时的形式差不多 “ post ”传递数据到后台,数据不会在URL地址中显示-->
    <!-- 由于这个不同点,所以 post 比 get 更加保险,私密性更强,当操作比较复杂的工作时常用 post 而不是 get -->
    <form action="/guess" target="_blank" method="post">
        <input type="text" name="email_or_mobile" />
        <input type="password" name="password" />
        <button type="submit">提交</button>
    </form>
</body>

</html>

但是表单提交数据也有不好的一点,它是同步提交的方法,使得 form 表单提交后,页面之前的状态和数据都会丢失,这对我们来说是十分不利的一点,当然,聪明的程序员总有办法解决它

3.如何解决表单同步提交带来的缺点?

之前有提到:form表单只负责采集数据,而我们的好伙伴 Ajax正好可以将数据提交到服务器上,这岂不是一举两得 QQ图片20220417205546.gif

4.监听表单的提交事件

在jQuery中有两种方法可以监听表单提交事件,具体看代码:

    <script>
        // 监听表单的提交事件
        // 方法一
        // $('#f1').submit(function () {
        //     alert(11);
        // });
        // 方法二
        $('#f1').on('submit', function () {
            alert(22);
        })
    </script>

温馨提示: 只要是有使用到 <script>标签的,如果想要看到一定的效果,一定要引入 jquery.js 文件,否则就是白做一场

5.阻止表单默认的提交行为

当监听到表单的提交事件后,调用e.preventDefault();函数,可以阻止表单的提交和页面的跳转

具体代码如下:

 <script>
        // 阻止表单默认的提交行为
        // event.preventDefault();
        // 方法一
        // $('#f1').submit(function (e) {
        //     alert(11);
        //     e.preventDefault();
        // });
        // 方法二
        $('#f1').on('submit', function (e) {
            alert(22);
            e.preventDefault();
        })
    </script>

6.快速获取表单中的全部数据

利用传统的方法一个一个输入数据实在是过于繁琐,因此,简便方法也应运而生了:

serialize() 它能够一次性获取表单中全部的数据

其语法如下: $('对象').serialize();

它输出的结果会用 & 连接起来

注意:使用 serialize() 的时候,需要用到它的元素一定要有 name 属性,否则无效

具体代码如下:

    <script>
        // 快速获取表单中的全部数据
        // 方法一
        $('#f1').submit(function (e) {
            e.preventDefault();
            var data = $(this).serialize(); // 将获取到的
            值赋值给data 
            console.log(data);
        });
        // 方法二
        // $('#f1').on('submit', function (e) {
        //     e.preventDefault();
        //     var data = $(this).serialize();
        //     console.log(data);
        // })
    </script>

到这里,我们form表单的新旧知识都已经讲完了,欸嘿,是不是以为这就结束了,nonono,新的篇章还在等着大家 QQ图片20220417211235.gif

二、模板引擎

1.什么是模板引擎?

模板引擎能够根据程序员指定的 模板结构 和 数据,自动的生成一个完整的HTML页面

2.使用模板引擎有哪些好处?

a.减少了字符串的拼接操作

b.使得代码结构更加清晰

c.使得代码更加易于阅读和维护

3.art-template模板引擎

art-template自称是简洁、超快的一个模板引擎,当然它名副其实,用过的都说好!

要使用模板引擎自然少不了要安装

4.art-template的安装步骤

a.打开浏览器,搜索art-template官网

b.找到下载链接,点击鼠标右键“另存为”即可

5.art-template的使用步骤

a.导入 art-template

b.定义数据

c.定义模板

d.调用 art-template 函数

e.渲染HTML结构

空说无意,我们代码中见:(代码虽繁琐,但是处处是心血,请大家仔细看)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 1.引入模板引擎 -->
    <!-- 在 window 全局多了一个函数叫做 template ('模板的ID',需要渲染的数据对象) -->
    <script src="lib/template-web.js"></script>
    <!-- 为了方便最后渲染HTML结构,引入 jquery.js 文件 -->
    <script src="lib/jquery.js"></script>
</head>

<body>
    <div id="container"></div>
    <!-- 3.定义模板 -->
    <!-- 注意:模板的 HTML 结构一定要定义到 script 中(手动),因为它本身有个默认的定义 type -->
    <!-- 默认 type 为: -->
    <!-- <script type="text/javascript"></script> -->
    <!-- 手动修改后 : -->
    <!-- 在 art-template 中,{{}} 表示一个占位符 -->
    
    <script type="text/html" id="tpl-user">
    <h1>{{name}}   ------   {{age}}</h1>
    </script>
    
    <script>
        // 2.定义数据
        var data = { name: 'ls', age: '18' };
        // 4.调用 template 函数
        var htmlStr = template('tpl-user', data);
        console.log(htmlStr);
        // 5.渲染HTML结构(使用原生DOM或者js)    其实本质就是将内容直接放置页面上来显示
        $('#container').html(htmlStr);
    </script>
</body>

</html>

6.art-template的标准语法

在 art-template 中,{{}} 表示一个占位符,{{}}语法就是标准语法

5.art-template的标准语法的使用

详情见代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script src="lib/template-web.js"></script>
    <script src="lib/jquery.js"></script>
    </head>

    <body>

        <div id="container"></div>

        <script type="text/html" id="tpl-user">

    <h1>{{name}}   ------   {{age}}</h1>
    {{@ test}}

    <div>
        {{if flag === 0}}
        flag的值是0
        {{else if flag === 1}}
        flag的值是1
        {{/if}}
    </div>

    <ul>
        {{each hobby}}
        <li>索引号是:{{$index}},循环项是:{{$value}}</li>
        {{/each}}
    </ul>

    <!-- 调用时间过滤器 -->
    <h3>{{regTime | timeFormat}}</h3>
    </script>



        <script>
            // 定义一个时间过滤器
            template.defaults.imports.timeFormat = function (date) {
                var y = date.getFullYear();
                var m = date.getMonth() + 1;
                var d = date.getDate();
                var hh = date.getHours();
                var mm = date.getMinutes();
                var ss = date.getSeconds();
                return y + "-" + m + "-" + d + ' ' + hh + ':' + mm + ':' + ss;
            }

            var data = { name: 'ls', age: '18', test: '<h3>测试原文的输出</h3>', flag: 1, hobby: ['吃饭', '睡觉', '玩儿'], regTime: new Date() };
            var htmlStr = template('tpl-user', data);
            console.log(htmlStr);
            $('#container').html(htmlStr);
            // 总结:
            // 原文输出语法: {{@ value}}
            // 条件输出语法: {{if value}} 按需输出的内容  {{else if}} 按需输出的内容 {{/if}}
            // 循环输出语法: {{each 内容函数}} 索引:{{$index}} 内容:{{$value}} {{/each}}
            // 过滤器语法:
            // {{value | 过滤器名称}}
            // 定义过滤器:
            // template.defaults.imports.过滤器名称 = function(形参) {具体步骤来定义过滤器内容}
            // return 结果   这一步不能省略!!!
        </script>
    </body>

</html>

7.模板引擎的实现原理

正则和字符串操作

exec()函数的使用,代码如下:

  <script>
        // exec函数用于 检索字符串 中正则表达式的匹配
        // 如果有匹配到的值就返回值,没有的话就返回 null
        // 其语法格式如下:
        // 检索的值.exec(检索对象)
        var str = 'hello';
        var pattern = /o/;
        var result = pattern.exec(str);
        console.log(result);
    </script>

8.提取分组

具体代码如下:

 <script>
        var str = '<div>我是{{name}}</div>';
        // [] 说明情况,它可以是a~z,A~Z
        // + 说明它可以是任意多个(连续多个)
        // () 提取分组
        var pattern = /{{([a-zA-Z]+)}}/
        var result = pattern.exec(str);
        console.log(result);
    </script>

9.替换

具体代码如下:

  <script>
        var str = '<div>我是{{name}}</div>';
        var pattern = /{{([a-zA-Z]+)}}/;
        var patternResult = pattern.exec(str);
        // console.log(patternResult);
        // replace(a,b)  将 a 的内容替换为 b 的内容
        var str = str.replace(patternResult[0], patternResult[1]);
        console.log(str);
    </script>

10.while 循环

具体代码如下:

  <script>
        var str = '<div>{{name}}现在{{age}}岁了</div>';
        var pattern = /{{\s*([a-zA-Z]+)\s*}}/;
        var patternResult = null;
        while (patternResult = pattern.exec(str)) {
            // 这个条件表达式的意思是:将获取到的正则表达式赋值给 patternResult 如果正则表达式有值,就能一直进行循环,保证条件成立(true)如果正则表达式的值为0,那么就是 null (false) 则条件不再成立,它就会立即跳出循环,进行下一项操作
            str = str.replace(patternResult[0], patternResult[1]);
        }
        console.log(str);
    </script>

11.replace 替换为真值

具体代码如下:

   <script>
        var data = { name: '李四', age: 18 };
        var str = '<div>{{name}}今年{{age}}岁了</div>';
        var pattern = /{{\s*([a-zA-Z]+)\s*}}/;
        var patternResult = null;
        while (patternResult = pattern.exec(str)) {
            str = str.replace(patternResult[0], data[patternResult[1]]);
        }
        console.log(str);
    </script>

至此,有关 form 表单和模板引擎的大部分知识已经讲完了,内容稍许繁琐,但需要我们用心体会,用代码实践,没有任何的讲解能够代替自我实践,因此赶紧行动起来吧(实不相瞒,这些本人也学了很久),不要急于求成!

若有错误和不足,请在评论区中指正,我们共同进步!!!

QQ图片20220417214009.gif