jQuery EasyUI从零开始学
上QQ阅读APP看书,第一时间看更新

2.7 表单

在本章的开头部分,我们讲到一个表单由三部分组成,即表单标签、表单域、表单按钮,并且学习了EasyUI表单域中的部分控件以及各类按钮的使用方法。在前面的章节中,我们介绍的各类控件大都是用来处理用户的各类操作,其仅仅属于客户端的操作,而一个网站更需要服务器端来处理客户端的各种操作,表单就是客户端与服务器端之间交互的一个中介,通过表单我们可以将各类控件的值传输到服务器端。本节将先介绍表单的使用方法,随后将向读者演示一些实用的程序。

2.7.1 表单的基本使用方法

本节将先带领读者学习表单的基本使用方法,接着会通过几个例子进一步讲解表单的使用。

表单的默认配置定义在$.fn.form.defaults中。

1. 创建表单

表单只能通过标记来创建:

01  <form id="ff">
02      ...表单域内的各类控件以及表单按钮
03   </form>

2. 表单属性

表单常用属性说明见表2.52。

表2.52 表单常用属性

3. 表单事件

表单常用事件说明见表2.53。

表2.53 表单常用事件说明

4. 表单方法

表单常用方法说明见表2.54。

表2.54 表单常用方法说明

2.7.2 提交表单

通常我们会在控件的标记内定义一个name属性,在向服务器提交数据时,服务器可以通过该属性的值来获取数据,例如:

01  <form id="ff" method="post">
02           <div id="nb" name="nb"></div>
03           <a id="btn" href="#" class="easyui-linkbutton">提交</a>
04  </form>
05  <script>
06      $(function(){
07           $('#nb').numberbox({
08                prefix:'$',
09           });
10           $('#ff').form({
11                url:"form.php",
12                onSubmit: function(){
13                    //提交前触发的事件
14                },
15                success:function(data){
16                    //服务器返回数据后触发
17                }
18           });
19           $("#btn").click(function(){
20                $('#ff').submit();
21           });
22      });
23  </script>

相关的服务器代码如下:

01  <?php
02       //获取前端数据
03       $name = $_POST["nb"];
04       //注意$name的值是存储值
05  ?>

提示

服务器接收的存储值,本例中如果用户输入数字1时数字框会显示$1,但是提交到服务器的则是存储值1。

我们也可以使用表单的submit方法动态提交表单,例如上述代码等同于:

01  <form id="ff" method="post">
02           <div id="nb" name="nb"></div>
03           <a id="btn" href="#" class="easyui-linkbutton">提交</a>
04  </form>
05  <script>
06       $(function(){
07                $('#nb').numberbox({
08                     prefix:'$',
09                });
10           $("#btn").click(function(){
11                $('#ff').form('submit',{
12                     url:"form.php",
13                     onSubmit: function(){
14                          //提交前触发的事件
15                     },
16                     success:function(data){
17                          //服务器返回数据后触发
18                          alert(data);
19                     }
20                });
21           });
22       });
23  </script>

在提交表单的过程中,可以使用queryParams属性添加一些额外的参数,例如:

queryParams:{param1:'1',param2:'2'},

服务器端获取这些参数的方法如下:

$param1 = $_POST["param1"];

在提交表单前通常需要检查组件中的输入值是否通过验证,此时只需在onSubmit事件中使用validate方法进行检查即可,该方法会自动扫描表单内的全部组件,只有所有组件都验证通过时它才会返回true。例如:

01  onSubmit: function(){
02                if($('#ff').form('validate')){
03                     alert('通过验证');
04                     return true;
05                }
06                else{
07                     alert('未通过验证');
08                     return false;
09                }
10  }

2.7.3 初始化表单字段

在实际开发中经常会遇到对某些信息进行编辑的情况,例如编辑某人的个人信息等,此时需要先从服务器将用户数据取出并初始化指定的组件,EasyUI表单提供了数据加载功能,它可以方便地帮助我们完成数据的初始化功能,它支持本地加载数据和从服务器加载数据两种方式。下面先向读者展示如何加载本地数据,相关代码如下:

01  <form id="ff" method="post">
02           <input id="nickname" name="nickname"><br/><br/>
03           <input id="age" name="age"><br/><br/>
04           <input id="birthday" name='birthday'>
05  </form>
06  <script>
07       $(function(){
08           $('#nickname').textbox({
09                label:"姓名",
10                labelWidth:150,
11                width:350
12           });
13           $('#age').numberspinner({
14                label:"年龄",
15                labelWidth:150,
16                width:350
17           });
18           $('#birthday').datebox({
19                label:"出生日期",
20                labelWidth:150,
21                width:350
22           });
23           $("#ff").form('load',{
24                nickname:'张三',
25                age:'18',
26                birthday:'7/3/2000'
27           })
28       });
29  </script>

使用表单的load方法可以加载本地数据,可以发现在它的参数中仍然是使用字段的name属性进行赋值。最终运行结果如图2.26所示。

图2.26 使用本地数据初始化表单

同样可以使用load方法加载服务器端数据来初始化表单,例如:

$("#ff").form('load','initData.php');

其中服务器端代码如下:

01  $data = array('nickname'=>'zhangsan',
02             'age'=>'18',
03             'birthday'=>'7/3/2000'
04           );
05  echo json_encode($data);

服务器端的数据结构与本地加载时一致,也是通过字段的name属性来赋值。

2.7.4 文件上传

本节将讲解如何利用表单上传文件,先看一个例子:

01            <form id="ff" method="post">
02                <!-- 只接受pdf类型文件 -->
03                <input class="easyui-filebox" name='file' style="width:300px"
04                 data-options="accept:'application/pdf'" ><br/><br/>
05                <div id="p" class="easyui-progressbar"
style="width:300px;"></div><br/><br/>
06                <a id="btn" href="#" class="easyui-linkbutton">上传文件</a>
07            </form>
08            <script>
09                $(function(){
10                     $("#ff").form({
11                          iframe:false,
12                          onProgress:function(percent){
13                               $("#p").progressbar("setValue",percent);
14                          }
15                     });
16                     $("#btn").click(function(){
17                          $('#ff').form('submit',{
18                               url:"server/upload.php",
19                          });
20                     });
21                });
22            </script>

这个例子里面我们使用了表单的onProgress事件,该事件返回文件上传过程中的进度,使用该事件先要设置表单的iframe属性为false。我们使用了一个进度条组件(progressbar),该组件将会动态显示文件上传的进度。

提示

读者也可以使用$.messager.progress()方法显示默认的进度条、使用$.messager.progress('close')方法关闭默认进度条。不同的是默认进度条并不会根据表单处理的进度实时更新,它会循环地更新进度直到被关闭为止。

服务器端同样是使用文件框的name来获取上传的文件,其代码如下:

01  // 文件的保存目录,默认文件会被保存到D盘根目录下
02  $path = "D://";
03  if (file_exists($path . $_FILES["file"]["name"])) {
04      echo $_FILES["file"]["name"] . " 已存在. ";
05  } else {
06      move_uploaded_file($_FILES["file"]["tmp_name"], $path .
$_FILES["file"]["name"]);
07  }

最终运行结果如图2.27所示。

图2.27 文件上传演示

【本节详细代码参见随书源码:\源码\easyui\example\c2\uploadFile.html】

提示

本书仅仅是简单地向读者演示服务器端的相关代码,由于服务器端开发语言较多且相关框架众多,为减轻读者的学习成本,在本书中将不重点介绍服务器端的相关代码。读者在学习服务器端代码时只需关注两点即可:(1)服务器端如何获取数据;(2)服务器端如何返回数据。在本节中服务器端主要是通过标记的name属性获取数据,返回的是一个JSON格式数据。