JavaScript网站设计实践(七)编写最后一个页面 改进表单

原文:JavaScript网站设计实践(七)编写最后一个页面 改进表单

一、最后一个页面 contact.html。改进表单

在该页面实现的功能:

  • 几乎所有的网站都会有表单填写,对于用户输入和填写的数据,首先我们一般现在前台验证,然后再去后台验证。

在前台最简单的验证:检查必填字段是否填写、填写格式是否符合要求等。

  • 每个表单里面,当获取到输入焦点时,令提示文本消失

现在开始动手来写。

1、实现思路

(1)在这个表单里会验证的是必填字段和邮箱格式是否正确。首先,把判断必填字段和邮箱格式分别写在两个函数里;然后在一个validateForm()函数里,根据获取到的className属性值,确定调用哪个函数(className属性值有required和email);最后将这个判断合法性的整合函数valiedateForm()在用户提交数据时调用进来。

function prepareForms(){
    for(var i=0; i<document.forms.length; i++){
      var thisform = document.forms[i];
      resetFields(thisform);

      thisform.onsubmit = function(){
          return validateForm(this);
    }
  }
}

(2)关于提示文本消失,给一个if判断,如果表单里的值默认值,则赋值为空,否则当输入焦点离开时,不去改变值。

function resetFields(whichform){
    for(var i=0; i<whichform.elements.length; i++){
        var element = whichform.elements[i];           //获取每个表单元素
        if(element.type == "submit") continue;         //如果是表单元素类型是submit,则退出本次循环
        if(!element.defaultValue) continue;            //如果不是表单元素的默认值,也退出本次循环
        element.onfocus = function(){
            if(this.value == this.defaultValue){
                this.value = "";
            }
        }
        element.onblur = function(){
            if(this.value == ""){
                this.value = this.defaultValue;
            }
        }
    }
}

 

defaultValue为表单的默认值,onfocus为获取焦点,onblur焦点离开。

(3)兼容浏览器。不是所有的浏览器都会对点击label元素所包含的的文本,与之相关的表单字段就会获得输入焦点并等待用户输入,所以写个小函数来实现兼容。

function focusLabels(){
    //旧浏览器  对象检测
    if(!document.getElementsByTagName) return false;

    //获取元素
    var labels = document.getElementsByTagName("label");

    //给有for属性的label添加focus()函数
    for(var i=0; i<labels.length; i++){                        //for循环判断
        if(!labels[i].getAttribute("for")) continue;
        labels[i].onclick = function(){
            var id= this.getAttribute("for");                 //获取到label中for的值
            if(!document.getElementById(id)) return false;    //再判断是否存在跟for的值一样的id值    有则添加focus()方法
            var element = document.getElementById(id);
            element.focus();
        }
    }
}

 

给每个label标签的都有一个onclick函数,如果这个label标签有for属性值,并且这个表单里面的某个字段是有存在这个id,则给这个id所在的表单字段一个focus函数。element.focus()

 

2、代码

(1)contact.html

拷贝template.html,在div的className为content部分,开始写表单内容。

<div id="content">
            <h1>联系我们乐队</h1>
            <form method="post" action="#">
                <fieldset>
                    <p>
                        <label for="name">Name:</label>
                        <input type="text" id="name" name="name" value="your name" class="required"/>
                    </p>
                    <p>
                        <label for="email">Email:</label>
                        <input type="text"  id="email" name="email" value="your email" class="email required" />
                    </p>
                    <p>
                        <label for="message">Message:</label>
                        <textarea rows="7" cols="45" id="message" name="message" class="required"> 写下你的留言</textarea>
                    </p>
                    <input class="contact_sub" type="submit" value="留言" />
                </fieldset>
            </form>
        </div>

View Code

(2)修改webdesign.css文件

label{
    display: block;
}

fieldset{
    border: 0;
}
.contact_sub{
    width: 100px;
    height:30px;
}

View Code

(3)创建contact.js文件

 

/*******兼容不同浏览器  点击文本即可使与之相关的表单输入获得焦点*****/
function focusLabels(){
    //旧浏览器  对象检测
    if(!document.getElementsByTagName) return false;

    //获取元素
    var labels = document.getElementsByTagName("label");

    //给有for属性的label添加focus()函数
    for(var i=0; i<labels.length; i++){             //for循环判断
        if(!labels[i].getAttribute("for")) continue;
        labels[i].onclick = function(){
            var id= this.getAttribute("for");                 //获取到label中for的值
            if(!document.getElementById(id)) return false;    //再判断是否存在跟for的值一样的id值    有则添加focus()方法
            var element = document.getElementById(id);
            element.focus();
        }
    }
}
addLoadEvent(focusLabels);

/*****************删除表单默认值*************************/
function resetFields(whichform){
    for(var i=0; i<whichform.elements.length; i++){
        var element = whichform.elements[i];          //获取每个表单元素
        if(element.type == "submit") continue;         //如果是表单元素类型是submit,则退出本次循环
        if(!element.defaultValue) continue;           //如果不是表单元素的默认值,也退出本次循环
        element.onfocus = function(){
            if(this.value == this.defaultValue){
                this.value = "";
            }
        }
        element.onblur = function(){
            if(this.value == ""){
                this.value = this.defaultValue;
            }
        }
    }
}

/*************找到每个表单元素whichform*****************/
function prepareForms(){
    for(var i=0; i<document.forms.length; i++){
        var thisform = document.forms[i];
        resetFields(thisform);

        thisform.onsubmit = function(){
            return validateForm(this);
        }
    }
}
addLoadEvent(prepareForms);

/**********表单数据合法性检验  是否已填isFillEd(field)******/
function isFilled(field){
    if(field.value.length < 1 || field.value == field.defaultValue){
        return false;
    }else{
        return true;
    }
}

/***********邮箱格式是否正确****************************/
function isMail(field){
    if(field.value.indexOf("@") == -1 || field.value.indexOf(".") == -1){
        return false;
    }else{
        return true;
    }
}

/***********整合检验表单合法性**************************/
function validateForm(whichform){               //如果表单含有required的className属性值,则调用isFilled
    for(var i=0; i<whichform.elements.length;i++){
        var element = whichform.elements[i];
        if(element.className.indexOf("required") != -1){
            if(!isFilled(element)){
                alert("请填写"+element.name);
                return false;
            }
        }
        if(element.className.indexOf("email") != -1){
            if(!isMail(element)){
                alert("请填写正确的邮箱地址");
                return false;
            }
        }
    }
    return true;
}

View Code

 

最后,在contact.html页面,加载contact.js文件。

ok了,可以打开谷歌浏览器验证一番。现在在表单必填字段没填写,邮箱地址写错 ,会出现一个对话框。  

二、学与思

1、默认值 

联系表单里都会有一些默认的“占位符”文本,W3C是这样说的:“如果你无法断定用户端的软件或代理能够对空白的控件做出正确的处理,就一定要在编辑框或文本输入区域里给出一些默认的、占位符性质的字符。【优先级3】”。

默认值美中不足之处就是当准备输入时要手动清除,麻烦。所以写了个小函数,当if判断是默认值时,则把表单字段赋值为空。

2、Form对象

获取到的是input、textarea等

和childNodes.length不一样。form.elements.length只对掉单元素进行统计。

3、数据合法性检验

把判断必填字段和邮箱格式的判断函数写在不同的函数里,然后在一个整合函数中根据表单字段id值不同再进行具体调用。显得更加方便,这样就不用在每个表单字段里面添加这样一个判断函数,我们需要做的就是获取到表单的className属性值,给一个if判断,是required的是就调用isFilled(),如果是email就调用isMail()。最后在用户提交数据时,调用这个整合函数即可。

 

 完整代码:http://pan.baidu.com/s/1mgr39US

 

时间: 2024-08-03 12:36:56

JavaScript网站设计实践(七)编写最后一个页面 改进表单的相关文章

JavaScript网站设计实践(五)编写photos.html页面,实现点击缩略图显示大图的效果

原文:JavaScript网站设计实践(五)编写photos.html页面,实现点击缩略图显示大图的效果 一.photos.html页面,点击每一张缩略图,就在占位符的位置那里,显示对应的大图. 看到的页面效果是这样的:   1.实现思路 这个功能在之前的JavaScript美术馆那里已经实现了. 首先在页面中使用ul列表显示出所有的缩略图,然后使用JavaScript,for循环检查出当前点击的是哪一张图片,最后把这张图片给显示出来. 用到三个函数:显示图片函数.创建占位符预装图片.点击显示图

JavaScript网站设计实践(四)编写about.html页面,利用JavaScript和DOM,选择性的显示和隐藏DIV元素

原文:JavaScript网站设计实践(四)编写about.html页面,利用JavaScript和DOM,选择性的显示和隐藏DIV元素 一.现在我们在网站设计(三)的基础上,来编写about.html页面. 这个页面要用到的知识点是利用JavaScript和DOM实现选择性地显示和隐藏某些DIV about.html页面在前面我们为了看导航栏菜单项高亮显示时,已经写了部分内容,只是那时写的代码没有实现div显示和隐藏,现在就在之前编写的基础上,为页面添加显示和隐藏div的效果. 没有写Java

JavaScript网站设计实践(六)编写live.html页面 改进表格显示

原文:JavaScript网站设计实践(六)编写live.html页面 改进表格显示 一.编写live.html页面,1.JavaScript实现表格的隔行换色,并且当鼠标移过时当前行高亮显示:2.是输出表格中的abbr标签的内容 实现后的效果图是这样的: 1.实现思路 在输出表格的时候,给出一个判断,如果偶数或是奇数行我们想换色,则添加一个class为odd的值,在这个class里就设置了表格不同颜色tr行. 这里用到了一个判断函数:(下面是两个不同的方法,任选其一) 法一://隔行换色 添加

JavaScript网站设计实践(二)实现导航栏当前所选页面的菜单项高亮显示

原文:JavaScript网站设计实践(二)实现导航栏当前所选页面的菜单项高亮显示 一.(一)中的代码还可以修改的地方. 在(一)中,如果是运行在服务器下,如apache等,可以把head和navigation的div抽取出来,放置在另一个html文件里,然后在页面中,include进来.这样,当要对导航栏进行修改时,只需要修改一个文件,而不用修改所有相关的页面文件.不过,我这里没有这样做,没有抽取出来. 二.实现当前页面的标识+不同页面的head头部背景图片的改变 现在在(一)实现的基础之上,

JavaScript网站设计实践(三)设计有特色的主页,给主页链接添加JavaScript动画脚本

原文:JavaScript网站设计实践(三)设计有特色的主页,给主页链接添加JavaScript动画脚本 一.主页一般都会比较有特色,现在在网站设计(二)实现的基础上,来给主页添加一点动画效果. 1.这里实现的动画效果是:当鼠标悬停在其中某个超链接时,会显示出属于该页面的背景缩略图,让用户知道这个链接的页面大概内容是什么. 效果图: 2.实现这个效果的思路 (1)把主页的几个链接的背景图片缩放到150px*150px,拼成一张750*150的图片,并保存为slideshow.png,存放到ima

JavaScript网站设计实践(一)网站结构以及页面效果设计

原文:JavaScript网站设计实践(一)网站结构以及页面效果设计 这是JavaScript DOM编程艺术里的构建JavaScript网站设计的例子,这本书给我学习JavaScript带来许多启发,在这个乐队宣传网站中,把前面学到的知识点整合在这个项目了.在这里记录下实现这个乐队的宣传网站的具体过程,加深理解.好,从现在开始来实现这个JavaScript网站实战. 一.网页的结构 由三个部分组成:头部.导航.内容 效果图是这样的(勉强看,有点不美观.哈哈): 二.网站的的结构 这是我的项目目

网站设计:让用户更高效地完成表单填写

填写互联网表单几乎是每个用户每天的经历,如用户进行网站注册和登录.购物等,都需要填写各种表单.用户为了获得想要的东西,表单成了用户完成需求和网站系统需要数据之间的互动形式.那么表单设计的首要目标也更清晰:让用户迅速高效快捷并且轻松地完成填写. 设计目标已清晰,那么如何设计表单呢,以下从表单的内容.组织方式.流程.表单元素控件及交互等方面详细阐述. 表单的元素 研究如何提高表格可用性之前,我们先简要了解下一般表单的元素,这里我们暂且这么总结: 标签:告诉用户表单问题是什么? 输入框:供给用户填写答

传值-ASP.NET网站中,如何点击一个页面的按钮,在另一个页面中得到提醒

问题描述 ASP.NET网站中,如何点击一个页面的按钮,在另一个页面中得到提醒 我想要实现这样一个功能: 在我点击提交材料页面的提交按钮(ASP:BUTTON)时,后台管理页面(也就是另外一个b.aspx而已,只是目前两个页面没有关系)得到一个提醒诸如:Page.ClientScript.RegisterStartupScript(GetType(), "", "alert('submit!');");这样子的提醒.不一定要用alert,可以跳出一个框也行. 可是现

写一个iOS复杂表单的正确姿势

前言 这几天项目的新需求中有个复杂的表单界面,在做的过程中发现要比想象中复杂很多,有好多问题需要处理.有很多东西值得写下来好好梳理下. 需求分析: 6创建网店1.png 上图便是UI根据需求给的高保真, 我们先根据这张图片来描述一下具体需求,明确一下我们都需要干些什么. 创建网店这个界面是一个复杂的表单,有"网店名称"."网店主标签"."网店简介"."网店地址"."网店座机"."email&quo