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 相关文章推荐
excel操作之Add Data to a Spreadsheet Cell
Jun 12 Javascript
解决node-webkit 不支持html5播放mp4视频的方法
Mar 11 Javascript
JS响应鼠标点击实现两个滑块区间拖动效果
Oct 26 Javascript
Vue+ElementUI实现表单动态渲染、可视化配置的方法
Mar 07 Javascript
JavaScript使用math.js进行精确计算操作示例
Jun 19 Javascript
微信公众号H5支付接口调用方法
Jan 10 Javascript
bootstrap+spring boot实现面包屑导航功能(前端代码)
Oct 09 Javascript
使用vscode快速建立vue模板过程详解
Oct 10 Javascript
vue-cli3 取消eslint校验代码的解决办法
Jan 16 Javascript
vue 百度地图(vue-baidu-map)绘制方向箭头折线实例代码详解
Apr 28 Javascript
vue 清空input标签 中file的值操作
Jul 21 Javascript
详解阿里Node.js技术文档之process模块学习指南
Jan 04 Javascript
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设计模式之单例模式定义与用法分析
2019/03/26 PHP
jquery png 透明解决方案(推荐)
2010/08/21 Javascript
JavaScript修改浏览器tab标题小技巧
2015/01/06 Javascript
基于JavaScript实现根据手机定位获取当前具体位置(X省X市X县X街道X号)
2015/12/29 Javascript
轻松实现Bootstrap图片轮播
2020/04/20 Javascript
Bootstrap编写一个兼容主流浏览器的受众巨幕式风格页面
2016/07/01 Javascript
深入理解vue.js双向绑定的实现原理
2016/12/05 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
JavaScript实现打地鼠小游戏
2020/04/23 Javascript
node.js支持多用户web终端实现及安全方案
2017/11/29 Javascript
vue小白入门教程
2018/04/02 Javascript
js实现转动骰子模型
2019/10/24 Javascript
在Linux下调试Python代码的各种方法
2015/04/17 Python
python中日志logging模块的性能及多进程详解
2017/07/18 Python
python微信跳一跳系列之棋子定位颜色识别
2018/02/26 Python
使用50行Python代码从零开始实现一个AI平衡小游戏
2018/11/21 Python
python在新的图片窗口显示图片(图像)的方法
2019/07/11 Python
python中单下划线(_)和双下划线(__)的特殊用法
2019/08/29 Python
关于Python解包知识点总结
2020/05/05 Python
Python爬虫爬取博客实现可视化过程解析
2020/06/29 Python
解析HTML5中的新功能本地存储localStorage
2016/03/01 HTML / CSS
孤独星球出版物:Lonely Planet Publications
2018/03/17 全球购物
美国购买当代和现代家具网站:MODTEMPO
2018/07/20 全球购物
业务经理岗位职责
2013/11/11 职场文书
餐饮主管岗位职责
2013/12/10 职场文书
网上书店创业计划书
2014/01/12 职场文书
铲车司机岗位职责
2014/03/15 职场文书
《少年王勃》教学反思
2014/04/27 职场文书
大一新生期末自我评价
2014/09/12 职场文书
个人收入证明模板
2014/09/18 职场文书
2014年质检工作总结
2014/11/26 职场文书
2014年销售工作总结范文
2014/12/01 职场文书
社区元宵节活动总结
2015/02/06 职场文书
2015中学教学工作总结
2015/07/22 职场文书
信息技术研修心得体会
2016/01/08 职场文书
导游词之西湖雷峰塔
2019/09/18 职场文书