标签:
表单由表单标签、表单域和表单按钮组成。
例:获取和失去焦点改变样式 
首先,在网页中创建一个表单,HTML代码如下
<form action="" method="post" id="regForm">
        <fieldset>
            <legend>个人基本信息</legend>
                <div>
                    <label  for="username">名称:</label>
                    <input id="username" type="text" />
                </div>
                <div>
                    <label for="pass">密码:</label>
                    <input id="pass" type="password" />
                </div>
                <div>
                    <label for="msg">详细信息:</label>
                    <textarea id="msg" rows="2" cols="20"></textarea>
                </div>
        </fieldset>
    </form>当文本框获取焦点后,它的颜色需要有变化;当它失去焦点后,则要恢复原来的样式。此功能极大地提升用户体验,使用户的操作可以得到及时的反馈。
可以使用CSS中的伪类选择符来实现以上的功能
CSS代码如下
    input:focus , textarea:focus{
        boreder: 1px solid #f00
        background: #fcc;
    }但是IE6并不支持除超链接元素之外的:hover伪类选择符,此时可以用jquery来弥补ie6对css支持的不足
首先在CSS中添加一个类名为focus的样式。
.focus { 
     border: 1px solid #f00;
     background: #fcc;
    } 然后再添加获取焦点和失去焦点事件
$(":input").focus(function(){
                $(this).addClass("focus");
            }).blur(function(){
                $(this).removeClass("focus");
            })首先创建一个表单,其中包含评论框
<form>
    <div class = "msg">
        <div class="msg_caption">
            <span class="bigger">放大</span>
            <span class="smaller">缩小</span>
        </div>
        <div>
            <textarea id="comment" rows="8" clos="20">
            多行文本框高度变化
            多行文本框高度变化
            多行文本框高度变化
        多行文本框高度变化多行文本框高度变化多行文本框高度变化
        </div>
    </div>
</form>
<style type="text/css">
/*定义全局属性*/
* { 
    margin:0; /*外边距0px*/
    padding:0;/*内边距0px*/
    font:normal 12px/17px Arial; /*字体颜色,默认,字体大小,字体*/
}
/*定义消息显示区*/
.msg {
    width:300px; /*宽度300px*/
    margin:100px; /*定义外边距100px*/
}
/*定义消息中的标题*/
.msg_caption { 
    width:100%;  /*宽度100%,此处就是300px*/
    overflow:hidden; /*溢出范围就会自动裁剪*/
    margin-bottom:1px;/*内底边距1px*/
}
/*定义消息菜单选项*/
.msg_caption span { 
    display:block; /*此元素将显示为块级元素,此元素前后会带有换行符。*/
    float:left;  /*浮动在左边*/
    margin:0 2px; /*外边距上下为0左右2px*/
    padding:4px 10px; /*内边距上下为4px左右10px*/
    background:#898989; /*背景颜色*/
    cursor:pointer;/*鼠标的形状,手形*/
    color:white; /*字体颜色*/
}
/*定义消息文本域*/
.msg textarea{ 
    width:300px; /*宽度300px*/
    height:80px;/*高80px*/
    border:1px solid #000;/*边框大小1px,边框粗细 solid 边框颜色 黑色*/
}
</style>然后,需要思考以下两种情况 
(1)当单击放大按钮后,如果评论框的高度小于500px,则在原有高度的基础上增加50px。 
(2)当单击”缩小”按钮后,如果评论框的高度大于50px,则在原有高度的基础上减去50px。
$(function(){
            var $comment = $("#comment");//获取评论宽
            $(".bigger").click(function(){//放大按钮
                var height = $comment.height();//当前评论框高度
                var number = 50;//增量
                if( height < 500){
                    //重新设置高度
                    $comment.height(height + number);
                }
            });
            $(".smaller").click(function(){//缩小按钮
                var height = $comment.height();//当前评论框高度
                var number = 50;//减量
                if( height > 50){
                    //重新设置高度
                    $comment.height(height - number);
                }
            });
        });但是,此时评论框显得很呆板,缺乏缓冲效果。改用自定义动画animate来实现。
$(function(){
            var $comment = $("#comment");//获取评论宽
            $(".bigger").click(function(){//放大按钮
                var height = $comment.height();//当前评论框高度
                var number = 50;//增量
                if(!$comment.is(":animated")){//判断是否处于动画
                    if( height < 500){
                        //重新设置高度
                        //$comment.height(height + number);
                        //清空当前正在执行动画,然后在加入动画
                        $comment.stop(true).animate({height: height + number},300);
                    }
                }
            });
            $(".smaller").click(function(){//缩小按钮
                var height = $comment.height();//当前评论框高度
                var number = 50;//减量
                if(!$comment.is(":animated")){//判断是否处于动画
                    if( height > 50){
                        //重新设置高度
                        //$comment.height(height - number);
                        //清空当前正在执行动画,然后在加入动画
                        $comment.stop(true).animate({height: height - number},300);
                    }
                }
            });
        });通过控制多行文本框的滚动条的变化,使文本框里的内容滚动。
与控制高度的方法相同,只不过此处需要控制的是另一个属性,scrollTop。
$(".up").click(function(){//向上翻一页
                var height = $comment.height();//当前评论框高度
                if(!$comment.is(":animated")){//判断是否处于动画
                    if( height > 50){
                        //清空当前正在执行动画,然后在加入动画
                            $comment.stop(true).animate({scrollTop: "-="+height},300);
                    }
                }
            });
            $(".down1").click(function(){//向下翻一页
                var height = $comment.height();//当前评论框高度
                if(!$comment.is(":animated")){//判断是否处于动画
                        //清空当前正在执行动画,然后在加入动画
                        $comment.stop(true).animate({scrollTop: "+="+height},300);
                }
            });
对复选框最基本的应用,就是对复选框进行全选、反选和全不选等操作。复杂的操作要与选项挂钩,来达到各种级联反应效果。
首先在空白网页中创建一个表单,其中放入一组复选框,HTML代码如下:
<form action="" method="post" id="regForm">
        你爱好的运动是?<br/>
        <input type="checkbox" name="items" value="足球" />足球
        <input type="checkbox" name="items" value="篮球球" />篮球
        <input type="checkbox" name="items" value="羽毛球" />羽毛球
        <input type="checkbox" name="items" value="乒乓球" />乒乓球
        <input type="checkbox" name="items" value="排球" />排球
        <input type="button" id="CheckedAll"  value="全选"/>
        <input type="button" id="CheckedNo"  value="全不选"/>
        <input type="button" id="CheckedRev"  value="反选"/>
        <input type="button" id="send"  value="提交"/>        
    </form>如果需要使复选框处于选中或者不选状态,必须通过控制元素的checked属性来达到目的。 
如果属性checked的值为true,说明被选中;如果值为false,说明没被选中。因此可以基于这个属性来完成需求。
<script type="text/javascript">
  $(function(){
     //全选
     $("#CheckedAll").click(function(){
         $(‘[name=items]:checkbox‘).prop(‘checked‘, true);
     });
     //全不选
     $("#CheckedNo").click(function(){
        $(‘[type=checkbox]:checkbox‘).prop(‘checked‘, false);
     });
     //反选
     $("#CheckedRev").click(function(){
          $(‘[name=items]:checkbox‘).each(function(){
            //此处用JQ写法颇显啰嗦。体现不出JQ飘逸的感觉。
            //$(this).attr("checked", !$(this).prop("checked"));
            //$(this).prop("checked", !$(this).prop("checked"));
            //直接使用JS原生代码,简单实用
            this.checked=!this.checked;
          });
     });
     //输出值
    $("#send").click(function(){
        var str="你选中的是:\r\n";
        $(‘[name=items]:checkbox:checked‘).each(function(){
            str+=$(this).val()+"\r\n";
        })
        alert(str);
    });
  })如果我们要实现,用一个checkbox选项,代替全选和全不选操作。将如何实现呢?
  //全选/全不选
        $("#CheckedAll").click(function(){
        if(this.checked){//如果当前单击的复选框被选中
            $(‘[name=items]:checkbox‘).prop(‘checked‘, true);
        }else{
                $(‘[name=items]:checkbox‘).prop(‘checked‘, false);
        }
     });进一步观察思考后发现,所有复选框的checked属性的值和控制全选的复选框的checked属性的值是相同的,因此可以省略if判断,直接赋值。
 //全选/全不选
     $("#CheckedAll").click(function(){//
       $(‘[name=items]:checkbox‘).prop(‘checked‘, this.checked);
    });当单击id为CheckedAll的复选框后,复选框组将被选中。当在复选框组里取消某一个选项的选中状态时,id为“CheckedAll”的复选框并没有被取消选中状态,而此时需要它和复选框组能够联系起来,即复选框组里如果有一个或者更多没选中时,则取消id为CheckedAll复选框的选中状态;如果复选框组都被选中时,则id为CheckedAll的复选框也自动被选中。 
因此需要对复选框组进行操作,以通过它们来控制id为CheckedAll的复选框。具体实现思路如下:
(1)对复选框组绑定单击事件。
(2)定义一个flag变量,默认为true
(3)循环复选框组,当有没被选中的项时,则把变量flag的值设置为false。
(4)根据变量flag的值来设置id为CheckedAll的复选框是否选中
①如果flag为true,说明复选框组都被选中
②如果flag为false,说明复选框组至少有一个未被选中。
根据以上思路,可以写出如下jquery代码:
$(function(){//网页加载时
    $("[name=items]:checkbox").click(function(){
        var flag = true;
        $("[name=items]:checkbox").each(function(){
            if(!this.checked){
                flag = false;
            }
        });
        $("#CheckedAll").prop("checked",flag);
    });
    $("#CheckedAll").click(function(){
         $(‘[name=items]:checkbox‘).prop(‘checked‘, this.checked); 
    });
})此时id为CheckedAll的复选框和复选框组就可以联动起来了。
思路二:
(1)对复选框组绑定单击事件
判断复选框的总数是否与选中的复选框数量相等。
如果相等,则说明全选中了,id为CheckedAll的复选框应当处于选中状态。否则不选中。
$("[name=items]:checkbox").click(function(){
        //定义一个临时变量,避免重复使用同一个选择器选择页面中的元素,提高程序效率
        var $tmp = $("[name=items]:checkbox");
        //用filter()方法筛选出选中的复选框,并直接给checkedall赋值
        $("#CheckedAll").attr("checked",$tmp.length==$tmp.filter(":checked").length);
    });以一个简单的用户注册为例。
首先新建一个表单。html代码如下:
<form>
    <div class="int">
        <label for="username">用户名:</label>
        <input type="text" id="username" class="required" /> 
    </div>
        <div class="int">
        <label for="email">邮箱:</label>
        <input type="text" id="email" class="required" /> 
    </div>
    <div class="int">
        <label for="personinfo">个人资料:</label>
        <input type="text" id="personinfo" /> 
    </div>
    <div class="sub">
        <input type="submit" id="send" value="提交" />
        <input type="reset" id="res"> 
    </div>
    </form>在表单内class属性为required的文本框式必填项,因此要与非必填表单元素加以区别。可以用append()来完成
//为必填选项添加红星
    $("form :input.required").each(function(){
        var $required = $("<strong class=‘high‘>*</strong>");//创建元素
        $(this).parent().append($required);//将他追加到文档中
    })当用户名文本框中填写完信息后,将光标的焦点从用户名移出时,需要判断用户名是否符合验证规则。当光标的焦点从邮箱文本框移出时,需要即时判断邮箱填写是否正确,因此需要给表单元素添加失去焦点事件,即blur。
    //为表单元素添加失去焦点事件
    $("form :input").blur(function(){
        var $parent = $(this).parent();//选取含有子元素和文本的节点
        //验证用户名
        if($(this).is("#username")){
            if(this.value == "" || this.value.length < 6){
                var errorMsg = "请输入至少6位的用户名.";
                $parent.append(‘<span class="formtips onError">‘ + errorMsg + ‘</span>‘);
            }else{
                var okMsg = "输入正确.";
                $parent.append(‘<span class="formtips onSuccess">‘ + okMsg + ‘</span>‘);
            }
        }
        //验证邮箱
        if($(this).is("#email")){
            if(this.value=="" || (this.value != "" && !/.+@.+\.[a-zA-Z]{2,4}$/.test(this.value))){
                var errorMsg = "请输入正确的E-mail地址.";
                $parent.append(‘<span class="formtips onError">‘ + errorMsg + ‘</span>‘);
            }else{
                var okMsg = "输入正确.";
                $parent.append(‘<span class="formtips onSuccess">‘ + okMsg + ‘</span>‘);
            }
        }
    })由于每次在元素失去焦点后,都会创建一个新的提醒元素,然后将它追加到文档中,最后出现了多次的提醒信息。因此,需要在创建提醒元素之前,将当前元素以前的提醒元素都删除。可以使用remove()方法来完成。
$parent.find(".formtips").remove();//删除以前的节点当鼠标在表单元素中多次失去焦点时,都可以提醒用户填写是否正确。但是,如果用户无视错误提醒,执意要单击提交按钮时,为了使表单那填写元素进行一次整体的验证。可以使用trigger()方法来触发blur事件,从而达到验证效果。如果填写错误,就会以红色提醒用户;如果用户名和邮箱都不符合规则,那么就有两处错误,即有两个class为onError的元素,因此可以根据class为onError 元素的长度来判断是否可以提交。
如果长度为0,即true,说明可以提交了,如果长度大于0,则false,说明有错误,需要阻止表单提交。
阻止表单提交用return false;
$("#send").click(function(){
        $("form .required:input").trigger("blur");
        var numError = $(‘form .onError‘).length;
        if(numError){
            return false;
        }
        alert("注册成功,密码已经发到你的邮箱,请查收。");
    })用户也许会提出:为什么每次要等字段元素失去焦点后,才提醒输入是否正确?如果输入时就可以提醒,这样就可以更加即时了。
为了达到用户提出的需求,需要给表单元素绑定keyup事件和focus事件,keyup事件能在用户每次松开按键时触发,实现即时提醒;focus事件能在元素得到焦点的时候触发,也可以实现即时提醒。
//为表单元素添加失去焦点事件
    $("form :input").blur(function(){
        var $parent = $(this).parent();//选取含有子元素和文本的节点
        $parent.find(".formtips").remove();//删除以前的节点
        //验证用户名
        if($(this).is("#username")){
            if(this.value == "" || this.value.length < 6){
                var errorMsg = "请输入至少6位的用户名.";
                $parent.append(‘<span class="formtips onError">‘ + errorMsg + ‘</span>‘);
            }else{
                var okMsg = "输入正确.";
                $parent.append(‘<span class="formtips onSuccess">‘ + okMsg + ‘</span>‘);
            }
        }
        //验证邮箱
        if($(this).is("#email")){
            if(this.value=="" || (this.value != "" && !/.+@.+\.[a-zA-Z]{2,4}$/.test(this.value))){
                var errorMsg = "请输入正确的E-mail地址.";
                $parent.append(‘<span class="formtips onError">‘ + errorMsg + ‘</span>‘);
            }else{
                var okMsg = "输入正确.";
                $parent.append(‘<span class="formtips onSuccess">‘ + okMsg + ‘</span>‘);
            }
        }
    }).keyup(function(){
        $(this).triggerHandler("blur");//trigger("blur")不仅会触发为元素绑定的blur事件,也会触发浏览器默认的blur事件,即不能将光标定位到文本框上。而triggerHandler方法只会触发为元素绑定的blur事件,而不触发浏览器默认的blur事件。
    }).focus(function(){
        $(this).triggerHandler("blur");
    })客户端校验只是用户提升用户操作体验,服务器端仍需对用户输入的数据进行合法性验证
<table>
        <thead>
            <tr><th>姓名</th><th>性别</th><th>暂住地</th></tr>
        </thead>
        <tbody>
            <tr><td>张三</td><td>男</td><td>湖南永州</td></tr>
            <tr><td>李四</td><td>女</td><td>湖南郴州</td></tr>
            <tr><td>王五</td><td>男</td><td>湖南长沙</td></tr>
            <tr><td>Rain</td><td>男</td><td>浙江杭州</td></tr>
        </tbody>
    </table>首先定义两个CSS样式
.even       { background:#FFF38F;}  /* 偶数行样式*/
    .odd        { background:#FFFFEE;}  /* 奇数行样式*/
    注意$("tr:odd")和$("tr:even")选择器中索引是从0开始,因此第一行是偶数
    然后选择表格奇数行和偶数行分别添加样式,可以使用选择器来完成。
    $("tbody>tr:odd").addClass("odd");
    $("tbody>tr:even").addClass("even");
    如果需要某一行高亮显示状态,可以使用contains选择器来实现
    $("tr:contains(‘王五‘)").addClass("selected");
2.单选框控制表格行高亮
//为表格行添加单击事件
    $("tbody>tr").click(function(){
        $(this)
            .addClass("selected")
            .siblings().removeClass("selected")
            .end()
            .find(":radio").prop("checked",true);
    });这样,就可以通过单击每行来实现表格行高亮,同时此行所在的单选框也被选中。 
上面代码中使用了end()方法。当前对象是$(this),当进行addClass(“selected”)操作时,对象并未发生改变,当执行
//初始化表格的时候,如果默认已经有单选框被选中,那么也需要被处理
    $("table :radio:checked").parent().parent().addClass("selected");
    注意:$("table :radio:checked").parent().parent().addClass("selected");是通过parent方法逐步向父节点获取相应的元素的,也可以通过parents方法直接获取
     $("table :radio:checked").parents().addClass("selected");
    此外,如果通过has选择器也可以进一步简化,表示含有选中的单选框的tr行将被高亮显示
    $("tbody>tr:has(:checked)").addClass("selected");最后代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title></title>
    <script src="jquery-1.11.3.js" type="text/javascript">      
        </script>
<script type="text/javascript">     
$(function(){//网页加载时
    $("tbody>tr:odd").addClass("odd");//先排除第一行,然后给奇数行添加样式
    $("tbody>tr:even").addClass("even");//先排除第二行,然后给偶数行添加样式
    //为表格行添加单击事件
    $("tbody>tr").click(function(){
        $(this)
            .addClass("selected")
            .siblings().removeClass("selected")
            .end()
            .find(":radio").prop("checked",true);//这里为什么不用attr来设置属性呢。因为jquery版本升级到1.6以后,对于checked,true和false之类的对象,必须用prop方法来设置和修改。
    });
    //初始化表格的时候,如果默认已经有单选框被选中,那么也需要被处理
    //$("table :radio:checked").parent().parent().addClass("selected");
    //简化
    //$("table :radio:checked").parents().addClass("selected");
    //再简化
    $("tbody>tr:has(:checked)").addClass("selected");
})
        </script>
<style type="text/css">
table       { 
    border:0;
    border-collapse:collapse;
}
td  { 
    font:normal 12px/17px Arial;
    padding:2px;
    width:100px;
}
th          { 
    font:bold 12px/17px Arial;
    text-align:left;
    padding:4px;
    border-bottom:1px solid #333;}
.even       { background:#FFF38F;}  /* 偶数行样式*/
.odd        { background:#FFFFEE;}  /* 奇数行样式*/
.selected       { 
    background:#FF6500;
    color:#fff;
}
</style>
</head>
<body>
    <table>
        <thead>
            <tr><th>姓名</th><th>性别</th><th>暂住地</th></tr>
        </thead>
        <tbody>
            <tr><td><input type="radio" name="choice" /></td><td>张三</td><td>男</td><td>湖南永州</td></tr>
            <tr><td><input type="radio" name="choice"  /></td><td>李四</td><td>女</td><td>湖南郴州</td></tr>
            <tr><td><input type="radio" name="choice" checked="checked" /></td><td>王五</td><td>男</td><td>湖南长沙</td></tr>