JavaScript--表单脚本

一万字的内心戏就省略了,反正我又开始复习了,之前整理过的也不定时再更新一下,嗯,就酱。

首先,我们需要一个跨浏览器的事件对象,以便我们可以兼容,全文都会用到这个事件对象

var EventUtil = {
        addHandler: function(element, type, handler){
//省略的代码 },
        getEvent: function(event){
            return event ? event : window.event;
},
        getTarget: function(event){
            return event.target || event.srcElement;
},
        preventDefault: function(event){
            if (event.preventDefault){
                event.preventDefault();
            } else {
                event.returnValue = false;
            }
},
        removeHandler: function(element, type, handler){
//省略的代码
 },
        stopPropagation: function(event){
        if (event.stopPropagation){
            event.stopPropagation();
        } else {
            event.cancelBubble = true;
  } 
}
};

一、表单

1.1 表单的基础知识

acceptCharset: 服务器能够处理的字符集;等价于 HTML 中的 accept-charset 特性
action: 接受请求的 URL;等价于 HTML 中的 action 特性。
elements: 表单中所有控件的集合(HTMLCollection)。
enctype: 请求的编码类型;等价于 HTML 中的 enctype 特性。
length: 表单中控件的数量。
method: 要发送的 HTTP 请求类型,通常是"get"或"post";等价于 HTML 的 method 特性。
name: 表单的名称;等价于 HTML 的 name 特性。
reset(): 将所有表单域重置为默认值。
submit(): 提交表单。
target: 用于发送请求和接收响应的窗口名称;等价于 HTML 的 target 特性。

获取表单元素的方式
1、var form = document.getElementById("form1");// 通过id查找
2、var firstForm = document.forms[0]; //取得页面中的第一个表单
3、var myForm = document.forms["form2"]; //取得页面中名称为"form2"的表单

1.2提交表单

使用<input>或<button>都可以定义提交按钮, 只要将其 type 特性的值设置为"submit"即可

<!-- 通用提交按钮 -->
<input type="submit" value="Submit Form">
<!-- 自定义提交按钮 -->
<button type="submit">Submit Form</button>

种方式提交表单时,浏览器会在将请求发送给服务器之前触发 submit 事件。这样,我们就有 机会验证表单数据,并据以决定是否允许表单提交。阻止这个事件的默认行为就可以取消表单提交。例 如,下列代码会阻止表单提交

var form = document.getElementById("myForm");
EventUtil.addHandler(form, "submit", function(event){
     event = EventUtil.getEvent(event);
//阻止默认事件
    EventUtil.preventDefault(event);
});

提交表单时可能出现的最大问题,就是重复提交表单,解决这一问题 的办法有两个:在第一次提交表单后就禁用提交按钮,或者利用 onsubmit 事件处理程序取消后续的 表单提交操作。

1.3 重置表单

在用户单击重置按钮时,表单会被重置。使用 type 特性值为"reset"的<input>或<button>都
可以创建重置按钮

<!-- 通用重置按钮 -->
<input type="reset" value="Reset Form">
<!-- 自定义重置按钮 -->
<button type="reset">Reset Form</button>

用户单击重置按钮重置表单时,会触发 reset 事件。利用这个机会,我们可以在必要时取消重置 操作。例如,下面展示了阻止重置表单的代码。

 var form = document.getElementById("myForm");
    EventUtil.addHandler(form, "reset", function(event){
//取得事件对象
event = EventUtil.getEvent(event);
//阻止表单重置
        EventUtil.preventDefault(event);
    });
与提交表单一样,也可以通过 JavaScript 来重置表单,如下面的例子所示。 var form = document.getElementById("myForm");
//重置表单 form.reset();
与调用 submit()方法不同,调用 reset()方法会像单击重置按钮一样触发 reset 事件。

1.3 表单字段

每个表单都有elements 属性,该属性是表单中所有表单元素(字段)的集合。

var form = document.getElementById("form1");
//取得表单中的第一个字段
var field1 = form.elements[0];
//取得名为"textbox1"的字段
var field2 = form.elements["textbox1"];
//取得表单中包含的字段的数量
var fieldCount = form.elements.length;

共有的表单字段属性
除了<fieldset>元素之外,所有表单字段都拥有相同的一组属性。

disabled:布尔值,表示当前字段是否被禁用。
form:指向当前字段所属表单的指针;只读。
name:当前字段的名称。
readOnly:布尔值,表示当前字段是否只读。
tabIndex:表示当前字段的切换(tab)序号。
type:当前字段的类型,如"checkbox"、"radio",等等。
value:当前字段将被提交给服务器的值。对文件字段来说,这个属性是只读的,包含着文件
在计算机中的路径。

//避免多次提交表单
EventUtil.addHandler(form, "submit", function(event){
    event = EventUtil.getEvent(event);
    var target = EventUtil.getTarget(event);
//取得提交按钮
var btn = target.elements["submit-btn"];
//禁用它
    btn.disabled = true;
});

以上代码为表单的 submit 事件添加了一个事件处理程序。事件触发后,代码取得了提交按钮 并将其 disabled 属性设置为 true。注意,不能通过 onclick 事件处理程序来实现这个功能,原 因是不同浏览器之间存在“时差”:有的浏览器会在触发表单的 submit 事件之前触发 click 事件, 而有的浏览器则相反。对于先触发 click 事件的浏览器,意味着会在提交发生之前禁用按钮,结果 永远都不会提交表单。因此,最好是通过 submit 事件来禁用提交按钮。不过,这种方式不适合表 单中不包含提交按钮的情况;如前所述,只有在包含提交按钮的情况下,才有可能触发表单的 submit 事件。

共有的表单字段事件
除了支持鼠标、键盘、更改和 HTML 事件之外,所有表单字段都支持下列 3 个事件。
blur:当前字段失去焦点时触发。
change:对于<input>和<textarea>元素,在它们失去焦点且 value 值改变时触发;对于
<select>元素,在其选项改变时触发。
focus:当前字段获得焦点时触发。
当用户改变了当前字段的焦点,或者我们调用了 blur()或 focus()方法时,都可以触发 blur 和 focus 事件。这两个事件在所有表单字段中都是相同的。但是,change 事件在不同表单控件中触发的 次数会有所不同。对于<input>和<textarea>元素,当它们从获得焦点到失去焦点且 value 值改变时, 才会触发 change 事件。对于<select>元素,只要用户选择了不同的选项,就会触发 change 事件; 换句话说,不失去焦点也会触发 change 事件。

例如,假设有一个文本框,我们只允许用户输入数值。此时,可以利用 focus 事件修改文本框的背景颜色,以便更清楚地表明这个字段获得了焦点。可以利用 blur 事件恢复 文本框的背景颜色,利用 change 事件在用户输入了非数值字符时再次修改背景颜色。下面就给出了实 现上述功能的代码

var textbox = document.forms[0].elements[0];

EventUtil.addHandler(textbox, "focus", function(event){
        event = EventUtil.getEvent(event);

  var target = EventUtil.getTarget(event);
    if (target.style.backgroundColor != "red"){
        target.style.backgroundColor = "yellow";
} 
});
EventUtil.addHandler(textbox, "blur", function(event){
    event = EventUtil.getEvent(event);
    var target = EventUtil.getTarget(event);
    if (/[^\d]/.test(target.value)){
        target.style.backgroundColor = "red";
    } else {
        target.style.backgroundColor = "";
} 
});
EventUtil.addHandler(textbox, "change", function(event){
    event = EventUtil.getEvent(event);
    var target = EventUtil.getTarget(event);
    if (/[^\d]/.test(target.value)){
        target.style.backgroundColor = "red";
           } else {
        target.style.backgroundColor
} 
});

文本框脚本
在 HTML 中,有两种方式来表现文本框:一种是使用<input>元素的单行文本框,另一种是使用 <textarea>的多行文本框。这两个控件非常相似,而且多数时候的行为也差不多。不过,它们之间仍 然存在一些重要的区别。

<input>元素的 type 特性设置为"text"
size:可以指 定文本框中能够显示的字符数
value:可以设置文本框的初始值
maxlength:特性则用 于指定文本框可以接受的最大字符数
<input type="text" size="25" maxlength="50" value="initial value">

多行文本textarea
rows:指定的是文本框的字符行数
cols:指定的是文本框的字符列数
<textarea rows="25" cols="5">initial value</textarea>

选择文本

  1. 选择(select)事件
var textbox = document.forms[0].elements["textbox1"];
    EventUtil.addHandler(textbox, "select", function(event){
        var alert("Text selected" + textbox.value);
    });
  1. 取得选择的文本
function getSelectedText(textbox){
   return textbox.value;
  }
  1. 选择部分文本
textbox.value = "Hello world!"
//选择所有文本
textbox.setSelectionRange(0, textbox.value.length); //"Hello world!"
//选择前 3 个字符 textbox.setSelectionRange(0, 3); //"Hel"
//选择第4到第6个字符 textbox.setSelectionRange(4, 7); //"o w"

过滤输入

  1. 屏蔽字符
    例如,下列代码只允许 用户输入数值。
EventUtil.addHandler(textbox, "keypress", function(event){ 12 event = EventUtil.getEvent(event);
var target = EventUtil.getTarget(event);
var charCode = EventUtil.getCharCode(event);
        if (!/\d/.test(String.fromCharCode(charCode))){
    EventUtil.preventDefault(event);
  }
});

二、HTML5 约束验证API

为了在将表单提交到服务器之前验证数据,HTML5 新增了一些功能。有了这些功能,即便 JavaScript 被禁用或者由于种种原因未能加载,也可以确保基本的验证

1、required:必填字段
2、type:其他输入类型

<input type="email" name ="email">
<input type="url" name="homepage">

3.、数值范围
"number"、"range"、"datetime"、"datetime-local"、"date"、"month"、"week", 14 还有"time"
浏览器对这几个类型的支持情况并不好,因此如果真想选用的话,要特别小心。
<input type="number" min="0" max="100" step="5" name="count">
4、 输入模式
pattern属性。这个属性的值是一个正则表达式,用于匹配文本框中的 值。
<input type="text" pattern="\d+" name="count">
4、 禁用验证
通过设置 novalidate 属性,可以告诉表单不进行验证。

<form method="post" action="signup.php" novalidate> <!--这里插入表单元素-->
</form>

饿了,吃饭,先酱

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  •   JavaScript 最初的一个应用,就是分担服务器处理表单的责任,打破处处依赖服务器的局面。   尽管目前的...
    霜天晓阅读 621评论 0 3
  • 一、表单的基础知识 1、表单提交 普通提交 以编程方式调用submit()方法提交表单 解决表单重复提交的办法:1...
    Tom36阅读 501评论 0 0
  • 表单基础知识 在HTML中,表单是由 元素来表示的,而在JS中,表单对应的则是HTMLFormElement类型。...
    oWSQo阅读 889评论 0 1
  • 一、表单基础知识 在 JavaScript 中,表单对应的是 HTMLFormElement 类型。 HTMLFo...
    LemonnYan阅读 908评论 0 3
  • 第14章 表单脚本 1. 表单的基础指示 在 JavaScript 中,表单对应的则是 HTMLFormEleme...
    yinxmm阅读 268评论 0 1