A FORM

  1. <form id='form' action='http://a-response-url' method="post">
  2.  
  3. <!--maxlength 最大值 placeholder 占位符 autofocus 自动聚焦-->
  4. <input type='text' name='name' size='20' maxlength='10' placeholder='initial' autofocus /><br />
  5. <input type='text' name='phone' size='3' maxlength='3' />
  6. <input type='text' name='phone' size='3' maxlength='3' />
  7. <input type='text' name='phone' size='4' maxlength='4' /><br />
  8.  
  9. <!--旧版浏览器会自动设置type为text-->
  10. <input type='email' name='email' required /><br />
  11. <select name='fruit'>
  12. <option value='a'>apple</option>
  13. <option value='b' selected>banner</option>
  14. <option value='c'>color fruit</option>
  15. </select><br />
  16.  
  17. <textarea name='textbox' rows='5' cols='20' maxlength="50">textbox with maxlength</textarea><br />
  18. <button type='reset' id="resetBtn">reset</button>
  19. <button type='submit' id="subBtn">submit</button>
  20. </form>

表单的elements属性

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

自动聚焦的兼容

  1. // autofocus
  2. var autofocusEle = form.elements[0];
  3.  
  4. if (autofocusEle.autofocus !== true) {
  5. autofocusEle.focus();
  6. }

占位符的兼容

  1. // placeholder for ie\10 with jquery
  2. if (!("placeholder" in document.createElement("input"))) {
  3.  
  4. // focus and blur
  5. $("[placeholder]").on("focus", function () {
  6. if ($(this).val() === $(this).attr("placeholder")) {
  7. $(this).val("");
  8. }
  9. }).on("blur", function () {
  10. if ($(this).val() === "") {
  11. $(this).val($(this).attr("placeholder"));
  12. $(this).css("color", "graytext")
  13. }
  14. }).blur();
  15.  
  16. // when submit dont send the placeholder value
  17. $("[placeholder]").parent("form").submit(function () {
  18. $(this).find("[placeholder]").each(function () {
  19. if ($(this).val() === $(this).attr("placeholder")) {
  20. $(this).val("");
  21. }
  22. });
  23. });
  24. }

表单的自动提交:

当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.提交编码后的数据。

 注:表单的直接提交

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

关于AJAX提交表单

  1. // ajax提交表单提供了更好的可控性,示例应用了jquery
  2. $("#form").on("submit", function (e) {
  3.  
  4. // 阻止浏览器的默认提交行为
  5. e.preventDefault();
  6.  
  7. $.ajax({
  8. type: "post",
  9. url: $(this).attr("action"),
  10. 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"
  11. error: function () {},
  12. success: function (res) {}
  13. })
  14. });

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. linux查看内存和回收内存

    清理前内存使用情况 free -m free -g echo 1 > /proc/sys/vm/drop_caches 清理后内存使用情况 free -m

  2. USACO Section 2.2 循环数 Runaround Numbers

    OJ:http://www.luogu.org/problem/show?pid=1467 #include<iostream> #include<vector> #inclu ...

  3. 洛谷P1983 车站分级

    P1983 车站分级 297通过 1.1K提交 题目提供者该用户不存在 标签图论贪心NOIp普及组2013 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 求帮忙指出问题! 我这么和(diao ...

  4. android 上传文件用php程序在服务端接受(一)

    php服务端接受程序..file_up.php. <?php /* require_once('lib/session_config.php'); require_once('lib/flydc ...

  5. 【HTML/XML 7】CSS层叠样式表

    导读:上篇博客说到用XSL去实现XML文档的表现形式的美化,那么另外一种方式就是CSS的使用.本篇博客系统的介绍CSS,下篇博客,将系统的介绍XSL. 一.CSS的发展历史 1996年,层叠样式表(C ...

  6. Microsoft Dynamics AX 2012 X++ Editor Extensions

    Microsoft Dynamics AX 2012 X++ Editor Extensions Initial version of this project is based on the MSD ...

  7. maven auto-config 多环境自动打包

    摘自:http://doc.okbase.net/bjhecwq/archive/118121.html maven有许多优秀的插件,最近在研究打包中替换多重环境的配置,同事介绍使用阿里的auto-c ...

  8. storm启动分析

    一个topology的启动包括了三个步骤 1)创建TopologyBuilder,设置输入源,输出源 2)获取config 3)提交topology(这里不考虑LocalCluster本地模式) 以s ...

  9. storm学习-storm入门

    超好资料: 英文:https://github.com/xetorthio/getting-started-with-storm/blob/master/ch03Topologies.asc 中文:h ...

  10. Linux rename命令

    转载:http://blog.csdn.net/sea_shore/article/details/6102437 1.rename命令批量修改文件名, 其实linux下可以使用别的办法来批量修改文件 ...