zoukankan      html  css  js  c++  java
  • form 表单处理

    submit相关

    当使用 submit 按钮或者 image  或者button type="submit"   来提交表单时,会触发 submit 事件,但是直接javascript调用submit() 提交的话, 不会触发submit()

    而使用javascript调用 reset() 的话则会继续触发 reset() 事件
    点击submit时,有些浏览器先触发click事件,有些浏览器先触发submit事件,因此不能依赖
     
    防止重复提交表单
    1、<input type=”button” value=”Submit”  onclick=”this.disabled=true; this.form.submit()” />
    不使用 submit 按钮因为它会在提交之前就被禁止,所以表单不会被提交
    2、另外一种方法是监听onsubmit事件,发现重复提交请求就取消掉
     
    访问表单字段
    表单里面的控件元素同时属于表单集合,属于表单的属性,可以使用索引和name来访问:
    var form = document.getElementById(“form1”);
    var field1 = form.elements[0];                           //获得表单里的第一个元素
    var field2 = form.elements[”textbox1”];                     //获得name为textbox的元素,如果多个元素name一致,那么将返回HTMLcollection集合
    :form[0]和form["name"]是为了兼容旧的浏览器,如果可以应该使用form.element[0]的形式
     
    输入框
    输入框(text或者textarea)当里面的文字在获取焦点以后发生了变化,当失去焦点以后会触发change事件(因此可以拿来验证用户的输入是否正确),如果同时指定了 blur()  和  change()  , 哪个先触发因浏览器而会不同。同时修改输入框值的时候直接使用element.value更好,而不推荐使用setAttribute()
    输入框有一个select方法,可以用来选中里面的文字,同时也提供了select事件,但是无法知道哪些内容被选中,HTML5提供了两个属性selectionEnd,selectionStart,可以获取选择开始和结束的位置,再配合切割就可以获取啦,对于旧的ie浏览器可以使用document.selection(包含了文档中所有被选中的值)来模拟:
    function getSelectedText(textbox) {
        if (typeof textbox.selectionStart == “number”) {
            return textbox.value.substring(textbox.selectionStart, textbox.selectionEnd); 
        } else if (document.selection) {
            return document.selection.createRange().text;
        }
    }
    同时HTML5也提供了一个部分文字选择的方法:setSelectionRange
    textbox.value = “Hello world!”
    textbox.setSelectionRange(0, 3);       //”Hel”
     
    keypress 事件只有当代表字符的按键按下时才会触发,禁用默认行为就能阻止输入任何字符,但是有些浏览器按上下左右之类的也会触发,还好在火狐所有触发keypress的非字符按键字符为0,Safari 3 以前的则返回字符8,所以不要阻止10一下的:
    textbox.addEventListener( “keypress”, function(event){
        var target = event.target;
        var charCode = EventUtil.getCharCode(event);
        if (!/d/.test(String.fromCharCode(charCode)) && charCode > 9){                   //String.fromCharCode 将ascii码转成字符串
            EventUtil.preventDefault(event);
        }
    });
    onkeydown 只要键盘按键被按下就会触发
     
    an empty string is always considered to be present in any string
     
    当一个表单控件获得焦点的时候,按下enter按钮,就会提交表单。如果没有submit按钮的话,则不会提交。还有一个例外的就是textarea,它会换行咯
     
    可以为text输入框指定pattern属性,该属性接收正则表达式,只有匹配的内容才能输入,^代表开头,$代表结尾
    var pattern = document.forms[0].elements[“count”].pattern;
     
     
    change事件,在不同的表单控件上触发的时间也有差异,对于input和textarea,当他们失去焦点并且里面的值有变化就会触发。对于select元素,只要改变了选项就会触发,不用等到失去焦点。
     
     
    使用checkValidity()可以用来检测输入框输入的数据是否符合预定条件,也可以用在表单上form.checkValidity(),如果每个输入框都符合条件才返回true。检测出错误以后可以使用validity对象定位错误类型,该对象有很多错误类型属性,例如required没有填写数据的话↓
    badInput: false
    customError: false
    patternMismatch: false
    rangeOverflow: false
    rangeUnderflow: false
    stepMismatch: false
    tooLong: false
    typeMismatch: false
    valid: false
    valueMissing: true
     
    但是可以设置关闭检测直接<form novalidate>,这样的话会忽略对该表格内输入内容的检测,也可以用document.forms[0].noValidate = true;设置。可以在submit按钮上设置<input type=”submit” formnovalidate name=”btnNoValidate” value=”Non-validating Submit”>那么按这个按钮提交就不会检测了。
     
    通常只有表单元素才可以设置focus,但是可以通过把元素的tabIndex设为-1来让任意元素都可以focus
     
    textbox有一个select()方法,用来选中里面的文字,同时也提供了select事件,当textbox里面的文字被选中时触发
     
    <input> 和 <button>可以动态改变type属性,但 <select> 的type属性是只读的
     
    在隐藏的表单元素上调用focus方法会报错,不管是hidden类型还是用css隐藏的。
     
    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, optLen = 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: //fieldset
    case ”file”: //file input
    case ”submit”: //submit button
    case ”reset”: //reset button
    case ”button”: //custom button
    break;
    case ”radio”: //radio button
    case ”checkbox”: //checkbox
    if (!field.checked){
    break;
    }
    /* falls through */
    default:
    //don’t include form fields without names
    if (field.name.length){
    parts.push(encodeURIComponent(field.name) + ”=” + 
    encodeURIComponent(field.value));
    }
    }
    return parts.join(”&”);
    }
  • 相关阅读:
    POJ 3904 Sky Code [数学]
    UVA 11542 Square [XOR方程组]
    CSS+DIV 设置圆角边框加阴影效果
    取消谷歌CHROME文本框(域)外边框高亮和缩放功能的办法
    IE和火狐CSS透明层兼容写法
    Ubuntu 12.04 amd64 搭建Apache+PHP+Mysql环境
    CSS样式表的优先级别
    css设置透明层
    卸载gnome的命令为
    ubuntu12.04 启动n卡独显方法
  • 原文地址:https://www.cnblogs.com/chuangweili/p/5159707.html
Copyright © 2011-2022 走看看