参考:高程3-14章 / 犀牛书15.9

1 表单引用获取

html中,表单是由

元素来表示的。对应js中的dom对象拥有reset/submit等特殊方法和属性。
获取表单元素的引用有两种:

常规获取dom
var form = document.getElementById(selector)


document.forms接口

(可以获取页面中所有的表单)


通过索引


var firstForm = document.forms[0]


通过name


var myForm = doucument.forms[“myForm”]

1.2 表单提交

两张方式




用户交互(单击 或 控件聚焦+回车键)
(前提:表单存在提交或图像按钮元素)


<input type=”submit” value=”提交”>
这种方式提交表单时,浏览器会在发送请求前触发submit事件

我们可以在此验证表单数据,以决定是否容许提交
image.png





js编程提交
(表单无需存在提交按钮)
var form = doucument.forms[“myForm”]

form.submit()
不会触发表单的submit事件

1.3 表单重置

同提交一样,有两种方式

—form.reset()
但是这两中方式都可以出发reset事件(红宝书如是说,犀牛书说form.reset不会触发)

2 表单字段获取

同表单一样,也有两张方式,第一种就是普通的原生dom方法访问表单元素
第二种,通过form.elements属性(是表单中所有表单元素的集合),可以按照位置和name来访问具体的表单元素

  1. var inputs = document.getElementById("form1").elements;
  2. var inputByIndex = inputs[2];
  3. var inputByName = inputs["login"];

2.1 共有属性

disabled form name
readonly type value
对于type属性,注意
多选列表type为select-multiple

2.2 共有方法

focus() 和 blur()

3 enctype 表单编码

该属性规定在发送到服务器之前应该如何对表单数据进行编码。
参考:http://protocol.taohui.tech/app/form.html

3.1 application/x-www-form-urlencoded(默认)

3.2 multipart/form-data

对与包含文件的表单,需要设置成改值,具体参见:timegeek-web协议详解和抓包-22节

image.png

比如:
image.png
image.png
请求包体可以在wiresharke抓包工具中看到:
image.png
image.png

x 浏览器提交表单的过程

IMG_2852.JPG

9 项目遇到的问题

9.1 focus()不生效

项目
表单存在一些特殊样式,在focus状态或值不为空的情况下,样式发生变化,如下
image.png
但是浏览器存在表单自动回填,自动回填不会触发focus,同时自测获取表单值也获取不到(这个也是纳闷,设置延迟定时器去获取也取不到),造成表单样式跟内容贴合在一起,只有点击页面任何地方,才会触发样式的正常展示。

image.png
在google登录页也会出现自动回填后,页面样式的问题,需要点击一下页面,表单提示才会上移露出表单回填账号
image.png
想要一进页面就调用表单元素的focus方法,但是在chorme或隐式模式下,随机生效,
找到一些原因:
比如: 打开浏览器的devtool情况下,该方法就是不生效,参考 (测试了下还真是,但是每次表现也不一致,不确定),这个在前端开发时候,谁能想到这个啊,fuck,坑死了。
image.png
鉴于以上,改用html5的autofocus, 又遇到问题了

autofocus不生效

url携带#hash,则标签设置autofocus不会生效,
浏览器已经给出提示:
Autofocus processing was blocked because a document already has a focused element.
解决办法:调用表单元素的focus方法,更多参考。 又回到focus方法了,闹这玩呢!