A FORM

<form id='form' action='http://a-response-url' method="post">

    <!--maxlength 最大值  placeholder 占位符  autofocus 自动聚焦-->
<input type='text' name='name' size='20' maxlength='10' placeholder='initial' autofocus /><br />
<input type='text' name='phone' size='3' maxlength='3' />
<input type='text' name='phone' size='3' maxlength='3' />
<input type='text' name='phone' size='4' maxlength='4' /><br /> <!--旧版浏览器会自动设置type为text-->
<input type='email' name='email' required /><br />
<select name='fruit'>
<option value='a'>apple</option>
<option value='b' selected>banner</option>
<option value='c'>color fruit</option>
</select><br /> <textarea name='textbox' rows='5' cols='20' maxlength="50">textbox with maxlength</textarea><br />
<button type='reset' id="resetBtn">reset</button>
<button type='submit' id="subBtn">submit</button>
</form>

表单的elements属性

// 获取表单元素
var form = document.getElementById("form"); // 返回表单控件的个数
var eleNum = form.elements.length; // 返回控件中name="phone"的元素
var phone = form.elements["phone"];

自动聚焦的兼容

// autofocus
var autofocusEle = form.elements[0]; if (autofocusEle.autofocus !== true) {
autofocusEle.focus();
}

占位符的兼容

// placeholder for ie\10 with jquery
if (!("placeholder" in document.createElement("input"))) { // focus and blur
$("[placeholder]").on("focus", function () {
if ($(this).val() === $(this).attr("placeholder")) {
$(this).val("");
}
}).on("blur", function () {
if ($(this).val() === "") {
$(this).val($(this).attr("placeholder"));
$(this).css("color", "graytext")
}
}).blur(); // when submit dont send the placeholder value
$("[placeholder]").parent("form").submit(function () {
$(this).find("[placeholder]").each(function () {
if ($(this).val() === $(this).attr("placeholder")) {
$(this).val("");
}
});
});
}

表单的自动提交:

当form中处于focus状态时(textarea除外),并且form中有type="submit"的提交按钮;那么回车就会触发表单提交事件,如同单击提交按钮,进行表单提交。

表单提交的时候发生了什么?

1、成功控件

浏览器并不是将所有的表单控件全部发送到服务器的,而是会查找所有的【成功控件】,只将这些成功控件的数据发送到服务端。
        那么,什么是成功控件呢?简单说,成功控件就是:每个表单的控件都应该有一个name属性和【当前值】,在提交时,它们将以
        【name=value】的形式将数据提交到服务器端,也即【action】的地址。这个算法逻辑由浏览器自身来处理。
         对于一些特殊情况,成功控件还有以下规定:
        a.控件不能是禁用状态,即指定【disabled="disabled"】的控件不是成功控件。
        b.对于【checkbox】来说,只有被勾选的才算是成功控件。
        c.对于【radio button】来说,只有被勾选的才算是成功控件。
        d.对于【select】控件来说,只有被勾选的项才算是成功控件,name是select标签的属性。
        e.对于【file】上传文件控件来说,如果它包含了选择文件,那么它将是成功控件。

2、提交方式

如果是【post】,那么表单数据将放在请求体中被发送出去。

如果是【get】,那么表单数据将会追加到查询字符串中,以查询字符串的形式提交到服务端。

表单通常还是以post方式提交比较好,这样可以不破坏url,况且url还有长度限制及一些安全性问题。

3、数据编码

控件输入的内容并不是直接发送的,而是经过一种编码规则来处理的。目前基本上只会使用两种编码规则:application/x-www-form-urlencoded 和 multipart/form-data

这两个规则的使用场景简单说就是:后者在上传文件时使用,其他情形则默认使用前者。

使用地点:<form action="" method="" enctype="multipart/form-data">    =>上传文件

4、浏览器提交表单时的四个阶段

a.识别所有的成功控件

b.为所有的成功控件创建一个数据集合,它们包含【control-name/current-value】这样的键值对。

c.按照【form.enctype】指定的编码规则对前面准备好的数据进行编码。编码规则放在请求中,用content-type指出。

d.提交编码后的数据。

 注:表单的直接提交

// 此方式将直接触发表单的提交行为而不做任何验证
// 所以在表单验证后可直接触发此事件,直接提交表单
// (html 中不能出现id=submit的元素,否则会产生混乱!)
document.getElementById("form").submit();

关于AJAX提交表单

// ajax提交表单提供了更好的可控性,示例应用了jquery
$("#form").on("submit", function (e) { // 阻止浏览器的默认提交行为
e.preventDefault(); $.ajax({
type: "post",
url: $(this).attr("action"),
data: $(this).serialize(), // 模拟浏览器的成功控件刷选逻辑,搜罗键值对 (注意:name属性相同时会同时发送!这是checkbox的逻辑)
// "name=%EF%BF%A5dd&phone=aa&phone=bb&phone=cc&email=kui_002%40126.com&fruit=b&textbox=textbox+with+maxlen%0D%0Agth"
error: function () {},
success: function (res) {}
})
});

JavaScript高级程序设计之表单基础的更多相关文章

  1. 《JAVASCRIPT高级程序设计》表单基础知识和文本框脚本

    在HTML中,表单是由<form>元素来表示,在javascript中,表单对应的是HTMLFormElement类型,它具有一些独有的属性和方法: 一.表单基础知识 1.取得表单的方式 ...

  2. 读书时间《JavaScript高级程序设计》一:基础篇

    第一次看了<JavaScript高级程序设计>第二版,那时见到手上的书,第一感觉真是好厚的一本书啊.现在再次回顾一下,看的是<JavaScript高级程序设计>第三版,并记录一 ...

  3. js高级程序设计 笔记 --- 表单

    一,基础知识 在html中,表单是form元素,而在js中,表单对应的是HTMLFormElement类型,继承自HTMLElement,其独特的属性和方法有(常见): action:接收请求的URL ...

  4. Javascript高级编程学习笔记(73)—— 表单(1)表单基础

    表单 JS最初的一个用途就是帮助服务器分担处理表单的责任 时至今日,虽然web应用以及JS都有了长足的发展,但是表单依然是现在web应用中比较重要的部分. 因为默认的表单控件很丑,所以有时候我们会使用 ...

  5. 读书笔记(06) - 语法基础 - JavaScript高级程序设计

    写在开头 本篇是小红书笔记的第六篇,也许你会奇怪第六篇笔记才写语法基础,笔者是不是穿越了. 答案当然是没有,笔者在此分享自己的阅读心得,不少人翻书都是从头开始,结果永远就只在前几章. 对此,笔者换了随 ...

  6. 《JavaScript高级程序设计》读书笔记--前言

    起因 web编程过程使用javascript时感觉很吃力,效率很低.根本原因在于对javascript整个知识体系不熟,看来需要找些书脑补一下,同时欢迎众网友监督. 大神推荐书籍 看了博客大神们推荐的 ...

  7. 《JavaScript高级程序设计》学习笔记12篇

    写在前面: 这12篇博文不是给人看的,而是用来查的,忘记了什么基础知识,点开页面Ctrl + F关键字就好了 P.S.如果在对应分类里没有找到,麻烦告诉我,以便尽快添上.当然,我也会时不时地添点遗漏的 ...

  8. javascript 高级程序设计 一

    前言: 作为一个即将毕业.正在实习的大学生,我也默默的进入了开发者的行列.从一开始的c#编码狗到java程序员再到现在的JS开发者,我一直 希望自己可以在这个'万恶'的互联网时代走的更远.但是我还是一 ...

  9. JavaScript高级程序设计第三版.CHM【带实例】

    从驱动全球商业.贸易及管理领域不计其数的复杂应用程序的角度来看,说 JavaScript 已经成为当今世界上最流行的编程语言一点儿都不为过. JavaScript 是一种非常松散的面向对象语言,也是 ...

随机推荐

  1. IE SEESION共享的问题

    前几天,我们在开发工作流的过程中出现了一个比较奇怪的问题,原本看不到流程的人员,在登陆后却能够看到对应流程的待办任务,并且导致流程流向混乱!在调模式下调试程序发现(假设登陆两个用户)第二个登陆用户的信 ...

  2. 洛谷P1207 [USACO1.2]双重回文数 Dual Palindromes

    P1207 [USACO1.2]双重回文数 Dual Palindromes 291通过 462提交 题目提供者该用户不存在 标签USACO 难度普及- 提交  讨论  题解 最新讨论 暂时没有讨论 ...

  3. Linux系统(X64)安装Oracle11g完整安装图文教程另附基本操作

    一:查看本地ssh服务 Linux系统下安装启动ssh服务,下面以CentOS版本Linux系统为例: 1.检查是否装了SSH包 rpm -qa |grep ssh 2.没有安装SSH直接YUM安装 ...

  4. spring注解 构造函数问题

    因为类首先被Spring实例化的时候,会调用构造函数.只有实例化后,才会注入.你等于没注入就调用了,所以报错. 把DAO实现类注入到service实现类中,把service的接口(注意不要是servi ...

  5. python线程使用场景 多线程下载

    http://blog.xiayf.cn/2015/09/11/parallelism-in-one-line http://python.jobbole.com/84327/ http://www. ...

  6. LoadRunner用户行为模拟器 《第三篇》

    用户行为模拟器简称VU,VU通过运行VU脚本模拟了用户对软件的操作行为.VU是基于网络协议的.很明显,被测服务器是通过各种各样的网络协议与客户端打交道的.VU要“骗过”被测服务器,当然就要遵守这些协议 ...

  7. SQL Server 数据库基础编程

    Ø Go批处理语句 用于同时执行多个语句 Ø 使用.切换数据库 use master go     Ø 创建.删除数据库   方法1.   --判断是否存在该数据库,存在就删除 if (exists ...

  8. RAW格式

    一.什么是RAW文件?RAW文件主要是一种记录了数码相机传感器的原始信息,同时伴随着一些由相机所产生的一些元数据(metadata,诸如IS0的设置.快门速度.光圈值.白平衡等)的文件.不同的相机制造 ...

  9. 快速搭建 Node.js 开发环境以及加速 npm

    如何快速搭建 node 开发环境 npm 超慢 github 无法打开的问题 于是我觉得应该写一篇文章解答所有这些起步问题,让新同学也能顺顺利利入门. 快速搭建 Node.js 开发环境 如果你想长期 ...

  10. javaSE第十八天

    第十八天    192 1:Map(掌握)    192 (1)定义:    192 (2)Map和Collection的区别?    192 (3)Map接口功能概述(自己补齐)    192 A: ...