js红宝石 第十九章-表单脚本

JS即做表单验证,又用于增强标准表单控件的默认行为

19.1 表单基础

Web表单在HTML中用<form>表示,在JavaScript中则用HTMLFormElement类型表示

HTMLFormElement的属性和方法:
acceptCharset: 服务器可以接收的字符集

action: 请求的URL

elements: 表单中所有控件的HTMLCollection

enctype: 请求的编码类型

length: 表单中控件的数量

method: HTTP请求方法的类型,GET/POST

name: 表单的名字

reset(): 把表单字段重置为默认值

submit(): 提交表单

target: 发送请求和接收相应的窗口的名字

19.1.1  提交表单

提交按钮的定义:

    <!-- 通用按钮 -->
    <input type="submit" value="Submit Form">

    <!-- 自定义按钮 -->
    <button type="submit">Submit Form</button>

    <!-- 图片按钮 -->
    <input type="image" src="url">

调用preventDefault()可以阻止表单提交

也可以通过submit()来提交,但是不会触发submit事件

      let form = document.getElementById('myForm')

      form.addEventListener('submit',(e)=>{
        e.preventDefault() // 阻止表单提交
      })

      // 提交表单
      form.submit()

19.1.2 重置表单

单击重置按钮可以重置表单

    <!-- 通用重置按钮 -->
    <input type="reset" value="Reset Form">

    <!-- 自定义重置按钮 -->
    <button type="reset">Reset Form</button>

调用preventDefault()可以阻止表单重置

也可以通过reset()来重置,但是不会触发reset事件

19.1.3 表单字段

表单元素可以和其它元素一样用原生DOM方法访问

所有表单元素都是表单elements属性中包含的一个值,可以通过索引位置和name属性访问

  <body>
    <form method="post" id="myForm">
      <ul>
        <li><input type="radio" name="color" value="red" />red</li>
        <li><input type="radio" name="color" value="blue" />blue</li>
        <li><input type="radio" name="color" value="green" />green</li>
      </ul>
    </form>
    <script>
      let form = document.getElementById('myForm')

      let colorFields = form.elements["color"]
      console.log(colorFields);
    </script>
  </body>

1.表单的公共属性

disabled: 表示表单是否禁用

form: 指向表单字段所属的表单,只读属性

name: 字段的名字

readOnly: 只读属性

tabIndex: 这个字段按tab时的切换顺序

type: 字段类型

value: 提交给服务器的字段值

2.表单属性的公共方法

每个表单字段都有两个公共方法:

focus() 获得焦点 和  blur()移除焦点

3.表单字段的公共事件

blur: 失去焦点时触发

change: <input>和<textarea>中value变化或者<select>选项变化时触发

focus: 获得焦点时触发

19.2 文本框编程

<input>单行

<textarea>多行

19.2.1 选择文本

两种文本框都支持select()方法,全部选中文本框的文本

下面的代码实现了获得焦点就全选

      let form = document.getElementById('myForm')
      console.log();

      form.addEventListener('focus',(e)=>{
        e.target.select()
      })

1.select事件

当选中文本框的文本时,就会触发select事件

2.取得选中文本

select不能获得选中文本,所以H5添加了拓展:selectionStart和selectionEnd,分别表示文本选取的起点和终点

      function getSelectedText(textbox){
        return textbox.value.substring(textbox.selectionStart,textbox.selectionEnd)
      }

3.部分选中文本

setSelectionRange(start,end) 和substring()一样,获得部分文本 

19.2.2 输入过滤

文本框需要保证输入特定类型或格式的数据

所以需要JS实现输入过滤

1.屏蔽字符

keypress事件负责向文本框插入字符,可以通过阻止这个事件去阻止不合规的字符输入

      // 只允许输入数字
      textbox.addEventListener('keypress',(e)=>{
        if(!/\d/.test(String.fromCharCode(e.charCode))){
          e.preventDefault()
        }
      })

2.处理剪切板

新增加的剪切板事件:

beforecopy: 复制发生前触发

copy: 发生时触发

beforecut: 剪切发生前触发

cut: 剪切发生时触发

beforepaste: 粘贴发生前触发

cut: 粘贴发生时触发

要阻止剪贴板操作,需要阻止copy,cut,cut事件

剪贴板数据可以通过event对象上的clipboardData对象获取,为了防止未经授权访问剪贴板,只允许在剪贴板事件期间访问

clipboardData对象的三个方法:getData()  setData()  clearData()

第一个参数是类型  第二个参数是要放上去的文本

getClipboardText() 获取事件对象的位置后,就能使用剪贴板了

      //确定剪贴板上的文本是否有效
      textbox.addEventListener('paste',(e)=>{
        let text = getClipboardText(e)

        if(!/^\d*s/.test(text)){
          e.preventDefault()
        }
      })

19.2.3 自动切换

JS可以实现当前字段完成后自动切换到下一个字段

p593

19.2.4 HTML5约束验证API

required 必填项

更多输入类型:

email  url

数值范围:

min max step(步长)

stepUp()  stepDown() 从当前值加/减某个值

输入模式 pattern

指定正则表达式

检测有效性

checkValidity() 检测任意给定字段是否有效

禁用验证

noValidate

19.3 选择框编程

选择框使用<select>和<option>元素创建

选择框的额外属性和方法:

add(newOption,relOption): 在relOption前面添加新的<option>

multiple: 表示是否允许多选

options: 所有<option>元素的HTMLCollection

remove(index): 移除给定位置的选项

selectedIndex: 选中项的索引值

size: 选择框中可见的行数

type属性可能是 select-one 或者 select-multiple

每个<option>元素在DOM中都是HTMLCollectionElement对象,添加了以下属性:

index: 选项在options集合中的索引

lable: 选项的标签

selected: 表示是否选中了当前选项

text: 选项的文本

value: 选项的值

19.3.1 选项处理

对于只选择一项的选择框,可以使用selectedIndex获取关于选项的所有信息:

    let selectedIndex = selectedbox.selectedIndex
    let selectedOption = selectedbox.options[selectedIndex]

    let value = selectedOption.value
    let text = selectedOption.text

取得所有选中项:

    function getSelectedOptions(selectedbox){
      let result = new Array()

      for(let option of selectedbox.options){
        if(option.selected)
          result.push(option)
      }

      return result
    }

19.3.2 添加选项

JS代码可以动态创建并且添加选项

    let newOption = new Option("Option text","Option value")
    selectedbox.add(newOption,undefined)

默认添加到末尾

19.3.3 移除选项

使用remove(index)方法

    // 移除所有选项
    function clearSelectBox(selectedbox){
      for(const option of selectedbox.options){
        selectedbox.remove(0)
      }
    }

19.3.4 移动和重排选项

使用DOM方法

appendChild() 和 insertBefore()

19.4 表单序列化

表单在JS中可以使用type,name,value进行序列化

浏览器确定要把什么发送到服务器:

字段名的和值是URL编码

禁用字段不会发送

复选框或单选框只有被选中才发送

reset 或 button 的按钮不会发送

多选字段的每个选中项都有一个值

点击提交按钮提交表单时,会发送该按钮

<select>元素的值是被选中<select>元素的value属性

19.5 富文本编辑器

基本技术就是在空白的HTML中嵌入iframe,通过designMode属性,可以把这个空白文档变成可编辑的

designMode的值有两个:foo(默认值)和on  设置为on时,整个文档都会变成可编辑的

19.5.1 使用contentditable

可以给页面中任何元素添加contentditable属性,然后该元素会立即被用户编辑

19.5.2 与富文本交互

主要使用document.execCommand()

接收三个参数: 要执行的命令,浏览器是否为命令提供用户界面的布尔值和命令必须值

p605: 常用命令

19.5.3 富文件选择

在内嵌窗格中使用getSelection(),可以获得富文本编辑器的选区

p607: Selection对象的属性

19.5.4 通过表单提交富文本

要把富文本编辑器提交给浏览器,需要手动提取HTML自己提交

在提交表单前,从内嵌窗格或contentditable元素提取HTML,并插入隐藏字段中

    form.addEventListener("submit",(e)=>{
      let target = e.target

      target.elements["comments"].value = frames["richedit"].document.body.innerHTML
    })

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值