JavaScript DOM学习第八章 表单错误提示


Posted in Javascript onFebruary 19, 2010

在我看来,警告框只用在浏览器不支持其他显示错误信息的办法的时候。W3C建议我们在表单项的附近显示错误信息。这是一种很好的办法,所以我们只在浏览器不支持这种高级的办法的时候才使用警告对话框。
例子
试试下面的例子。每一项都是必须的。另外我会坚持email项是否有@符号。如果没有也会提示错误信息。

var W3CDOM = (document.getElementsByTagName && document.createElement); window.onload = function () { 
    document.forms[0].onsubmit = function () { 
        return validate() 
    } 
} 
function validate() { 
    validForm = true; 
    firstError = null; 
    errorstring = ''; 
    var x = document.forms[0].elements; 
    for (var i=0;i<x.length;i++) { 
        if (!x[i].value) 
            writeError(x[i],'This field is required'); 
    } 
    if (x['email'].value.indexOf('@') == -1) 
        writeError(x['email'],'This is not a valid email address'); 
    if (!W3CDOM) 
        alert(errorstring); 
    if (firstError) 
        firstError.focus(); 
    if (validForm) 
        alert('All data is valid!'); 
    return false; 
} 
function writeError(obj,message) { 
    validForm = false; 
    if (obj.hasError) return; 
    if (W3CDOM) { 
        obj.className += ' error'; 
        obj.onchange = removeError; 
        var sp = document.createElement('span'); 
        sp.className = 'error'; 
        sp.appendChild(document.createTextNode(message)); 
        obj.parentNode.appendChild(sp); 
        obj.hasError = sp; 
    } 
    else { 
        errorstring += obj.name + ': ' + message + '\n'; 
        obj.hasError = true; 
    } 
    if (!firstError) 
        firstError = obj; 
} 
function removeError() 
{ 
    this.className = this.className.substring(0,this.className.lastIndexOf(' ')); 
    this.parentNode.removeChild(this.hasError); 
    this.hasError = null; 
    this.onchange = null; 
}

解释
首先我们坚持是否支持W3C DOM。这个例子能够在mac上的IE工作,但是如果在其他页面上不能工作很正常。因为那个浏览器对W3C DOM的支持还不够,不能应对所有情况。

然后我们创建了onsubmit的事件处理程序,这个程序调用我们的验证函数validation()。

var W3CDOM = (document.getElementsByTagName && document.createElement); window.onload = function () { 
    document.forms[0].onsubmit = function ()    { 
        return validate() 
    } 
}

validate()
我们假设表单是验证通过了的(validForm=true),我们设置firstError=null。最终我们会给第一个错误元素一个焦点。然后创建一个字符串:errorstring,这个包含所有的错误信息。这个只针对W3C DOM浏览器。
var x = document.forms[0].elements; 
for (var i=0;i<x.length;i++) { 
    if (!x[i].value) 
        writeError(x[i],'This field is required'); 
} 
if (x['email'].value.indexOf('@') == -1) 
    writeError(x['email'],'This is not a valid email address');

这个vlidate()函数的核心和平常的一样。按照你想的任何顺序检查错误。当你发现了一个错误,调用writeError()然后传递给他错误的表单项和错误信息。

如果浏览器不支持W3C DOM,那就用errorString生成一个警告框。你或许想修改一下警告框的内容。

if (!W3CDOM) 
alert(errorstring);

为了给用户方便,把焦点设置在第一个错误的元素上。

最后返回validaForm,如果还是true就提交表单,如果不是就停止提交。

writeError()
这个函数用来把错误信息输出到表单项上。如果失败,说明浏览器不支持W3C DOM,然后就把错误信息发送到errorstring。
这个函数会传递一个表单项和一条错误信息。

function writeError(obj,message) 
{

首先我们设置validForm为false:这个表单填写不正确,不应该被提交。
validForm = false; 
}

然后检测表单项是否已经有了一个错误提示。如果有了,就返回到validation()函数,我可不想再同一项后面有两个错误提示。

    if (obj.hasError) return;检查浏览器是否支持W3C DOM:

obj.className += ' error';

接着给错误表单项设置一个onchange的事件处理程序:
obj.onchange = removeError;

创建一个<span>来装在错误信息,并且设置它的类为"error"。在CSS里面设置要呈现的样式。
var sp = document.createElement('span'); 
sp.className = 'error';

给<span>添加一个错误信息的文本节点。
sp.appendChild(document.createTextNode(message));

然后把这个<span>添加到相应的表单项后买(在这个例子中,每个表单项都有一个<p>标签)。
obj.parentNode.appendChild(sp);

最终,给这个表单设置hasError属性。这个属性既可以用来说明有错误的表单项也可以方便将来移除错误信息。
obj.hasError = sp; 2 } 
对于不支持的浏览器,我们把表单项目的名称和错误信息保存在errorstring里面。这个字符串会在最后弹出。也给他设置hasError属性。 [code] else { 
errorstring += obj.name + ': ' + message + '\n'; 
obj.hasError = true; 
}

如果这时候validForm的值还是true那么将firstError设置为现在的元素。以便于将来设置焦点。
if (validForm) 
firstError = obj; 
removeError()

每一个错误表单项的onchange的事件处理程序都指向这个函数。如果用户修改了相应的表单项,我们礼貌的假设错误已经修正了。因此错误信息应该消失。

首先移除表单项的类中的error项。这个用来移除特别的错误样式。

function removeError() { 
this.className = this.className.substring(0,this.className.lastIndexOf(' '));

然后移除错误信息。hasError属性指向包含该信息的<span>,所以我们从表单项的父元素移除它。
this.parentNode.removeChild(this.hasError); 
最后再做一些清理。设置hasError属性为null,然后移除onchange的事件处理程序。 [code]this.hasError = null; 
this.onchange = null; 
}

翻译地址:http://www.quirksmode.org/dom/error.html

转载请保留以下信息
作者:北玉(tw:@rehawk)

Javascript 相关文章推荐
颜色选择器 Color Picker,IE,Firefox,Opera,Safar
Nov 25 Javascript
jquery分页对象使用示例
Apr 01 Javascript
JS获取Table中td值的方法
Mar 19 Javascript
jquery判断复选框是否被选中的方法
Oct 16 Javascript
jQuery.trim() 函数及trim()用法详解
Oct 26 Javascript
JavaScript中全选、全不选、反选、无刷新删除、批量删除、即点即改入库(在yii框架中操作)的代码分享
Nov 01 Javascript
微信小程序 视图容器组件的详解及实例代码
Jan 19 Javascript
Vue基于NUXT的SSR详解
Oct 24 Javascript
解决Layui数据表格显示无数据提示的问题
Nov 14 Javascript
vue+vant实现商品列表批量倒计时功能
Jan 13 Javascript
JavaScript队列结构Queue实现过程解析
Mar 07 Javascript
Vue仿Bibibili首页的问题
Jan 21 Vue.js
JavaScript DOM 学习第七章 表单的扩展
Feb 19 #Javascript
JavaScript DOM学习第六章 表单实例
Feb 19 #Javascript
JavaScript DOM 学习第五章 表单简介
Feb 19 #Javascript
JavaScript DOM学习第四章 getElementByTagNames
Feb 19 #Javascript
JavaScript DOM 学习第三章 内容表格
Feb 19 #Javascript
JavaScript DOM 学习第二章 编辑文本
Feb 19 #Javascript
JavaScript DOM学习第一章 W3C DOM简介
Feb 19 #Javascript
You might like
php 修改、增加xml结点属性的实现代码
2013/10/22 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
php自定义函数实现二维数组排序功能
2016/07/20 PHP
javascript + jquery实现定时修改文章标题
2014/03/19 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
2014/04/08 Javascript
Node.js异步I/O学习笔记
2014/11/04 Javascript
Jquery插件实现点击获取验证码后60秒内禁止重新获取
2015/03/13 Javascript
自动完成的搜索框javascript实现
2016/02/26 Javascript
老生常谈javascript的类型转换
2016/10/12 Javascript
js html5 css俄罗斯方块游戏再现
2016/10/17 Javascript
bootstrap IE8 兼容性处理
2017/03/22 Javascript
jQuery实现QQ空间汉字转拼音功能示例
2017/07/10 jQuery
node.js利用socket.io实现多人在线匹配联机五子棋
2018/05/31 Javascript
bootstrapTable+ajax加载数据 refresh更新数据
2018/08/31 Javascript
vue项目首屏加载时间优化实战
2019/04/23 Javascript
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
[36:33]Ti4 循环赛第四日 附加赛NEWBEE vs Mouz
2014/07/13 DOTA
讲解Python中运算符使用时的优先级
2015/05/14 Python
Python 实现一个颜色色值转换的小工具
2016/12/06 Python
flask框架视图函数用法示例
2018/07/19 Python
python 文本单词提取和词频统计的实例
2018/12/22 Python
Appium Python自动化测试之环境搭建的步骤
2019/01/23 Python
python  logging日志打印过程解析
2019/10/22 Python
使用Keras训练好的.h5模型来测试一个实例
2020/07/06 Python
CSS3属性box-shadow使用指南
2014/12/09 HTML / CSS
美国最大的半成品净菜电商:Blue Apron(蓝围裙)
2018/04/27 全球购物
经典c++面试题五
2014/12/17 面试题
介绍一下SQL注入攻击的种类和防范手段
2012/02/18 面试题
结构和类有什么异同
2012/07/16 面试题
农村党支部书记四风问题个人对照检查材料
2014/09/21 职场文书
自习课吵闹检讨书范文
2014/09/26 职场文书
工程安全生产协议书
2014/11/21 职场文书
六年级小学生评语
2014/12/26 职场文书
2015年中学团委工作总结
2015/07/22 职场文书
Ajax实现异步加载数据
2021/11/17 Javascript
JavaScript最完整的深浅拷贝实现方式详解
2022/02/28 Javascript