-->

html form 用法全解析

Tags: js

文章内容大多来自学习摘记、实践思考。

form 提交的 get、post 区别

  • 获取数据用 get,get 速度快、但有长度限制
    • get 只能向服务器发送 ASCII 字符,这是 W3C 组织规定的,所以任何参数最后都要以 ASCII 码的形式传递,不能有中文字符。
    • get 编码方式是根据当前网页采用选择的编码来编码。所以,当前网页如果是 gbk 编码,get 的参数也会被编码为 gbk,用 decodeURI()decodeURIComponent()(它们都是解 utf-8 编码的) 解码就会出现 js 异常抛错。
    • 对于要拼接到 uri 后面的中文参数进行 encodeURIComponent 或者 encodeURI 的 utf-8 编码方法,后端处理参数的解码方式一般也都是 utf-8 方式,这样不会出现后端获取中文乱码情况。
    • 浏览器发送数据给服务器时,会把数据进行浏览器编码成字节流。
  • 提交数据用 post,post 慢、理论上无长度限制 (服务器端可能会规定最大长度),post 相对安全。
    • 注意:如果用 post 做查询,刷新浏览器会弹出 “是否重复提交数据” 的弹框。应该改用 get 来做。

form 的 method、action、target、enctype

  • method 默认值为 get
  • action 属性表示 向何处发送表单数据 (一般为url)。
    • 如果不设置、或为空,则提交到本页面
    • 如果 get 方式提交、action url 中参数都会被丢弃;post 则不会。
  • target 属性规定在何处打开 action URL
    • 值可为:_self(默认值) | _blank | _parent | _top | framename
    • 当设置为 隐藏的 iframe name 时,能实现假的 表单提交无刷新效果。
  • enctype 规定在发送表单数据之前如何对其进行编码
    • 设置:application/x-www-form-urlencoded (默认值),按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码
    • 设置:multipart/form-data,使用表单上传文件时,必须让 form 的 enctype 等于这个值
    • 设置:application/json,发送消息为序列化后的 JSON 字符串

上传文件

  1. form 同步上传 (使浏览器不刷新的做法: form target 指向隐藏的 iframe, 服务端 action 返回 window.top.window['callback'](data))

  2. XMLHttpRequest 2 支持真正异步上传, form enctype 属性为 multipart/form-data, 构造 FormData 对象.

  3. 使用 fetch + FormData 上传文件时、不能设置 headers 的 Content-Type (或设置为 undefined),浏览器会自动设置为合适值 (比如 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryIn312MOjBWdkffIM)。参考 https://stackoverflow.com/a/39281156/2190503https://stanko.github.io/uploading-files-using-fetch-multipart-form-data/

  4. 用通常的 http://localhost:8000 访问服务端上传文件的接口时,会报出 跨域 错误,而用 http://127.0.0.1 或其他绑定的 host 都没问题,为什么?

  5. 服务端需要设置“松散的 ctoken 检测”?

上传前先压缩文件?以减少上传文件大小,怎么做?

  • 浏览器端被设计为发送简短 http 请求,浏览器端请求不用压缩,见此
  • 图片上传前压缩办法

下载

Ajax 不能下载文件。可以用 form 表单提交下载,或 iframe 方式下载。 单纯使用js下载文件纯前端-生成文件并下载

点击需要下载文件的连接,后端处理:Content-type: application/octet-streamContent-Disposition: filename=\

更多

最近文章

2024-08-06 » lerna 实践
2024-02-15 » 字节监控之旅
2024-01-06 » 如何做一个好的管理者