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. Class diagrams

    So far we have seen stack diagrams, which show the state of a program, and object diagrams, which sh ...

  2. childNodes在IE与Firefox中的区别

    嗯,这是前几天写一个遍历双层List集合,动态输出对应的表格并且控制固定表头的效果时发现的一个知识点,程序编好后在IE8浏览器下测试没问题,在Firefox35.0.1总是报错,后来发现是IE与FF对 ...

  3. jQuery datepicker

    <script type="text/javascript" src="/assets/datepicker/jquery-ui-1.9.1.min.js" ...

  4. APUE第4章 文件和目录

    4.2 文件函数 #include <sys/stat.h> int stat(const char *restrict pathname, struct stat *restrict b ...

  5. 雷兽的数据库CAP乱谈之(一)阐述

    今天有人问我cap,找了https://my.oschina.net/lilw/blog/169776这片文字, 下面是cap那篇文字的解释: 所谓CAP理论,即: Cosistency       ...

  6. C++ 牛人博客(不断更新中...)

    http://www.zhangjiee.com/ 新浪微博@独酌逸醉. Github. GitCafe. stackoverflow. Quora http://cpp1x.org/ 刘未鹏 | M ...

  7. 【c实现,vc6调试通过】给出一字符串指针,计算出字符串指针中单词数

    #include <stdio.h> /* 给出一字符串指针,计算出字符串指针中单词数, 单词不包括'.',',',';','?','_','"',由0-9数字或26个字母组成 ...

  8. Recover deleted pictures in iOS 9

    A case about business secret. The suspect is an engineer in Hitec company, and compeitiors pay lots ...

  9. Sunglasses

    It's hot this summer. It also reminds me of one case about sunglasses. She was new to this company a ...

  10. DELL服务器SAS 5 I_R 完全配置手册

    http://wenku.baidu.com/view/f258a36eb84ae45c3b358c55.html?re=view