+发表新主题
查看: 1522|回复: 0

[代码片段] DOM form对象

[复制链接]

[代码片段] DOM form对象

[复制链接]
殷三姗 发表于 2016-1-18 21:25:06 浏览:  1522 回复:  0 [显示全部楼层] |只看大图 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
1.HTML DOMForm元素:

     找到表单对象:var form=document.forms[i/name]

     找到表单中的元素: var elem=form.elements[i/name]

         如果找有name属性的元素可简写为: form.name


  form对象的onsubmit事件:在提交表单前之前自动触发,主要验证或取消提交

  form对象都有submit()方法:专用于手动提交表单

               form.reset();//重填

               form.submit();//手动提交

            onfocus---》元素获取焦点事件

    onblur------》元素失去焦点事件

  表单中的元素:elem.focus();//使用代码让元素获得焦点

          elem.blur();//失去焦点

        1.在绑定事件处理函数的内部,尽量不要使用外部的变量,一旦使用,就会形成闭包,后果被闭包保护的DOM对象无法从内存中真正删除 会造成内存泄露


例如:


  1. <!DOCTYPE HTML>

  2. <html>

  3. <head>

  4. <title>表单提交验证</title>

  5. <meta charset="utf-8" />

  6. <style>

  7. .hintText{color:#aaaaaa; font-style:italic; }

  8. .normalText{color:#000000;}

  9. .error{background-color:pink}

  10. </style>

  11. <script src="4.js">

  12.    

  13. </script>



  14. </head>

  15. <body>

  16. <h2>发表留言</h2>

  17. <form name="msgForm">

  18. 姓名:<input name="userName" class="hintText"

  19. value="请输入您的姓名"/><br />

  20. 内容:<textarea name="content" class="hintText" style="resize:none"

  21. rows="5" cols="30">请输入留言内容</textarea><br />

  22. <label><input type="checkbox"/>我已阅读了《常见问题列表》</label><br/>

  23. <input type="button" disabled="disabled" value="提交"/>

  24. </form>

  25. </body>

  26. </html>
复制代码
下面是js文件:


  1. window.onload=function(){

  2.      //找到表单对象,保存在form变量中

  3.    var form=document.forms["msgForm"];

  4. //获得姓名文本框对象,保存在变量txtName中

  5.    var txtName=form.userName;

  6. //获得回复内容文本框,保存在变量txtContent中

  7.    var txtContent=form.content;

  8. //为txtNmae对象绑定获得焦点事件处理函数

  9.      txtName.onfocus=function(){//this-->txtName

  10. //  如果txtName的内容是 默认字符 ,

  11.     if(this.value=="请输入您的姓名"){

  12.        // 就清空txtName的内容,在value中

  13.        this.value="";

  14.    //去掉txtName的样式类

  15.    this.className="";

  16.        }

  17. }

  18. //为txtName对象绑定失去焦点事件,处理函数

  19.    txtName.onblur=function(){

  20. //   如果txtName只由空字符组成或txtName的内容刚好又等于"请输入您的姓名"

  21.     if(/^(s*|请输入您的姓名)$/.test(this.value)){//this-->txtName

  22.          //txtName的内容设置为"请输入您的姓名"

  23.        this.value="请输入您的姓名";

  24.      //设置txtName的样式类为"hintText"

  25.            this.className="hintText";

  26. }

  27. }

  28. //为txtContent对象绑定获得焦点事件处理函数

  29.      txtContent.onfocus=function(){

  30. //  如果txtContent的内容是 默认字符 ,

  31.     if(this.value=="请输入留言内容"){

  32.        // 就清空txtContent的内容,在value中

  33.        this.value="";

  34.    //去掉txtContent的样式类

  35.    this.className="";

  36.        }

  37. }

  38. //为txtContent对象绑定失去焦点事件,处理函数

  39.    txtContent.onblur=function(){

  40. //   如果txtContent只由空字符组成或txtContent的内容刚好又等于"请输入您的姓名"

  41.     if(/^(s*|请输入留言内容)$/.test(this.value)){

  42.          //txtContent的内容设置为"请输入您的姓名"

  43.        this.value="请输入留言内容";

  44.      //设置txtContent的样式类为"hintText"

  45.            this.className="hintText";

  46. }

  47. }

  48.      var chb=form.elements[form.elements.length-2];

  49. var btn=form.elements[form.elements.length-1];

  50. //为chb绑定onclick事件处理函数

  51. chb.onclick=function(){

  52. // 将btn的disabled属性设置为和chb的checked属性相反

  53.     btn.disabled=!this.checked;   

  54. }

  55. //为btn绑定onclick事件处理函数 //this-->btn

  56. btn.onclick=function(){

  57. var txtName=form.userName;//防止闭包

  58. var txtContent=form.content;//防止闭包

  59. //        如果txtName的内容只由空字符组成或txtName的内容刚好又等于"请输入您的姓名"

  60. if(/^(s*|请输入您的姓名)$/.test(txtName.value)){

  61. txtName.focus();//就让txtName对象获得焦点

  62. txtName.className="error";

  63. }else if(/^(s*|请输入留言内容)$/.test(txtContent.value)){

  64. //否则,如果txtCotent的内容只由空字符组成或txtContent的内容刚好又等于"请输入留言内容"

  65. txtContent.focus();//就让txtContent获得焦点

  66. txtContent.className="error";

  67. }else{//        否则

  68. document.forms["msgForm"].submit()//提交form

  69. }

  70. }

  71. }
复制代码
下面是页面效果:

   212153p4vg33cslqvkylw9.png

如果在相应表格中什么信息都不输入,或者输入默认信息,表单是不会提交的。

例如,我这在姓名表格中输入信息,内容表格中什么都不输,其效果如下:

212153p4vg33cslqvkylw9.png      


2. 创建和删除节点:-->核心DOM

    1. 创建单个节点:

        1. 创建指定名称的空节点对象:

               var newElem=document.createElement("标签名");

            比如:var a=document.createElement("a");

                   <a></a>

        2. 设置新对象的关键属性:

            比如:a.innerHTML="go to weixin";

                     a.href="http://weixin.com";

                   <a href="http://weixin.com">go to weixin</a>

        3. a加入指定父元素下:

            1. 追加:parent.appendChild(newElem);

            2. 在之前插入:parent.insertBefore(newElem,已有元素)

            3. 替换:parent.replaceChild(newElem,被替换的元素);

例如:


  1. <!DOCTYPE HTML>

  2. <html>

  3. <head>

  4. <title>联动菜单</title>

  5. <meta charset="utf-8" />

  6. <script>

  7. /*使用 HTML DOM 的方式实现联动菜单*/

  8. var categories=[

  9. {"id":10,"name":'男装',"children":[

  10. {"id":101,"name":'西装'},

  11. {"id":102,"name":'休闲'},

  12. {"id":103,"name":'商务'}

  13. ]},

  14. {"id":20,"name":'女装',"children":[

  15. {"id":201,"name":'短裙'},

  16. {"id":202,"name":'连衣裙'},

  17. {"id":203,"name":'牛仔裤',"children":[

  18. {"id":2031,"name":'长裤'},

  19. {"id":2031,"name":'超短裙'},

  20. {"id":2031,"name":'七分裤'}

  21. ]},

  22. ]},

  23. {"id":30,"name":'童装',"children":[

  24. {"id":301,"name":'裤子'},

  25. {"id":302,"name":'套装',"children":[

  26. {"id":3021,"name":"0-3岁"},

  27. {"id":3021,"name":"3-6岁"},

  28. {"id":3021,"name":"6-9岁"},

  29. {"id":3021,"name":"9-12岁"}

  30. ]},

  31. {"id":303,"name":'手套'}

  32. ]}

  33. ];

  34. function createSelect(arr){//根据给定数组创建select

  35.      //创建空的select元素,保存在变量sel中

  36. var sel=document.createElement("select");

  37. //在sel中添加第一个option,内容为"-请选择-"

  38.     sel.add(new Option("-请选择-"));//用这个方法既能创建网页内容,又能创建value

  39. //遍历arr数组中每个商品类别的对象

  40. for(var i=0;i<arr.length;i++){

  41. //  在sel中新添加一个option,内容为当前对象的name属性值,value为当前对象的id值

  42.   sel.add(new Option(arr[i].name,arr[i].id));

  43. }

  44. //给sel绑定onchange事件

  45. sel.onchange=function(){//js中动态绑定的事件,

  46. //事件函数的this,就指当前select对象

  47.     //删除当前select之后的所有兄弟select

  48. while(this.nextSibling!=null){

  49.     this.nextSibling.parentNode.removeChild(this.nextSibling);

  50. }

  51.              //获得当前选中项的下标,-1修正,保存在i中

  52. var i=this.selectedIndex-1;

  53. //如果i不等于-1   

  54. if(i!=-1){//说明选的不是"请选择"

  55.   if(arr[i].children){//如果i位置的对象的children属性有效

  56. //   再次调用createSelect方法,传入arr数组中i位置对象的children数组(继续创建下级select)

  57.        createSelect(arr[i].children);

  58. }

  59. }

  60. }//找到id为category的div,追加sel

  61. document.getElementById("category").appendChild(sel); //注意getxxx与querySelector差别

  62. }

  63. window.onload=function(){

  64. createSelect(categories);

  65. }

  66. </script>

  67. </head>

  68. <body>

  69. <div id="category"></div>

  70. </body>

  71. </html>
复制代码
页面效果如下:

    212153p4vg33cslqvkylw9.png

选择 童装-->套装-->年龄段:

    212153p4vg33cslqvkylw9.png


性能问题:单个创建或删除节点都会导致重新layout

  解决:如果要创建父元素和子元素,都要先创建父元素,再将所有子元素加入父元素中。

            最后将父元素整体加入页面。

          如果父元素已经在页面上,就要将创建的平级元素先加入到文档片段对象中,再将稳定片段对象整体加入到父元素对象上


      2. 创建多个平级节点:

        1. 先创建文档片段对象:

           文档片段:内存中临时存储多个子元素的存储空间充当临时虚拟的父元素

            var frag=document.createDocumentFragment();

         2. 创建多个子元素对象,暂时先加入到文档片段中

             var child1=document.createElement("xxx");

                     frag.appendChild(child1);

             var child2=document.createElement("xxx");

                 frag.appendChild(child2);

          3. 将文档片段整体加入页面父元素中

                 parent.appendChild(frag);

              强调:frag不会出现在页面


    3. 删除节点:var deletedNode=parent.removeChild(子节点)

              强调:只有父元素才有权删除子节点

       子节点删除自己:child.parentNode.removeChild(child);
回复

使用道具 举报


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版| 赣南网

© 2013-2016 Comsenz Inc. Powered by Discuz! X3.4

用微信扫一扫

赣南网