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

简介: 原文:JavaScript网站设计实践(七)编写最后一个页面 改进表单一、最后一个页面 contact.html。改进表单 在该页面实现的功能: 几乎所有的网站都会有表单填写,对于用户输入和填写的数据,首先我们一般现在前台验证,然后再去后台验证。
原文: 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

 

目录
相关文章
|
5月前
|
前端开发 算法 API
构建高性能图像处理Web应用:Next.js与TailwindCSS实践
本文分享了构建在线图像黑白转换工具的技术实践,涵盖技术栈选择、架构设计与性能优化。项目采用Next.js提供优秀的SSR性能和SEO支持,TailwindCSS加速UI开发,WebAssembly实现高性能图像处理算法。通过渐进式处理、WebWorker隔离及内存管理等策略,解决大图像处理性能瓶颈,并确保跨浏览器兼容性和移动设备优化。实际应用案例展示了其即时处理、高质量输出和客户端隐私保护等特点。未来计划引入WebGPU加速、AI增强等功能,进一步提升用户体验。此技术栈为Web图像处理应用提供了高效可行的解决方案。
|
1月前
|
编解码 前端开发 JavaScript
js react antd 实现页面低分变率和高分变率下字体大小自适用,主要是配置antd
在React中结合Ant Design与媒体查询,通过less变量和响应式断点动态调整`@font-size-base`,实现多分辨率下字体自适应,提升跨设备体验。
65 2
|
6月前
|
前端开发 JavaScript Java
【Java进阶】JavaScript电灯开关实例:从理论到实践
这个例子展示了JavaScript的基本功能,包括操作HTML元素,监听事件,以及改变元素的样式。通过学习和理解这个例子,你可以了解到JavaScript在网页中的应用,以及如何使用JavaScript来创建交互式的网页。
117 13
|
5月前
|
人工智能 监控 前端开发
基于 Next.js 的书法字体生成工具架构设计与 SSR 优化实践
本项目是一款书法字体生成工具,采用 Next.js 14(App Router)与 Tailwind CSS 构建前端,阿里云 Serverless 部署后端。通过混合渲染策略(SSG/SSR/CSR)、Web Worker 异步计算及 CDN 字体分片加载优化性能。服务端借助阿里云函数计算处理计算密集型任务,将平均耗时从 1200ms 降至 280ms,支持 1000+ QPS。动态路由与 ARMS 监控提升工程化水平,未来计划引入 WebGPU 和 AI 字体风格迁移技术,进一步优化用户体验。
|
8月前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
292 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
9月前
|
人工智能 程序员 UED
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
405 21
【01】完成新年倒计时页面-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
8月前
|
前端开发
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
232 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
|
9月前
|
前端开发 JavaScript
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
242 14
【02】v1.0.1更新增加倒计时完成后的放烟花页面-优化播放器-优化结构目录-蛇年新年快乐倒计时领取礼物放烟花html代码优雅草科技央千澈写采用html5+div+CSS+JavaScript-优雅草卓伊凡-做一条关于新年的代码分享给你们-为了C站的分拼一下子
|
7月前
|
JavaScript 前端开发 API
纯js轻量级页面顶部Loading进度条插件
纯js轻量级页面顶部Loading进度条插件
|
7月前
|
缓存 自然语言处理 JavaScript
JavaScript中闭包详解+举例,闭包的各种实践场景:高级技巧与实用指南
闭包是JavaScript中不可或缺的部分,它不仅可以增强代码的可维护性,还能在模块化、回调处理等场景中发挥巨大作用。然而,闭包的强大也意味着需要谨慎使用,避免潜在的性能问题和内存泄漏。通过对闭包原理的深入理解以及在实际项目中的灵活应用,你将能够更加高效地编写出简洁且功能强大的代码。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

热门文章

最新文章