• 前端基础之BOM和DOM


    JavaScript 分为ECMAScript,BOM和DOM

    BOM(Browser Object Model):浏览器对象模型,使JavaScript可以跟浏览器进行交互

    DOM(Document Object Model):文档对象模型,通过它来访问HTML文档的所有元素

    window对象

    所有的浏览器都支持window对象,它表示浏览器窗口

    所有JavaScript全局对象、函数以及变量均自动成为window对象的成员

    全局变量是window对象的属性,全局函数是window对象的方法。

    常用的window方法:

    window.innerHeight - 浏览器窗口的内部高度

    window.innerWidth - 浏览器窗口的内部宽度

    window.open() - 打开新窗口

    <script>
        // 第一个参数:url路径;第二参数:打开窗口的方式,默认新窗口;第三个参数:页面尺寸和位置
        // 在新窗口打开百度页面,新窗口宽400px,高400px,距离屏幕左侧400px,上方400px的地方打开
        window.open('https://www.zhihu.com', '', 'height=400px;width=400px;left=400px;top=400px');
    </script>
    

    window.close() - 关闭当前窗口

    <script>
        navigator.appName;
        navigator.appVersion;
    	// navigator.userAgent:表示访问用户是否是一个浏览器
        navigator.userAgent;
        navigator.platform
    </script>
    

    1577745014838

    <script>
    	location;
        // 获取当前页面的url
        location.href;
        // 跳转到指定的url
        location.herf = 'https://www.zhihu.com';
    </script>
    

    <script>
        // show:弹出提示框
    	function show(){
            alter(123);
        };
        // func:每隔3s执行一次show,9s后停止
        function func(){
            // 第一个参数单位是毫秒,3000毫秒=3秒,每3s执行一次show
            let t = setInterval(show, 3000);
            // 清除循环事件
            function inner(){
                clearInterval(t);
            };
            // 定时事件,9s之后执行inner
            setTimeout(inner, 9000);
        };
        
        func();
    </script>
    

    DOM(Document Object Model)

    当网页被加载时,浏览器会自动创建文档对象模型,也就是DOM。HTML DOM模型被称构造为对象的树

    HTML DOM树

    DOM标准规定HTML文档中的每个成员都是一个节点(node):

    节点对象 说明
    文档节点-document对象 整个文档
    元素节点-element对象 一个元素(标签)
    文本节点-text对象 元素(标签)中的文本
    属性节点-attribute对象 元素(标签)属性
    注释节点-comment对象 注释

    JavaScript 可以通过DOM创建动态的HTML

    1.可改变页面中所有HTML标签

    2.可改变页面中所有HTML标签属性

    3.可改变页面中所有CSS样式

    4.可对页面中所有事件作出反应,比如鼠标单击,鼠标双击等

    学习DOM分为2步:第一步,查找标签,第二步,操作标签

    查找标签

    直接查找,获取到的是当前标签对象

    document.getElementById:根据id 获取唯一的标签

    var spaEle = document.getElementById('d_span');
    

    document.getElementsByClassName:根据类属性值获取标签合集,返回值为元组

    // 通过类属性值获取一组标签,取第一个,索引从0开始
    var pEle = document.getElementByClassName('c1')[0];
    

    document.getElementsByTagName:根据标签名获取标签获取标签合集,返回值为元组

    // 通过标签名获取一组标签,去第一个,索引从0开始
    var divEle = document.getElementsByTagName('div')[0];
    

    间接查找,获取到的跟当前标签有关联的标签

    document.parentElement  // 获取父节点标签
    document.children  // 获取所有的子节点
    firstElementChild  // 第一个子标签
    lastElementChild  // 最后一个子标签
    nextElementSibling  // 下一兄弟标签
    previousElementSibling  // 上一个兄弟标签
    

    节点操作

    createElement(标签名)创建节点

    var divEle = document.createElement('div');
    

    appendChild(newnode)追加一个子节点

    // 创建一个a标签
    var aEle = document.createElement('a');
    // 设置a标签的href属性
    aEle.href = 'https://www.cnblogs.com/xiaoyuanqujing/';
    
    // 创建一个div标签
    var divEle = document.createElement('div');
    // 将a标签添加到div标签中
    divEle.appendChild(aEle);
    

    insertBefore(newnode, somenode)将新标签添加到某个标签前

    // 创建一个p标签
    var pEle = document.createElement('p');
    // 将p标签添加a标签前
    divEle.insertBefore(pEle, aEle);
    

    removeChild(childNode):删除节点,通过父标签调用该方法删除

    // 获取父节点div
    var divEle = document.getElementsByTagName('div')[0];
    // 获取要删除的节点span
    var spaEle = document.getElementsByClassName('c1')[0];
    // 删除span节点
    divEle.removeChild(spaEle);
    

    replaceChild(newNode, childNode):替换节点,通过父标签调用该方法替换

    // 获取父节点div
    var divEle = document.getElementsByTagName('div')[0];
    // 获取被替换的子节点a
    var aEle = document.getElementById('a_id');
    // 创建新标签img
    var imgEle = document.createElement('img');
    // 替换标签
    divEle.replaceChild(imgEle, aEle);
    

    innerText:标签节点文本

    innerHTML:标签节点文本和标签信息

    var divEle = document.getElementById('div_id');
    divEle.innerText;  // 获取标签文本 --div
    divEle.innerHTML;  // 获取标签内的文本信息以及子标签和其文本信息
    
    // 设置标签文本信息
    divEle.innerText='<h1>这是p标签</h1>';  // 标签文本:<h1>这是p标签</h1>
    divEle.innerHTML='<h1>这是p标签</h1>';  // 标签文本:这是p标签,且浏览器中,该文本是一号标题样式
    

    attribute属性节点操作

    var divEle = document.getElementsByTagName('div')[0];
    // 通用获取属性值 getAttribute('属性名'),自定义属性也可获取
    divEle.setAttribute('username', 'dawn');
    // 通用设置属性值 setAttribute('属性名', '属性名'),自定义属性也可设置
    divEle.getAttribute('username');
    // 删除属性 removeAttribute('属性名')
    divEle.removeAttribute('username');
    
    // 默认属性的第二种获取设置方式
    // 获取默认属性值
    var imgEle = document.getElementById('img_id');
    alert(imgEle.src);
    // 设置默认属性的值
    imgEle.src='url'
    

    需要注意的是,

    1.当我们需要获取用户输入的内容时,统一使用elementNode.value方式

    适用于input,select,textarea标签

    var inpEle = document.getElementById('input_id');
    // 获取用户在input标签中输入的内容
    console.log(inpEle.value);
    var selEle = document。getElementById('select_id');
    // 获取用户选择的下拉框内容
    console.log(selEle.value);
    var txtEle = document.getElementById('text_id');
    console.log(txtEle.value);
    

    2.input标签,type='file'时,直接获取.value,获取到的是一个路径,正确的取值方式为elementNode.files[0]

    var fileEle = document.getElementById('file_id');
    // 获取到的是路径
    console.log(fileEle.value);
    // 文件的获取方式
    console.log(fileEle.files[0]);
    

    class的操作

    className // 获取所有样式类型,返回一个字符数组
    
    classList.remove(cls)  // 删除指定类
    classList.add(cls)  // 添加类
    classList.contains(cls)  // 存在返回true,否则返回false
    classList.toggle(cls)  // 属性存在则删除,否则添加。典型示例:红绿灯
    

    CSS的操作

    语法:elementNode.style.样式名

    注意:样式名中,所有带 -的属性,去掉 -,将紧接着的单词首字母大写

    var divEle = document.getElementsByTagName('div');
    // 设置常规样式
    divEle.style.width=100px;
    divEle.style.color='orange';
    
    // 带 - 的样式
    divEle.style.backgroundColor='blue';
    divEle.style.borderLeft = '3px red solid';
    

    事件

    个人理解,就是用户在浏览器中操作,浏览器根据这些操作给予不同的响应机制

    // 鼠标点击事件
    onclick  // 点击某个对象调用的事件句柄,大白话:文档对象的单击事件
    ondblclick  // 双击某个对象调用的事件句柄,大白话:文档对象的双击事件
    onmousedown  // 鼠标按钮被按下
    onmousemove  // 鼠标移动
    onmouseout  // 鼠标移开
    onmouseover  // 鼠标悬浮在元素之上
    
    // 光标事件
    onfocus  // 元素获得焦点事件,大白话:文档对象(如:input文本框)获取光标的事件
    onblur  // 元素失去焦点事件,大白话:文档对象(如:form表单中标签)失去光标的事件
    onchange  // 标签文本域内容发生改变,大白话:文档对象(如:form表单中标签)的value值发生改变
    
    // 键盘事件
    onkeydown  // 某个键盘按键被按下,大白话:键盘上按回车键执行的操作
    onkeypress  // 某个键盘按键按下并松开
    onkeyup  // 某个键盘按键被松开
    
    // 标签事件
    onload  // 文档页面或图片完成加载的事件
    onselect  // 下拉框的选项被选中时发生的事情,比如两个select标签产生联动效果
    onsubmit  // form表单对象提交时发生的事情
    

    绑定方法

    方式一:行内绑定

    <!--this 表示当前正在操作的元素-->
    <div id='d1' onclick='changeColor(this);'>
    	click me
    </div>
    <script>
    	function changeColor(ele) {
            ele.style.backgroundColor='purple';
        }
    </script>
    

    方式二:在script标签中用js代码实现

    <div id='d2'>
    	click me
    </div>
    <script>
    	var divEle = document.getElementById('d2');
        divEle.onclick=function(){
          this.fontSize=18px;
          this.color='white';
        };
    </script>
    

    事件案例

    1. 计时器的应用(需要注意的是,开启和关闭的必须是同一个事件对象)
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>计时器的应用</title>
        <!--jQuery 的CDN服务地址,建议在本地保存一份jQuery包-->
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    </head>
    <body>
    <p>
        <label for="txt_time">当前时间:</label>
        <input type="text" id="txt_time" value="">
    </p>
    <p>
        <input type="button" id="btn_begin" value="开始">
        <input type="button" id="btn_end" value="结束">
    </p>
    
    <script>
        // 显示当前日期时间
        function show_time() {
            var txtEle = document.getElementById('txt_time');
            // Date():获取日期时间;toLocaleString():格式化时间
            var str_time = new Date().toLocaleString();
            txtEle.value = str_time;
        }
    
        show_time();
        var btn_begin = document.getElementById('btn_begin');
        var btn_end = document.getElementById('btn_end');
        // 定义接收循环事件的变量,防止关闭的不是当前循环事件
        var t;
        btn_begin.onclick = function () {
            // 只需要一个循环事件
            if(!t){
                t = setInterval(show_time, 1000);
            }
        };
    
        // 使用变量接收了循环事件,保证了操作的是同一个循环事件对象
        btn_end.onclick = function () {
            // 关闭当前循环事件
            clearInterval(t);
            t = undefined;
        };
    
    </script>
    </body>
    </html>
    

    2.搜索框示例

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>搜索框示例</title>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    </head>
    <body>
    <input id="d1" type="text" value="请输入关键字">
    
    <script>
        // 获取搜索框
        var inpEle = document.getElementById('d1');
        // 搜索框绑定聚焦事件
        inpEle.onfocus = function () {
            // 搜索框文本为[请输入关键字],则清空
            if (inpEle.value === '请输入关键字') {
                inpEle.value = '';
            }
        };
    
        // 搜索框绑定失去焦点事件
        inpEle.onblur = function () {
            // 搜索框中没有没有任何内容,则赋予初始值[请输入关键字]
            if (!inpEle.value.length) {
                inpEle.value = '请输入关键字';
            }
        };
    </script>
    </body>
    </html>
    

    3.多个下拉框select联动示例

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <select name="" id="pro">
        <option value="请选择省份">--请选择省份--</option>
    </select>
    <select name="" id="city">
        <option value="请选择省份">--请选择城市--</option>
    </select>
    <script>
        // 数据
        data = {"河北省": ["廊坊", "邯郸"], "北京": ["朝阳区", "海淀区"], "山东": ["威海市", "烟台市"]};
        // 获取省份下拉框对象
        pro_s = document.getElementById('pro');
        // 获取城市下拉框对象
        city_s = document.getElementById('city');
    
        // 为省级下拉框对象增加选项
        for (let i in data) {
            // 创建选项对象
            pro_op = document.createElement('option');
            // 为选项对象赋值
            pro_op.value = i;
            pro_op.text = i;
            // 将每个选项对象绑定到select对象中
            pro_s.appendChild(pro_op);
        }
    
        // 联动效果,根据省级下拉框选中的省份,获取对应的城市
        pro_s.onchange = function () {
            // this.options 省份下拉框所有选项
            // this.selectedIndex 省份下拉框选中的项的innerHTML文本
            var pro = (this.options[this.selectedIndex]).innerHTML;
            // 获取字典中的城市
            var citys = data[pro];
            // 清空option
            city_s.innerHTML = "";
    
            // 将城市绑定给城市下拉框
            for (let i=0;i<citys.length;i++) {
              // 创建选项对象
              var city_op = document.createElement("option");
              // 将城市数据赋值给城市选项对象
              city_op.innerHTML = citys[i];
              // 将每个选项对象绑定到select对象中
              city_s.appendChild(city_op);
            }
        }
    </script>
    </body>
    </html>
    

    注意

    在编写JavaScript的时候,可能会出现页面尚未加载完毕,js代码先执行的问题。解决方式有两种:

    1.将 script标签以及其内容放在 body标签中的最后一行(推荐使用这种方式)

    2.使用window.onload()时间, 该方法在页面加载过程结束的时候触发

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script>
            // 在onload方法中编写js代码
        	window.onload(
            	// js代码
            );
        </script>
    </head>
    <body>
        ……
    </body>
    </html>
    
  • 相关阅读:
    需求的陷阱
    VS2008 NumericUpDown控件 内容全选
    KeyPress 事件中 keycode对应的按键
    C#发送邮件
    Stream 和Byte[] 之间的转换
    SQL ISNULL() 函数
    修改struts2的.action后缀名
    #pragma data_seg
    VBA中Option的四种用法
    SetWindowsHookEx
  • 原文地址:https://www.cnblogs.com/xiaodan1040/p/12140299.html
Copyright © 2020-2023  润新知