前端基础:JavaScript DOM对象

JavaScript DOM对象

通过HTML DOM,可以访问JavaScript HTML文档的所有元素。
一、HTML DOM(文档对象模型)
当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。HTML DOM模型被构造为对象的树:

前端基础:JavaScript DOM对象_第1张图片

通过可编程的对象模型,JavaScript获得了足够的能力来创建动态的HTML。

  • JavaScript能够改变页面中的所有HTML元素;
  • JavaScript能够改变页面中的所有HTML属性;
  • JavaScript能够改变页面中的所有CSS样式;
  • JavaScript能够对页面中的所有事件作出反应;

二、DOM节点
1.节点类型:HTML文档中的每个成分都是一个节点,DOM是这样规定的:

  • 整个文档是一个文档节点;
  • 每个HTML标签是一个元素节点;
  • 包含在HTML元素中的文本是文本节点;
  • 每一个HTML属性是一个属性节点;

前端基础:JavaScript DOM对象_第2张图片

其中,document与element节点是重点。

2.节点关系
节点树中的节点彼此拥有层级关系,父(parent),子(child)和同胞(sibling)等属于用于描述这些关系。父节点拥有子节点,同级的子节点被称为同胞(兄弟或者姐妹)。

  • 在节点树中,顶端节点被称为根(root);
  • 每个节点都有父节点,除了根(它没有父节点);
  • 一个节点可以拥有任意数量的子节点;
  • 同胞是拥有相同父节点的节点;
    下图展示了部分节点树的节点关系:
    前端基础:JavaScript DOM对象_第3张图片

3.节点查找:有两种方式
方式一:直接查找节点

        // 节点查找(节点也就是一个个的标签)
        document.getElementById('idname');        //按照id查找,拿到的是一个标签对象
        document.getElementsByClassName('classname');        //按照class标签去找,得到的是一个数组里存放的标签
        document.getElementsByTagName('tagname');        //通过标签名去找,拿到的也是一个数组
        var a = document.getElementsByName('yuan');         //按照name属性去找,拿到的也是一个数组
        console.log(a);

length属性

    var ele = document.getElementById('div1');
    console.log(ele.length);        //返回undified

    var ele2 = document.getElementById('div3');
    console.log(ele2.length);        //返回undified

    var ele3 = document.getElementsByClassName('div2');
    console.log(ele3.length);         //返回1

    var ele4 = document.getElementsByTagName('p');
    console.log(ele4.length) ;        //返回1

    var ele5 = document.getElementsByName('haiyan');
    console.log(ele5.length); //返回1

    // id和name的不支持
   var div1=document.getElementById("div1");

    //支持;
   var ele= div1.getElementsByTagName("p");
   alert(ele.length);
    //支持
   var ele2=div1.getElementsByClassName("div2");
   alert(ele2.length);
    //不支持
   var ele3=div1.getElementById("div3");
   alert(ele3.length);
    //不支持
   var ele4=div1.getElementsByName("yuan");
   alert(ele4.length)

方式二:间接查找(导航查找节点,通过某个标签的位置去查找另一个标签,这是一个导航属性)

parentElement           // 父节点标签元素
children                // 所有子标签
firstElementChild       // 第一个子标签元素
lastElementChild        // 最后一个子标签元素
nextElementtSibling     // 下一个兄弟标签元素
previousElementSibling  // 上一个兄弟标签元素
//    方式二:导航查找
//
//
lallala
//
lkkaakkka
//
aaaaaaaaaaaaaa
//

hrllo

//
//注意:1.如果是数组的话后面切记getElementsByClassName('div2')[0] // 2.查找元素的那些方法Elements加了s的打印的就是数组 // 1,================== var ele = document.getElementsByClassName('div2')[0]; var ele1= ele.parentElement; console.log(ele1) ;//找div2标签的父亲 // 2.=============== var ele = document.getElementById('div1'); var ele1 = ele.children; console.log(ele1) ; //找到div1下的所有的子标签 // 3.=================== var ele = document.getElementById('div1'); var ele1 = ele.firstElementChild; console.log(ele1); //找到div1下的第一个子标签的元素 // 4.================== var ele = document.getElementById('div1'); var ele1 = ele.lastElementChild; console.log(ele1); //找到div1下的最后一个子标签的元素 // 5.=============== var ele = document.getElementsByName('haiyan')[0]; var ele1 = ele.nextElementSibling; console.log(ele1) ; //下一个兄弟标签元素 // 6.=============== var ele = document.getElementsByName('haiyan')[0]; var ele1 = ele.previousElementSibling; console.log(ele1) //上一个兄弟标签元素

4.节点操作
1)创建节点

createElement(标签名):创建一个指定名称的标签;

例如:
var tag = document.createElement("input");
tag.setAttribute("type", "text");

2)添加节点

追加一个子节点(作为最后的子节点)
somenode.appendChild(newnode);

把增加的节点放到某个节点的前面
somenode.inserBefore(newnode, 某个节点);

3)删除节点

removeChild():获得要删除的元素,通过父元素调用删除

4)替换节点

somenode.replaceChild(newnode, 某个节点);

5)节点属性操作

  • 获取文本节点的值:innerText、innerHTML
    innerText:不管是赋值还是取值,只能识别纯文本;innerHTML:既可以识别纯文本,也可以识别标签;
//    文本属性
//  1.innerText:不管你是赋值还是取值,只能识别纯文本
        var a1 = document.getElementsByClassName('c2')[0];
//        console.log(a1);
        //取值操作
        console.log(a1.innerText); //你好吗/
        console.log(a1.innerHTML); //你好吗/
        //赋值操作
        a1.innerText='Egon';
        a1.innerHTML='hello';

//  2.innerHtml:既可以识别纯文本,也可以识别标签
        var b1 = document.getElementsByClassName('c2')[1];
//        console.log(b1);
        //取值操作
        console.log(b1.innerText);
        console.log(b1.innerHTML);
        //赋值操作
        b1.innerText = 'lala';
        b1.innerHTML = '';
  • 属性(attribute)操作
    泛指所有的属性,getAttribute可以操作其他的,但是不可以操作class
    elementNode.setAttribute(name,value)    
    elementNode.getAttribute(属性名)        <-------------->elementNode.属性名(DHTML)
    elementNode.removeAttribute(“属性名”);
DIV

以上段落通过脚本修改。

三、DOM Event(事件)
1.事件类型

onclick        当用户点击某个对象时调用的事件句柄。
ondblclick     当用户双击某个对象时调用的事件句柄。

onfocus        元素获得焦点。               练习:输入框
onblur         元素失去焦点。               应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行验证.
onchange       域的内容被改变。             应用场景:通常用于表单元素,当元素内容被改变时触发.(三级联动)

onkeydown      某个键盘按键被按下。          应用场景: 当用户在最后一个输入框按下回车按键时,表单提交.
onkeypress     某个键盘按键被按下并松开。
onkeyup        某个键盘按键被松开。

onload         一张页面或一幅图像完成加载。

onmousedown    鼠标按钮被按下。
onmousemove    鼠标被移动。
onmouseout     鼠标从某元素移开。
onmouseover    鼠标移到某元素之上。
onmouseleave   鼠标从元素离开

onselect       文本被选中。
onsubmit       确认按钮被点击

2.绑定方式
方式一


div
div2

年后

hello

  • 创建节点:var ele_a = document.createElement('a');
  • 添加节点:ele_parent.appendChild(ele_img);
  • 删除节点:ele_parent.removeChild(ele_p);
  • 替换节点:ele_parent.replaceChild(新标签,旧标签);
// onload实例二



    
    Title

    



hello p

4.onkeydown事件
Event对象代表事件的状态,比如事件在其发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。事件通常与函数结合使用,函数不会再事件发生前被执行。event对象在事件发生时系统已经创建好了,并且在事件函数被调用时传给事件函数,我们获取仅仅只需要接手一下即可。比如:onkeydown,我们想知道哪个键被按下了,需要问下event对象的属性,这里就是keycode:




    
    Title







前端基础:JavaScript DOM对象_第4张图片

5.onsubmit事件
当表单再提交时触发,该事件也只能给form表单使用。应用场景:在表单提交验证用户输入是否正确,如果验证失败,在该方法中,我们应该阻止表单的提交:




    
    onsubmit事件
    
    
    



姓名:

年龄:

6.事件传播




    
    事件传播
    


7.search实例
模拟placeholder属性的功能,placeholder和value的区别:

  • placeholder:只是一个提示功能,不传值;
  • value:是一个默认的值,如果输入框中不写数据时,它会将默认的数据发送出去



    
    模拟placeholder属性的功能






8.onchange事件




    
    onchange事件





// 使用onchange事件实现菜单二级联动



    
    二级联动







9.onmouse事件




    
    onmouse事件
    





10.事件委派




    
    事件委派(委派给所有的子元素)


  • 111
  • 222
  • 333

四、节点操作
前面我们知道了JavaScript的属性操作,接下来了解一下节点操作,很重要!
创建节点:var ele= document.createElement("newnode");
增加节点:ele_parent.appendChild(ele_other);
删除节点:ele_parent.removeChild(ele_p);
替换节点:ele_parent.replaceChild(新标签,就标签);




    
    节点操作
    


年后

hello

  • 创建节点:var ele_a = document.createElement('a');
  • 添加节点:ele_parent.appendChild(ele_img);
  • 删除节点:ele_parent.removeChild(ele_p);
  • 替换节点:ele_parent.replaceChild(新标签,旧标签);

五、JavaScript DOM总结
1.JavaScript中for循环遍历,for循环遍历有两种:

  • 有条件遍历,例如:for(var i=0;i
  • for(var ele in ele_list){}



    
    Title




2.获取value属性值




    
    获取value值







3.表格示例(全选,反选,取消)




    
    表格示例





111 222 333
111 222 333
111 222 333
111 222 333

4.模态对话框




    
    Title
    


5.搜索框




    
    模拟placeholder属性的功能






6.tab切换




  
  tab
  



    

京东商城欢迎您

欢迎海燕来访

家用电器 家具 汽车 食品 女鞋 医疗保健

7.作用域链




    
    作用链域




8.JavaScript 作用域
任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。

  • 全局作用域(Global Scope)

在代码中任何地方都能访问到的对象拥有全局作用域,一般来说以下几种情形拥有全局作用域:(1)最外层函数和在最外层函数外定义的变量拥有全局作用域

var name="yuan";

    function foo(){
        var age=23;
        function inner(){
            console.log(age);
        }

        inner();
    }

    console.log(name);    // yuan
    //console.log(age);   // Uncaught ReferenceError: age is not defined
    foo();                // 23
    inner();              // Uncaught ReferenceError: inner is not defined

(2)所有未定义直接赋值的变量自动声明为拥有全局作用域

var name="yuan";

    function foo(){
        age=23;

        var sex="male"
    }
    foo();
    console.log(age);   //  23
    console.log(sex);   // sex is not defined

变量age拥有全局作用域,而sex在函数外部无法访问到。
(3)所有window对象的属性拥有全局作用域
一般情况下,window对象的内置属性都拥有全局作用域,例如:window.alert(),window.location,window.top等。

  • 局部作用域(Local Scope)
    和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所以在某些地方这种作用域被称为函数作用域。

  • 作用域链(Scope Chain)
    在JavaScript中,函数也是对象,实际上JavaScript中一切都是对象。函数对象和其他对象一样,拥有可以通过代码访问的属性和一系列仅供JavaScript引擎访问的内部属性。其中一个内部属性是Scope,由ECMA-262标准定义,该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,它决定了哪些数据能被函数访问。

//-----**********************例1*********************************

var s=12;
    function f(){
        console.log(s);
         var s=12;          // if s=12
        console.log(s)
    }
    f();

//-----**********************例2*********************************

var s=10;
function foo(){
  console.log(s);
  var s=5;
  console.log(s);
  function s(){console.log("ok")}// 函数的定于或声明是在词法分析时完成的,执行时已不再有任何操作

  console.log(s);
}

foo();

//-----***********************例3********************************

function bar(age) {

        console.log(age);
        var age = 99;
        var sex= 'male';
        console.log(age);
        function age() {
            alert(123)
        };
        console.log(age);
        return 100;
}

result=bar(5);

//-----********************************************************

结果分析
这里我们以例3来分析整个过程:当一个函数创建后,它的作用域链会被创建此函数的作用域中可访问的数据对象填充。在函数bar创建时,它的作用域链中会填入一个全局对象,该全局对象包含了所有全局变量,如下图:
前端基础:JavaScript DOM对象_第5张图片

解析到函数调用时,即bar(5),会生成一个active object的对象,该对象包含了函数所有的局部变量、命名参数、参数集合以及this,然后此对象会被推入作用域链的顶端,当运行期上下文被销毁,活动对象也随之销毁。新的作用域链如下图:
前端基础:JavaScript DOM对象_第6张图片

过程解析:

function bar(age) {

        console.log(age);
        var age = 99;
        var sex="male";
        console.log(age);
        function age(){
            alert(123);
        } ;
        console.log(age);
        return 100;
}

result=bar(5);

一 词法分析过程(涉及参数,局部变量声明,函数声明表达式):
    1-1 、分析参数,有一个参数,形成一个 AO.age=undefine;
    1-2 、接收参数 AO.age=5;
    1-3 、分析变量声明,有一个 var age, 发现 AO 上面有一个 AO.age ,则不做任何处理
    1-4 、分析变量声明,有一个 var sex,形成一个 AO.sex=undefine;
    1-5 、分析函数声明,有一个 function age(){} 声明, 则把原有的 age 覆盖成 AO.age=function(){};
二 执行过程:
    2-1 、执行第一个 console.log(age) 时,当前的 AO.age 是一个函数,所以输出的一个函数
    2-2 、这句 var age=99; 是对不 AO.age 的属性赋值, AO.age=99 ,所以在第二个输出的age是 99;
    2-3 、同理第三个输出的是 99, 因为中间没有改变 age 值的语句了。

          注意:执行阶段:
                        function age(){
                            alert(123)
                        } ;

            不进行任何操作,将执行语句复制给age这部操作是在词法分析时,即运行前完成的。

转载于:https://www.cnblogs.com/love9527/p/9120923.html

你可能感兴趣的:(前端基础:JavaScript DOM对象)