DOM和表单提操作

一、概念
1、DOM
DOM:Document Object Model 文档对象模型
要实现页面的动态交互效果,bom 操作远远不够,需要操作 html 才是核心。如何操作 htm,就是 DOM。简单的说,dom 提供了用程序动态控制 html 接口。DOM 即文档对象模型描 绘了一个层次化的节点树,运行开发人员添加、移除和修改页面的某一部分。dom 处于 javascript 的核心地位上。
每个载入浏览器的 HTML 文档都会成为 Document 对象。Document 对象使我们可以从脚 本中对HTML 页面中的所有元素进行访问。Document 对象是 Window 对象的一部分,可通过 window.document 属性对其进行访问。
2、节点
加载 HTML 页面时,Web 浏览器生成一个树型结构,用来表示页面内部结构。DOM 将这 种树型结构理解为由节点组成,组成一个节点树。对于页面中的元素,可以解析成以下几种类 型的节点:

节点类型       HTML内容                   例如
文档节点      文档本身                       整个文档document
元素节点       所有的HTML元素         a、div、p
属性节点       HTML元素内的属性     id、href、name、class
文本节点       元素内的文本               hello
注释节点       HTML中的注释           <!--   -->
clipboard1.png

二、元素节点的操作
当 HTML 文档在被解析为一颗 DOM 树以后,里面的每一个节点都可以看做是一个一个的 对象,我们成为 DOM 对象,对于这些对象,我们可以进行各式各样的操作,查找到某一个或 者一类节点对象,可以创建某种节点对象,可以在某个位置添加节点对象,甚至可以动态地删 除节点对象,这些操作可以使我们的页面看起来有动态的效果,后期结合事件使用,就能让我 们的页面在特定时机、特定的事件下执行特定的变换。

  1. 获取节点
    在进行增、删、改的操作时,都需要指定到一个位置,或者找到一个目标,此时我们就可 以通过 Document 对象提供的方法,查找、定位某个对象(也就是我们说的节点)。
    注意:操作 dom 必须等节点初始化完毕后,才能执行。处理方式两种:
    (1)把 script 调用标签移到 html 末尾即可;
    (2)使用 onload 事件来处理 JS,等待 html 加载完毕再加载 onload 事件里的 JS。
方法                                        描述 
getElementById()                   根据 id 获取 dom 对象,如果 id 重复,那么以第一个为准 
getElementsByTagName()     根据标签名获取 dom 对象数组 
getElementsByClassName() 根据样式名获取 dom 对象数组 
getElementsByName()           根据 name属性值获取 dom 对象数组,常用于多选获取值 
  1. 创建节点和插入节点
    * 创建节点
方法                       描述 
createElement()    创建一个新的节点,需要传入节点的标签名称,返回创建的元素对象 
createTextNode()   创建一个文本节点,可以传入文本内容 innerHTML 
                               也能达到创建节点的效果,直接添加到指定位置了 
    *  插入节点 
方法                         描述 
write()                      将任意的字符串插入到文档中 
appendChild()         向元素中添加新的子节点,作为最后一个子节点 
insertBefore()          向指定的已有的节点之前插入新的节点 
                                    newItem:要插入的节点 
                                    exsitingItem:参考节点    需要参考父节点 
  /**
         * 替换元素
         */
        function replaceNode() {
            // oldNode.parentNode.replaceChild(newNode,oldNode) 
            // 首先通过旧节点定位到父节点,然后用新的节点替换旧节点
            var cxy = document.getElementById("test");
            // 创建新节点
            var span = document.createElement("span");
            span.innerHTML = "攻城狮";
            cxy.parentNode.replaceChild(span,cxy);
        }
        
        /**
         * cloneNode()      复制节点
                var 复制好的节点 = 被复制的节点.cloneNode([true/false]);
                true:深度克隆,可以克隆结构和内容
                false(默认值):只克隆结构
         */
        function cloneValue() {
            // 得到被克隆的对象
            var cloneValue = document.getElementById("music");
            var newValue = cloneValue.cloneNode(false); // 浅度克隆,只克隆结构
            console.log(newValue);
            var deepValue = cloneValue.cloneNode(true); // 克隆结构及内容
            console.log(deepValue);
            
            // 将克隆好的结果追加到div中
            document.getElementById("mydiv").appendChild(deepValue);
        }
         
  1. 间接查找节点
方法|属性        描述 
childNodes ()   返回元素的一个子节点的数组 
firstChild()    返回元素的第一个子节点 
lastChild()     返回元素的最后一个子节点 
nextSibling     返回元素的下一个兄弟节点 
parentNode      返回元素的父节点 
previousSibling 返回元素的上一个兄弟节点 

// 得到div对象
var div1 = document.getElementById("div1");
// childNodes ()        返回元素的一个子节点的数组
console.log(div1.childNodes);
// firstChild()         返回元素的第一个子节点
console.log(div1.firstChild);
// lastChild()      返回元素的最后一个子节点
console.log(div1.lastChild);
// parentNode           返回元素的父节点
console.log(div1.parentNode);
// nextSibling      返回元素的下一个兄弟节点
console.log(div1.nextElementSibling); // 下一个元素节点(元素)
console.log(div1.nextSibling); // 下一个节点(包含文本节点)
//  previousSibling     返回元素的上一个兄弟节点
console.log(div1.previousElementSibling); // 上一个元素节点(元素)
console.log(div1.previousSibling); // 上一个节点(包含文本节点)
  1. 替换节点
方法|属性 描述 
replaceChild(newNode,oldNode) 用新的节点替换旧的节点 
    oldNode.parentNode.replaceChild(newNode,oldNode) 
    首先通过旧节点定位到父节点,然后用新的节点替换旧节点
  1. 克隆节点
方法|属性 描述 
cloneNode() 复制节点  
var 复制好的节点 = 被复制的节点.cloneNode([true/false]); 
    true:深度克隆,可以克隆结构和内容 
    false(默认值):只克隆结构 
  1. 删除节点
    方法|属性 描述
    removeChild() 从元素中移除子节点
    三、表单操作
    表单是我们页面向后台传输数据的一种非常常见的方式,在进行数据发送(请求发出)之 前,我们应该现在页面进行一系列数据合法性的验证,节省不必要的错误数据的传输,以及提 高用户的体验度。
    1、获取表单
document.表单名称 
document.getElementById(表单 id);
document.forms[表单名称]
document.forms[索引]; //从 0 开始 
<body>  
    <form id='myform' name="myform" action="" method="post">
    </form> 
    <form id='myform2' name="myform2" action="" method="post">
    </form> 
</body> 
<script>  
    //四种方式  var form =document.getElementById("myform");  
    form =document.myform;  
    form =document.forms["myform"];  
    form =document.forms[0];  
    console.log(form); 
</script> 

2、获取元素
* 获取 input 的元素

1)、通过 id 获取:document.getElementById(元素 id); 
2)、通过 form.名称形式获取: myform.元素名称;    name 属性值 
3)、通过 name 获取 :document.getElementsByName(元素名称)[索引] //从 0 开始 
4)、通过 tagName 数组 :document.getElementsByTagName('input')[索引] //从 0 开始 
 
<body>  
    <form id='myform' name="myform" action="" method="get">     
    姓名:<input type="text" id="uname" name="uname" value="zs"/>
    <br />   
    密码:<input type="password" id="upwd" name="upwd" value="123456" />
    <br />   <input type="hidden" id="uno" name="uno" value="隐藏域" />   
    个人说明:<textarea name="intro"></textarea>   
    <button type="button" onclick="getTxt();" >
    获取元素内容</button>  
    </form> 
</body> 
<script>  
    function getTxt(){   
        var uno =document.getElementById("uno");   
        var uname =myform.uname;   
        console.log(uname+"--------");   
        var upwd =document.getElementsByTagName('input')[1] ;   
        var intro =document.getElementsByName("intro")[0];       
        alert(uno.value+"-->"+uname.value +"-->"+upwd.value+"->"+intro.value);  
      } 
 </script> 
    *  获取 单选按钮 
前提:将一组单选按钮设置相同的 name 属性值 
(1)获取单选按钮组:   document.getElementsByName("name 属性值");  
(2)遍历每个单选按钮,并查看单选按钮元素的 checked 属性   若
    属性值为 true 表示被选中,否则未被选中  
选中状态设定:  checked=’checked’  或  checked=’true’  或  checked  
未选中状态设定:   没有 checked 属性   或  checked=’false’  
<form action="" name="myform">  
    <input type="text" name="inputName" value="aaa" /> 
     <input type="radio" name="rad" value="1" /> 1  
     <input type="radio" name="rad" value="2"  /> 2 
 </form>    
<script type="text/javascript"> 
  var radios = document.getElementsByName('rad')  
  //radios[0].checked = 'checked'  
  for(var i=0; i<radios.length; i++){  
      console.log(radios[i].checked + '---' + radios[i].value) 
   } 
</script> 
    *  获取 多选按钮 
操作方式与单选同理,不同之处在于可以多选 
var ufav=document.getElementsByName("ufav"); var favstr="";     
for (i=0;i<ufav.length;i++){        
     if(ufav[i].checked){             
     favstr+=ufav[i].value+",";      
     }    
} 
favstr =favstr.substr(0,favstr.length-1); 
    *  获取下拉选项 
(1)获取 select 对象: var ufrom = document.getElementById("ufrom"); 
(2)获取选中项的索引: var idx=ufrom.selectedIndex ; 
(3)获取选中项 options 的 value 属性值: 
var val = ufrom.options[idx].value; 
注意:当通过 options 获取选中项的 value 属性值时,  
若没有 value 属性,则取 option 标签的内容  
若存在 value 属性,则取 value 属性的值 
(4)获取选中项 options 的 text: 
var txt = ufrom.options[idx].text; 
选中状态设定:selected='selected'、selected=true、selected 
未选中状态设定:不设 selected 属性   
<body>
        来自:
            <select id="ufrom" name="ufrom" >
                <option value="-1" >请选择</option>
                <option selected="selected">北京</option>
                <option value="1" >上海</option>
            </select><br />
    </body>
 <script type="text/javascript">
        // (1)获取 select 对象
        var sel = document.getElementById("ufrom");
        
        // (2)获取选中项的索引
        var selectIndex = sel.selectedIndex;
        console.log("当前选中项的索引:" + selectIndex);
        
        // (3)获取选中项 options 的 value 属性值
        var value1 = sel.value;
        var value2 = sel.options[selectIndex].value;
        console.log("当前选中项的值:" + value1 + "," + value2);
        
        // (4)获取选中项 options 的 text
        var text1 = sel.options[selectIndex].innerHTML;
        var text2 = sel.options[selectIndex].text;
        console.log("当前选中项的文本:" + text1 + "," + text2);
        
    </script> 

3、提交表单

注:提交表单时,表单元素必须设置name属性值
提交类型:
    get请求
        参数会直接跟在地址栏后面显示,请求参数的长度有限,相对post而言不安全,
            不会自动刷新缓存;每次访问时优先获取缓存中的数据,所以请求速度快。
    post请求 (需要服务器的支持)
        参数不会跟在地址栏后面显示,请求参数长度不限(其实是有长度限制,
            与服务器相关),相对而言安全,会自动刷新缓存;请求速度相对而言慢。
通常做查询操作,使用GET请求;增删改使用POST请求。
提交表单
    (1)使用普通 button 按钮+onclick 事件+事件中编写代码:
    获取表单.submit();
    (2)使用 submit 按钮 + onclick="return 函数()" +函数编写代码: 
    最后必须返回:return true|false;
    (3)使用 submit 按钮/图片提交按钮 + 表单 onsubmit="return 函数();" +函数编写代码: 
    最后必须返回:return true|false;
<form action="01-获取表单.html" method="get">
            姓名:<input type="text" name="uname" />
            <input type="submit" value="提交" onclick="return checkForm1()"/>
        </form>
        
        <form action="01-获取表单.html" method="get" onsubmit="return checkForm2()">
            姓名:<input type="text" name="uname" />
            <input type="submit" value="提交" />
        </form>
        
        <form action="01-获取表单.html" method="get" >
            姓名:<input type="text" name="uname1" />
            <input type="button" value="提交" onclick="checkForm3()" />
            <span id="msg" style="font-size: 12px;color: red;"></span>
</form>

<script type="text/javascript">
        /*提交方式一:submit按钮 + onclick事件*/
        // 给submit按钮绑定点击事件,调用时需要使用"return 函数名()",定义的函数中需要return true或false;
        //如果return true,则提交表单;return false不提交;若直接return也会提交表单
        function checkForm1() {
            //return true; // 提交表单
            return false; // 不提交表单
            //return; // 无效,不会阻止表单提交
        }
        
        
        /*提交方式二:submit按钮 + onsubmit事件*/
        // 给表单对象绑定onsubmit事件,调用时需要使用"return 函数名()",定义的函数中需要return true或false;
        //如果return true,则提交表单;return false不提交;若直接return也会提交表单
        function checkForm2() {
            return true; // 提交表单
            //return false; // 不提交表单
            //return; // 无效,不会阻止表单提交
        }
        
        /*提交方式三:button按钮+点击事件*/
        // 给button按钮绑定点击事件,调用时需要使用"函数名()",如果满足要求则手动提交表单,否则return
        function checkForm3() {
            var uname = document.getElementsByName("uname1")[0].value;
            if ( uname == null || uname.trim() == "") {
                console.log("用户名不能为空!");
                document.getElementById("msg").innerHTML = "用户名不能为空!";
                return;
            }
            
            // 手动提交表单
            document.forms[2].submit();
        }
        
        
    </script>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容

  •   DOM(文档对象模型)是针对 HTML 和 XML 文档的一个 API(应用程序编程接口)。   DOM 描绘...
    霜天晓阅读 3,603评论 0 7
  •   DOM 1 级主要定义的是 HTML 和 XML 文档的底层结构。   DOM2 和 DOM3 级则在这个结构...
    霜天晓阅读 1,404评论 1 3
  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,467评论 1 11
  • 之前通过深入学习DOM的相关知识,看了慕课网DOM探索之基础详解篇这个视频(在最近看第三遍的时候,准备记录一点东西...
    微醺岁月阅读 4,432评论 2 62
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,375评论 1 45