JS高级程序设计14-表单脚本

  • 表单的基础知识(P412)

    在JS中,表单对应的时HTMLFormElement类型,同时HTMLFormElement也继承了HTMLElement,除了与其他HTML元素具有相同默认的属性,HTMLFormElement额外的属性和方法:

    acceptCharset--服务器能够处理的字符集;
    action--接受请求的URL;
    elements--表单中所有控件的集合;
    enctype--请求的编码类型;
    length--表单中控件的数量;
    method--要发送的HTTP请求类型,通常时“get”或"post";
    name:表单的名称;
    reset()--将所有表单域重置为默认值;
    submit()--提交表单;
    target--用于发送请求和接受相应的窗口名称
    
    //取得<form>元素引用的方式:
    var form=document.getElementById("form1");
    var firstForm=document.form[0]; //取得页面中的第一个表单
    var myForm=document.forms["form2"]; //取得页面中名称为"form2"的表单

    提交表单(P413)

    <input type="submit" value="Submit Form"> //通用提交按钮
    <button type="submit">Submit Form</button> //自定义提交按钮
    <input type="image" src="graphic.gif"> //图像按钮
    
    var form=document.getElementById("myForm");
    form.submit();
    
    //解决重复提交表单:
    在第一次提交表单后就禁用提交按钮;
    利用onsubmit事件处理程序取消后续的表单提交操作

    重置表单(P414)

    <input type="reset" value="reset Form"> //通用重置按钮
    <button type="reset">Reset Form</button> //自定义重置按钮
    
    var form=document.getElementById("myForm");
    form.reset();

    表单字段(P414)

    每个表单都有elements属性,该属性是表单中所有元素的集合;
    
    //表单字段共有的属性和方法:
    disabled--布尔值,表示当前字段是否被禁用;
    form--指向当前字段所属表单的指针;
    name--当前字段的名称;
    readOnly--布尔值,表示当前字段是否只读;
    tabindex--表示当前字段的切换序号;
    type--当前字段的类型;
    value--当前字段将被提交给服务器的值
    
    //除了form属性之外,JS可以动态修改其他任何属性
    var form=document.getElementById("myForm");
    var field=form.elements[0];
    field.value="Another value";//修改value属性
    alert(field.form===form); //检查form属性的值
    field.focus();//把焦点设置到当前字段
    field.disabled=true;//禁用当前字段
    field.type="checkboos";//修改type属性(不推荐)
    
    //共有的表单字段方法
    focus()--将焦点转移到某处
    设置autofocus属性也可以不使用JS就能自动把焦点移动到相应字段
    blur()--从元素中移走焦点
    
    //共有的表单字段事件
    blur--当前字段失去焦点时触发
    change--对于<input>和<textarea>元素,在它们失去焦点且value值改变时触发;对于<select>元素,在其选项改变时触发
    focus--当前字段获得焦点时触发;
  • 文本框脚本(P419)

    在HTML中,有和两种方式表现文本框

    选择文本(P420)

    select()--用于选择文本框中所有文本
    
    //使用select()使文本框在获得焦点时选择其所有文本
    EventUtil.addHandler(textbox,"focus",function(){ 
        event=EventUtil.getEvent(event);
        var target=EventUtil.getTarget(event);
        target.select();
    });
    
    //选择(select)事件
    
    //取得选择的文本
    需要使用到selectionStart和selectionEnd两个属性
    function getSelectedText(textbox){ 
        return textbox.value.substring(textbox.selectionStart,textbox.selectionEnd);
    }
    
    //选择部分文本
    setSelectionRange()方法

    过滤输入(P422)

    //屏蔽字符
    下面的代码屏蔽对非数字字符的输入,没有屏蔽上下按键、退格键、删除键、和ctrl键
    EventUtil.addHandler(textbox,"keypress",function(event){ 
        event=EventUtil.getEvent(event);
        var target=EventUtil.getTarget(event);
        var charCode=EventUtil.getCharCode(event);
    
        if(!/\d/.test(String.fromCharCode(charCode))&&charCode>9&&!event.ctrlkey){
            EventUtil.preventDefaule(event);
        }
    });
    
    //操作剪贴板
    6个剪贴板事件:
    beforecopy--在发生复制操作时触发;
    copy--在发生复制操作时触发;
    beforecut--在发生剪切操作前触发;
    cut--在发生剪切操作时触发
    beforepaste--在发生粘贴操作前触发
    paste--在发生粘贴操作时触发
    
    //要访问剪贴板中的数据,可以使用clipboardData对象
    为了兼容性,最好只在发生剪贴板事件期间使用clipboardData对象
    clipboardData对象有三个方法:getData()、setData()和clearData()
    getData()--用于从剪贴板取得数据,接受一个参数,即要取得的数据的格式;
    setData()--第一个参数时数据类型,第二个参数是要放在剪贴板中的文本;

    自动切换焦点(P426)

    <input type="text" name="tel1" id="txtTel1" maxlength="3">
    <input type="text" name="tel2" id="txtTel2" maxlength="3">
    <input type="text" name="tel3" id="txtTel3" maxlength="4">
    (function(){ 
        function tabForward(event){ 
            event=EventUtil.getEvent(event);
            var target=EventUtil.gettarget(event);
            if(target.value.length==target.maxLength){ 
                var form=target.form;
                for(var i=0,len=form.elements.length;i<len;i++){ 
                    if(form.elements[i]==target){ 
                        if(form.elements[i+1]){ 
                            form.elements[i+1].focus();
                        }
                        return;
                    }
                }
            }
        }
    
        var textbox1=document.getElementById("txtTel1");
        var textbox1=document.getElementById("txtTel2");
        var textbox1=document.getElementById("txtTel3");
    
        EcentUtil.addHandler(textbox1,"keyup",tabForward);
        EcentUtil.addHandler(textbox2,"keyup",tabForward);
        EcentUtil.addHandler(textbox3,"keyup",tabForward);
    })();

    HTML5约束验证API(P427)
    HTML5新增了一些即使JS被禁用也可以保证基本的验证的功能

    //必填字段
    任何标注required属性的字段,在提交表单时都不能空着;
    
    //其它输入类型
    HTML5为type属性新增加了几个值,"email""url"
    email--要求输入的文本必须符合电子邮件地址的模式
    url--要求输入的文本必须符合URL的模式
    
    //数值范围
    HTML5为type属性还新增了一些基于数字的值:"number""range""datetime""datetime-local""date""month""week""time"
    这些类型有两个方法:stepUp()和stepDown()
    
    //输入模式
    HTML5为文本字段新增了pattern属性:
    <input type="text" pattern="\d+" name="count">
    
    //检测有效性
    checkValidity()方法可以检测表单中的某个字段是否有效
    validity属性会告诉你为什么字段有效或无效:
    customError:如果设置了setCustomValidity(),则为true,否则返回false;
    patternMismatch:如果值与指定的pattern属性不匹配,返回true;
    rangeOverflow:如果值比max值大,返回true;
    rangeUnderflow:如果值比min值小,返回true;
    stepMisMatch:如果minmax之间的步长值不合理,返回true;
    tooLong:如果值的长度超过了maxlength属性指定的长度,返回true;
    typeMismatch:如果值不是"mail""url"要求的格式,返回true;
    valid:如果这里的其他属性都是false,返回true;
    valueMissing:如果标注为required的字段没有值,返回true。、
    
    //禁用验证
    通过设置novalidate(在<form>y=元素上使用),可以告诉表单不进行验证;
    如果一个表单有多个提交按钮,对其中的一个按钮添加formnovalidate属性,可以使相应的提交按钮不必验证表单
  • 选择框脚本(P431)

    选择框脚本时通过和元素创建的

    //HTMLSelectElement类型另外提供的属性和方法:
    add(newOption,relOption)--向控件中插入新<option>元素,其位置在相关项之前;
    multiple--布尔值,表示是否允许多想选择;
    options--控件中所有<option>元素的HTMLCollection;
    remove(index)--移除给定位置的选项;
    selectedIndex--基于0的选中项的索引,如果没有选中项,则值为-1;
    size--选择框中可见的行数
    
    //HTMLOptionElement对象的属性:
    index--当前选项在options集合中的索引;
    label--当前选项的标签;
    selected--布尔值,表示当前选项是否被选中;
    text--选项的文本;
    value--选项的值

    选择选项(P432 )

    selectedIndex属性可以选择选中项

    添加选项(P434)

    方法一:
    var newOption=document.createElement("option");
    newOption.appendChild(document.createTextNode("Option text"));
    newOption.setAttribute("value","Option value");
    selectbox.appendChild(newOption);
    方法二:
    var newOption=new Option("Option text","Option value");
    selectbox.appendChild(newOption);
    方法三:
    var newOption=new Option("Option text","Option value");
    selectbox.add(newOption,undefined); //最佳方案

    移除选项(P435)

    方法一:
    selectbox.removeChild(selectbox,options[0]); //移除第一个选项
    方法二:
    selectbox.remove(0); 
    方法三:
    selectbox.option[0]=null;

    移动和重排选项(P435)

    var selectbox1=document.getElementById("selLocations1");
    var selectbox2=document.getElementById("selLocations2");
    selectbox2.appendChild(selectbox1.options[0]);
    (还有更好的方法)
  • 表单序列化(P436)

    Ajax的出现,使得表单序列化成为一种常见需求

    function serialize(form){ 
        var parts=[],field=null,i,len,j,optLen,option,optValue;
        for(i=0,len=form.elements.length;i<len;i++){ 
            field=form.elements[i];
            switch(field.type){ 
                case "select-one":
                case "select-multiple":
                    if(field.name.length){ 
                        for(j=0,option=field.options.length;j<optLen;j++){ 
                            option=field.options[j];
                            if(option.selected){ 
                                optValue=""; 
                                if(option.hasAttribute)( 
                                    optValue=(option.hasAttribute("value")?option.value:option.text);
                                )else{ 
                                    optValue=(option.attributes["value"].specified?option.value:option.text);
                                }parts.push(encodeURIComponent(field.name)+"="+encodeURIComponent(optValue));
                            }
                        }   
                    }
                    break;
                case undefined: //字段集
                case "file": //文件输入
                case "submit": //提交按钮
                case "reset": //重置按钮
                case "button": //自定义按钮
                    break;
                case "radio": //单选按钮
                case "checkbox": //复选框
                    if(!field.checked){ 
                        break;
                    }
                default:
                    if(field.name,length){ 
                        parts.push(encodeURIComponent(field.name)+"="+encodeURIComponent(field.value));
                    }
            }
        }
        return parts.join("&");
    }
  • 富文本编辑

    富文本编辑介绍

    使用<iframe>创建富文本编辑区域
    设置其designMode属性,可以使这个空白的HTML页面可以被编辑

    使用contenteditable属性

    contenteditable属性可以应用到页面中的任何元素,使相应的元素可以编辑,同样,也可以让富文本编辑区域可以编辑;

    操作富文本

    与富文本编辑器交互的主要方式,就是使用document.execCommand()方法;
    //转换粗体文本
    frames["richedit"].document.execCommand("bold",false,null);
    //转换斜体文本
    frames["richedit"].document.execCommand("italic",false,null);
    注:document.execCommand()方法不但适用于iframe区块,也适用于其他区块
    
    //queryCommandEnabled()方法可以检测当前富文本编辑器是否可以执行某个命令:
    var result=frames["richedit"].document.queryCommandEnabled("bold");
    //queryCommandState()方法用于确定是否已将指定命令应用到了选择的文本:
    var isBold=frames["richedit"].document.queryCommandState("bold");
    //queryCommandValue()用于取得执行命令时传入的值:
    var fontsize=frames["richedit"].document.queryCommandValue("fontsize");

    富文本选区

    在富文本编辑器中,使用框架(iframe)的getSelection()方法,可以确定实际选择的文本,并返回表示当前选择文本的selection对象;
    //selection对象的属性(略)
    var selection=frames["richedit"].getSelection();
    //取得选择的文本
    var selectedText=selection.toString();

    表单与富文本

    富文本编辑器不属于表单,需要手工来提取并提交HTML:
    在提交表单前,从iframe中提取出HTML,并将其插入到最近添加的隐藏的字段中
    EventUtil.addHandler(form,"submit",function(event){ 
        event=EventUtil.getEvent(event);
        var target=EventUtil.getTarget(event);
        target.element['comments'].value=frames["richedit"].document.body.innerHTML;
    });
    //不仅仅是富文本,其他contenteditable元素也可以:
    EventUtil.addHandler(form,"submit",function(event){ 
        event=EventUtil.getEvent(event);
        var target=EventUtil.getTarget(event);
        target.element['comments'].value=document.getElementById("richedit").innerHTML;
    });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值