2021-04-28Ajax第二天

1.表单的组成部分

①表单标签<form> </form>
②表单域
③表单按钮<button type="submit"> </button>

2.提交表单后会立即跳转到表单被提交到的URL地址

3.form表单的属性

(1)action属性
属性的值是后端提供的一个URL地址,也就是表单提交的地址。

(2)target属性
表示表单提交后的页面在何处打开。默认值是_self。

_blank:在新窗口中打开
_self:在当前窗口打开
_parent:在父框架集中打开
_top:在整个窗口中打开
_framename:在指定的框架中打开

(3)method属性
属性用来规定 以何种方式 把表单数据提交到 action URL地址。

①默认值为get:通过URL地址的形式提交表单数据。适合少量、简单的数据。
②post:适合提交大量的,复杂的,或包含文件上传的数据。

(4)enctype属性
enctype属性用来规定在 发送表单数据之前如何对数据进行编码

默认值为application/x-www-form-urlencoded,表示在发送前编码的所有字符。
②涉及文件上传操作时,必须把enctype属性值改为multipart/form-data
③text/plain,空格转换为+加号,但不对特殊字符编码。

4.表单的同步提交

通过点击 submit 按钮,触发表单提交的操作,从而使页面跳转到 action URL 的行为,叫做表单的同步提交。
缺点:
①表单同步提交后,整个页面会发生跳转
②表单同步提交后,页面之前的状态和数据会丢失
解决:
表单只复杂采集数据,Ajax负责将数据提交到服务器

二、通过Ajax提交表单数据

1.监听表单提交的事件submit

注意:一定要给form表单添加事件,不是button按钮!!!

$("form").on('submit',function(){
         alert('表单被提交了')
   })
2.阻止表单默认行为--提交表单

事件对象的e.preventDefault( )方法

3.serialize( )方法

①jQuery提供的serialize( )方法可以快速获取表单的值。
②表单元素必须有name属性。属性值一般是接口的参数。(切记!切记!切记!)
③返回值是一个字符串
④data参数都是以查询字符串的形式提交的。所以,serialize()方法获取的字符串直接赋值给data。

data: $(' form ') .serialize( );

           $("form").on('submit',function(e){
                e.preventDefault();         //阻止表单提交的默认行为
                var data = $(this).serialize();
                console.log(data);
            });
          // username=admin&password=123
4.原生js中,form表单的reset( )方法

重置表单的所有内容。

表单对象.reset( )

$('form')[0].reset();

三、模板引擎

1.http://aui.github.io/art-template/zh-cn/docs/installation.html

打开链接后,将下载链接(template-web.js插件)另存到本地。

2.art-template的使用

(1)页面中引入模板引擎template-web.js

<script src="js/template-web.js"></script>

(2)定义数据

var data = { 属性名1:属性值1...}

(3)定义模板

①模板写到html结构中,用一个<script></script>标签包裹。
②要把<script>标签的type属性改为text/html
{{ }}双大括号内部填写属性名

(4)调用template函数

var str = template(' 模板ID' ,需要渲染的数据对象 )

注意:函数的返回值就是拼接好的模板字符串

(5)渲染HTML结构
最后我们需要把template返回的模板字符串设置到页面容器中

<head>
   <!-- 1.引入模板引擎template.js -->
    <script src="js/template-web.js"></script>
    <script>
      window.addEventListener('load', function () {
        // 过滤器
        template.defaults.imports.myDate = function (date) {
          var year = date.getFullYear();
          var month = date.getMonth() + 1;
          var day = date.getDate();
          return year + '-' + month + '-' + day; // 过滤器必须有返回值
        };
        // 2.定义数据
        var data = {
          name: '吴磊',
          age: 22,
          text: '<h3>测试原文输出</h3>',
          flag: 0,
          arr: [1, 2, 3],
          myTime: new Date(),
        };

        // 4.调用template函数
        var str = template('m', data);

        // 5.渲染数据
        $('.box').html(str);
      });
    </script>
</head>

  <body>
    <div class="box"></div>

    <!-- 3.定义模板 -->
    <script type="text/html" id="m">
      <h1>{{name}}</h1>
      <h5>{{age}}</h5>
      <!-- 原文输出-->
      {{@text}}
      <!-- 条件输出 -->
      <div>
        {{if flag == 0}} flag的值是0 {{else if flag == 1}} flag的值是1 {{/if}}
      </div>
      <!-- 循环输出 -->
      <ul>
        {{each arr}}
        <li>循环项是{{$index}},索引号是{{$value}}</li>
        {{/each}}
      </ul>
      <!-- 过滤器 -->
      {{myTime | myDate}}
    </script>
  </body>
3.art-template标准语法

(1)art-template 提供了 {{}} 这种语法格式,在 {{}} 内可以进行 变量输出循环数组 等操作,这种 {{}} 语法在 art-template 中被称为标准语法。

(2)调用template()函数时已经传入数据对象了,所以在定义模板时,用到哪个属性就直接写属性名,不要写 对象名.属性名。【谨记!】

4.输出

在 {{}} 语法中,可以进行 变量 的输出,对象属性的输出,三元表达式输出,逻辑或输出,加减乘除等表达式输出

      {{value}}
      {{obj.key}}
      {{obj['key']}}
      {{a ? b : c}}
      {{a || b}}
      {{a + b}}
5.原文输出

{{ @属性名}}

如果想要解析字符串中的HTML标签,就用原文输出。

// 2.定义数据
    var data = { name: '吴磊', age: 22, text: "<h3>测试原文输出</h3>" };
// 3.定义模板
    {{@text}} <!-- 测试原文输出-->
6.条件输出

{{ if 条件1}}
输出1
{{ else if 条件2 }}
输出2
{{ /if }}

// 2.定义数据
        var data = { name: '吴磊', age: 22, text: "<h3>测试原文输出</h3>",flag: 0 };
// 3.定义模板
      <!-- 条件输出 -->
      <div>
        {{if flag == 0}}
        flag的值是0
        {{else if flag == 1}}
        flag的值是1
        {{/if}}
      </div>
7.循环输出

如果要实现循环输出,则可以在{{}} 内,通过each语法循环数组,当前循环的索引使用
$index 进行访问,当前循环项使用 $value 进行访问

{{ each 数组名}}
{{$value}}, {{$index}}

{{/each}}

// 2.定义数据
        var data = {
          name: '吴磊',
          age: 22,
          text: '<h3>测试原文输出</h3>',
          flag: 0,
          arr: [1, 2, 3],
        };
// 3.定义模板
     <!-- 循环输出 -->
      <ul>
        {{each arr}}
        <li>循环项是{{$index}},索引号是{{$value}}</li>
        {{/each}}
      </ul>
8.过滤器

过滤器本质就是一个 function 函数

①在js中定义过滤器:
template.defaults.imports.过滤器名称 = function (形参){ return 处理结果}

  • 形参用来接收待处理的数据。

②使用过滤器:
{{ 待处理数据 | 过滤器名称 }}

        // 过滤器
        template.defaults.imports.myDate = function (date) {
          var year = date.getFullYear();
          var month = date.getMonth() + 1;
          var day = date.getDate();
          return year + '-' + month + '-' + day; // 过滤器必须有返回值
        };
        // 2.定义数据
        var data = {
          name: '吴磊',
          age: 22,
          text: '<h3>测试原文输出</h3>',
          flag: 0,
          arr: [1, 2, 3],
          myTime: new Date(),
        };
      // 3.定义模板
      <!-- 过滤器 -->
      {{myTime | myDate}}

四、模板引擎原理

1.正则表达式的exec( )方法

①exec( )方法可以检测字符串中是否能匹配到正则表达式。
②如果匹配成功,返回第一个匹配到的值(是一个数组,索引为0的元素才是匹配到的值),否则返回Null。

正则表达式.exec( 字符串)

        var reg = /a/;
        var str = "abc"
        console.log(reg.exec(str));
输出结果:
Array(1)
0: "a"
groups: undefined
index: 0
input: "abc"
length: 1
__proto__: Array(0)
2.正则表达式的分组

正则表达式中 ( ) 包起来的内容表示一个分组,可以通过分组来 提取自己想要的内容

        var reg = /{{([a-zA-Z]+)}}/
        var str = "<div>{{name}}</div>"
        console.log(reg.exec(str));
输出结果:
Array(2)
0: "{{name}}"
1: "name"
groups: undefined
index: 5
input: "<div>{{name}}</div>"
length: 2
__proto__: Array(0)
3.正则表达式的字符串替换

字符串的replace(“待替换字符串”,"替换成的字符串" )方法。
replace()方法每次只能替换第一个匹配的字符。
可以用while循环将字符串中的所有{{name}}替换为name。

       // 数据
        var data = {name: '吴磊',age: 22,height: "183cm"}
        // 正则表达式
        var reg = /{{\s*([a-zA-Z]+)\s*}}/
        // 字符串
        var str = "<div>{{name}}今年{{ age  }}岁了,高{{ height }}</div>"

        // 获取分组:name
        // var result = reg.exec(str);
        // 用name替换{{name}}
        // var newStr = str.replace(result[0],result[1]);
        // console.log(newStr);

        // 用while循环实现replace替换
        var result = null;
        while(result = reg.exec(str)){
            // str = str.replace(result[0],result[1]);  //替换成属性名
            str = str.replace(result[0],data[result[1]]);  //替换成属性值

        }
        console.log(str); //<div>name今年age岁了,高height公分</div>
4.自定义模板引擎函数
          function template(id, data) {
          // 获取模板
          var str = document.getElementById(id).innerHTML;
          // 正则表达式
          var reg = /{{\s*([a-zA-Z]+)\s*}}/;
          // 用while循环实现replace替换,将模板里的占位符替换成data数据
          var result = null;
          while ((result = reg.exec(str))) {
            // str = str.replace(result[0],result[1]);  //替换成属性名
            str = str.replace(result[0], data[result[1]]); //替换成属性值
          }

          // 返回模板字符串
          return str;
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容

  • 表单处理(get 方式) 举例(如图,建立一个表单页面) 提取输入的账号和密码 从服务器打开是这样的 提交后的结果...
    左耳击水兽阅读 285评论 0 0
  • Form表单的基本使用 什么是表单 表单在网页中主要负责 数据采集功能。HTML中 标签,就是用于采集用户输入的信...
    新苡米阅读 201评论 0 3
  • 表单相关操作 表单应用场景 通过表单,用户可以向服务器提交数据信息,比如注册账号、登录账号、发微博..... 用户...
    汐埋罗傲阅读 182评论 0 0
  • 一、前言 对于后端开发来说,经常要和前端进行联系的两个面就是:1、表单form提交至servlet。2、ajax提...
    7叶阅读 2,805评论 1 5
  • 1 项目需求: 需要自己创建一个服务器,来渲染我们自己的静态页面; 2 node自带的运行环境repl r:rea...
    果木山阅读 228评论 0 0