03WebAPIs

本文详细介绍了DOM操作中的元素获取方法,包括通过ID、类名、标签名、选择器以及HTML5新增的API。同时涵盖了事件基础、事件流、鼠标和键盘事件,以及BOM中的window、location和navigator对象,以及history对象的使用。
摘要由CSDN通过智能技术生成

DOM

获取元素

通过ID进行获取
    返回的是一个元素对象
    文档.获取 元素 通过 id ('字符串')  驼峰命名
    var timer = document.getElementById('id名称');
    console.log(timer);
    //打印元素对象更好的去查看元素的属性和方法
    console.dir(timer);
    
根据标签名获取
    返回的是一个元素集合,以伪数组的形式存储
    文档.获得 元素 通过 标签 名称('字符串')
    var lis = document.getElementsByTagName('li');
    遍历
    for (var i = 0; i < lis.length; i++) {
    	console.log(lis[i]);
    }
    
获取父元素指定的标签名的子元素:
    var ol = document.getElementById('ol');
    var lis1 = ol.getElementsByTagName('li');
    
HTML5新增方法
    根据类名进行获取
        返回的是一个元素集合,以伪数组的形式存储
        文档.获得 元素 通过 类名 名称('字符串')
        var boxs = document.getElementsByClassName('box');
        console.log(boxs);
        
    更具选择器返回第一个指定对象
        字符串可以是所有选择器
        var box1 = document.querySelector('.box');
        console.log(box1);
        var nav = document.querySelector('#nav');
        console.log(nav);

    更具选择器返回所有对象
        返回的是一个伪数组
        var divs = document.querySelectorAll('div');
        console.log(divs);

    获取body
        var body = document.body;
        console.dir(body);

    获取html
        var html = document.documentElement;
        console.dir(html);

事件基础

事件的组成(事件三要素):
    事件源(事件被触发的对象)
    事件类型(如何触发)  
    事件处理程序(通过一个函数赋值的方式进行完成)

    鼠标点击     onclick  
    鼠标经过     onmouseover  
    鼠标离开     onmouseout  
    获得鼠标焦点  onfocus  
    失去鼠标焦点  onblur  
    鼠标弹起     onmouseup  
    鼠标按下     onmousedown

    btn.onclick = function () {

    }

操作元素

改变元素内容

InnerText非便准标签
    在用做改变内容时:不能识别html标签,同时去除空格和换行
    事件源.innerText = '<strong>今天</strong>真美好'
    在用做文件读取时:去除标签同时去除空格和换行
    console.log(事件源.innerText);

innerHTML识别html标签  满足W3C标准
	在做改变内容时:能识别html标签,同时保留空格和换行
    事件源.innerHTML = '<strong>今天</strong>真美好';
    在用做文件读取时:保留标签同时保留空格和换行
    console.log(事件源.innerHTML);

元素可以不用添加事件,改变元素内容
    事件源.innerText = '<strong>今天</strong>真美好'
    事件源.innerHTML = '<strong>今天</strong>真美好';

也可以通过添加事件改变元素内容
    事件源.事件类型 = function () {
        事件源.innerText = '<strong>今天</strong>真美好'
        事件源.innerHTML = '<strong>今天</strong>真美好';
    }

常用属性操作

img的src属性
    事件源.事件类型 = function () {
        //img的src属性
        img事件源.src = "images/zxy.jpg";
    }
    
input的value属性和disabled属性
    事件源.事件类型 = function () {
        //修改表单里面的值通过value修改
        input事件源.value = '被点击了';
        //要求某个表单被禁用,不能再点击disabled 我们想要这个按钮button禁用
        button事件源.disabled = true;
        //表单禁用
        input事件源.disabled =true;
    }

修改样式
	使用element.style获得修改元素样式
        适合元素较少,功能简单的情况
        事件源.事件类型 = function () {
            //产生的为行内样式,权重较高,命名方式驼峰命名
            需要修改的事件源.style.backgroundColor = 'red';
            //this指向事件函数的调用者
            this.style.width = '250px';
        }
    
    element.className修改样式
        适合样式较多,功能复杂的情况    类名会改变
        1、创建一个css类名样式 将样式添加在里面
        2、通过element.className修改样式
        事件源.事件类型 = function () {
            this.className = '类名';
            //如果要保留原先的类名   多类名选择器
            //this.className = '原先类名 需要添加的类名';
        }



排他思想

先排除所有人,在修改我自己
//获取所有元素
var btns = document.querySelectorAll('button');
    for (var i = 0; i < btns.length; i++) {
        btns[i].onclick = function () {
            //去除所有元素
            for (var j = 0; j < btns.length; j++) {
            btns[j].style.backgroundColor = '';
        }
            //点击自己变色
            this.style.backgroundColor = 'pink';
    }
}

自定义属性

自定义属性: 属性="属性值"
	<div id="demo" index="1"></div>
设置H5自定义属性
    以date-开头做为属性名并赋值 
    <div data-index="1"></div>

获取属性的值
    element.属性
        获取的为内置属性,元素本身自带的属性
        console.log(div.id);
        
    element.getAttribute('属性')
        主要获得自定义属性,可以由程序员自定义的属性
        console.log(div.getAttribute('id'));
		console.log(div.getAttribute('index'));
		
	H5新增方法
		dataset是一个集合里面存放了所有data开头的自定义属性
		只能获取data-开头的属性
		console.log(div.dataset.index);
		console.log(div.dataset['index']);
		
        自定义属性设置时中间可以用短横线连接data-list-name="andy
        <div id="demo" data-list-name="andy"></div>
        
        获取时不需要中间短横线连接,要进行驼峰命名listName
        console.log(div.dataset.listName);
        console.log(div.dataset['listName']);

设置属性的值
    element.属性= '值';
        设置内置属性
        div.id = 'text';
    
    element.setAttribute('属性', '值');
    	主要针对自定义属性
    	div.setAttribute('index', '2');

移除属性
	element.removeAttribute('属性');
		div.removeAttribute('index');

节点操作

节点层级

结点:
	至少拥有结点类型nodeType,节点名称nodeName,节点值nodeValue三个基本属性
    元素结点nodeType为1
    属性结点nodeType为2
    文本结点nodeType为3(文本节点包含文字、空格、换行等)

父节点 
	node.parentNode  
	如果找不到父节点就返回为空
    console.log(div.parentNode);

子节点 
	parentNode.childNodes
	childNodes所有的子节点包含 元素节点 文本节点等
    console.log(ul.childNodes);

获取所有子元素节点
    通过对parentNode.childNodes获取所有的子节点,在通过元素节点的nodeType为1进行判断获取
    for (var i = 0; i < ul.childNodes.length; i++) {
        if(ul.childNodes[i].nodeType == 1){
        	console.log(ul.childNodes[i]);
        }
    }
    
    通过parentNode.children获取  非标准   返回的是一个伪数组
    console.log(ul.children);

获取第一个或最后一个子节点
	firstChild 第一个子节点  包含所有节点
	console.log(ul.firstChild);
	
	latChild 最后一个子节点  包含所有节点
	console.log(ul.lastChild);
	
	firstElementChild  第一个子元素节点   ie9以上支持
	console.log(ul.firstElementChild);
	
	lateElementChild  最后一个子元素节点  ie9以上支持
	console.log(ul.lastElementChild);
	
	实际开发中获取第一个子元素节点
	console.log(ul.children[0]);
	
    实际开发中获取最后一个子元素节点
    console.log(ul.children[ul.children.length - 1]);

获取兄弟节点
	node.nextSibling  获取当前元素下一个兄弟节点  包含所有节点
	console.log(ol.nextSibling);
	
	node.previousSibling 获取当前元素上一个兄弟节点  包含所有节点
	console.log(ol.previousSibling);
	
	node.nextElementSibling     获取当前元素下一个兄弟元素节点   ie9以上支持
	console.log(ol.nextElementSibling);

	node.previousElementSibling     获取当前元素上一个兄弟元素节点   ie9以上支持
	console.log(ol.previousElementSibling);

	实际开发中通过封装函数进行获取   获取当前元素下一个兄弟元素节点
	function getNextElementSibling(element) {
        var el = element;
        //使el等于el的下一个节点,直到出现为元素节点时返回节点
        while (el = el.nextSibling){
            if (el.nodeType === 1){
            	return el;
            }
        }
        return null;
	}
	console.log(getNextElementSibling(ol));

节点操作

创建节点
	document.createElement('元素')
    var li = document.createElement('li');
    var p = document.createElement('p');

添加节点
	添加到父元素子节点末尾  相当于CSS中after伪元素
		node.appendChild(child)
    	ul.appendChild(创建的节点);

	添加到父元素指定节点元素前面  相当于CSS中before伪元素
		node.insertBefore(child,指定节点元素)
        div.insertBefore(p,span);
    
    添加在子元素的第一个
    	node.insertBefore(child, node.children[0])

删除节点  
	node.removeChild(child)
    div.removeChild(span);

复制节点
	node.cloneNode()
	括号中为空或者false则为浅拷贝,只复制节点本身,不克隆里面子节点  括号中为true则为深拷贝,克隆里面子节点
    var cloneDiv = div.cloneNode();
    div.appendChild(cloneDiv);

事件高级

注册事件

传统方式注册事件
	注册事件唯一性,同一个元素同一个事件只能设置一个处理函数,最后注册的处理函数将覆盖前面注册的处理函数
    事件源.事件对象 = function () {

	}       

方法监听注册事件 ie9之前不支持
	事件.添加 事件 监听 ('事件类型不用带on', 事件处理函数),同一个元素同一个事件可以添加多个监听器(事件处理程序)
    事件源.addEventListener('事件对象',function () {
            
    })
      
兼容性处理   先照顾大多数浏览器,在照顾特殊处理器
    function addEventListener(element,eventName,fn){    //事件对象  事件处理方式  函数
        //判断当前浏览器是否支持 addEventListener方法
        if(element.addEventListener){
            element.addEventListener(eventName ,fn); //第三个参数默认为false
        }else if (element.attachEvent){   //ie9之前浏览器使用
            element.attachEvent('on'+eventName, fn);
        }else {
            //相当于 element.onclick = fn
            element['on' + eventName] = fn;
        }
    }

删除事件

传统方式删除事件
    事件源.事件对象 = function () {

        //传统方式删除事件
        this.onclick = null;
    }
        
方法监听的方式删除事件        
	divs[1].addEventListener('click', fn);   //调用函数不需要添加小括号
	function fn() {
		
		//方法监听的方式删除事件
		//事件. 删除 事件 监听('事件类型不用带on', 事件处理函数)
		divs[1].removeEventListener('click', fn);
}

删除事件兼容性问题
    function removeEventListener(element, eventName, fn) {     //事件对象  事件处理方式  函数
        if (element.removeEventListener){
            element.removeEventListener(eventName,fn)  //第三个参数默认为false
        }else if (element.detachEvent){   //ie9之前浏览器使用
            element.detachEvent('on'+eventName, fn);
        }else {
            //相当于 element.onclick = null
            element['on' + eventName] = null;
        }
    }

事件流

事件流:
	事件发生时会在元素节点之间按着特定的顺序传播,这个传播的过程称之为事件流
    捕获阶段:从DOM最顶节元素开始,逐级向下传播到具体元素接收的过程
    当前目标阶段:
    冒泡阶段:从具体元素开始接收,逐级向上转播到DOM最顶层节点的过程
    js代码中只能执行捕获或者冒泡其中一个阶段
    onclick和attachEvent只能得到冒泡阶段
    addEventListener('事件处理方法', 函数, unCapture) 如果第三个参数是true则为事件捕获阶段调用事件处理程序;如果为false或者不写则表示事件冒泡阶段调用事件处理程序
    有的事件没有冒泡:onblur onfocus onmouseenter onmouseleave
    
事件捕获
	第三个参数为true
    从上向下捕获,当点击小盒子时会先执行父盒子函数在执行子盒子函数  先
    son.addEventListener('click',function () {
        console.log('son');
    },true)
    father.addEventListener('click',function () {
        console.log('father');
     },true)

事件冒泡
	第三个参数为false或者不写
	从下向上冒泡,当点击小盒子时会先执行子盒子函数在执行父盒子函数
	son.addEventListener('click',function (e) {
    	console.log('son');
		//阻止冒泡
		e.stopPropagation();
	})
	father.addEventListener('click',function () {
		console.log('father');
	})

事件对象

事件对象
	event 就是一个事件对象 写道监听函数小括号里面 可以当作形参看待  可以该名字 通常用 e evt event
	事件对象只有有了事件才会存在,他是系统给我们自动创建的,不需要我们传递参数
	事件对象是我们事件一系列的集合,跟事件相关的 比如鼠标点击就包含了鼠标的相关信息,键盘敲入就包含键盘相关信息
    div.onclick = function (event) {
        //console.log(event);
        //ie6、7、8会有兼容性问题,通过window.event获取
        event = event || window.event;
        console.log(event);
        //返回事件类型
        console.log(event.type);
    }

    ul.onclick = function (e) {
        //this 哪个元素绑定事件就返回哪个元素
        console.log(this);
        //e.target 点击哪个元素就返回哪个元素   返回触发事件
        console.log(e.target);
    }

    a.addEventListener('click',function (e) {
        //阻止默认事件   例如超链接不跳转
        e.preventDefault();
    })

事件委托

事件委托:
	不是每个字节点单独设置监听器,而是在事件监听器设置在父节点上,然后利用冒泡原理影响每个子节点
    var ul = document.querySelector('ul');
    ul.addEventListener('click',function (e) {
    console.log('点我');

        //获得点击对象
        e.target.style.backgroundColor = 'pink';

        //排他思想
        for (var i = 0; i < ul.children.length; i++) {
            ul.children[i].onclick = function () {
                //去除所有元素
                for (var j = 0; j < ul.children.length; j++) {
                	ul.children[j].style.backgroundColor = '';
            	}
                //点击自己变色
                this.style.backgroundColor = 'pink';
            }
        }
    })

常用鼠标事件

常用鼠标事件:
    鼠标点击左键触发 onclick
    鼠标经过触发 onmouseover
    鼠标离开触发 onmouseout
    获得鼠标焦点触发 onfocus
    失去鼠标焦点触发 onblur
    鼠标移动触发 onmousemove
    鼠标弹起触发 onmouseup
    鼠标按下触发 onmousedown

禁用右键菜单
    document.addEventListener('contextmenu',function (e) {
        //阻止默认事件
        e.preventDefault();
    })
静止鼠标选中
    document.addEventListener('selectstart', function (e) {
    	e.preventDefault();
    })
鼠标事件对象
    document.addEventListener('click', function (e) {
        console.log(e);
        //返回鼠标相对于浏览器窗口的可视区域X坐标
        console.log(e.clientX);
        //返回鼠标相对于浏览器窗口的可视区域Y坐标
        console.log(e.clientY);
        //返回鼠标相对于文档页面的X坐标   ie9以上支持
        console.log(e.pageX);
        //返回鼠标相对于文档页面的Y坐标
        console.log(e.pageY);
        //返回鼠标相对于电脑屏幕的X坐标
        console.log(e.screenX);
        //返回鼠标相对于电脑屏幕的Y坐标
        console.log(e.screenY);
    })

常用键盘事件

常用键盘事件
    某个键盘被松开时触发 onkeyup
        document.addEventListener('keyup', function (e) {
            console.log('我被弹起了up');
            console.log(e);
        })
    某个键盘被按下时触发 onkeydown
        document.addEventListener('keydown', function () {
            console.log('我被按下了down');
        })
    某个键盘被按下时触发 但是不能识别功能键 onkeypress
        document.addEventListener('keypress', function () {
            console.log('我被按下了press');
        })
    三个事件的执行顺序为:onkeydown onkeypress onkeyup
    
    键盘对象中的keyCode属性可以得到相应键的ASII码值
    	keyup和keydown不区分大小写得到的是小写ASII;keypress区分大小写
    	console.log(e.keyCode);
    	
    键盘对象中的key属性可以得到相应键输入值
    	console.log(e.key);

BOM

window常见事件

 窗口加载事件
     当文档中内容完全加载完成后(包括图像,脚本文件,CSS,文件等)就会触发该事件
     传统注册事件只能写一次,如果写多个则以最后一个为准
     window.onload = function () {

    }
    
    window.addEventListener('load', function () {
    
    })
    
    仅当DOM加载完成后(不包括样式表,图片,flash等)触发    ie9以上支持
    document.addEventListener('DOMContentLoaded', function () {

    })
    
调整窗口大小事件
    只要窗口大小发生变化就会触发事件
    window.onresize = function () {

	}

    window.addEventListener('resize', function () {
   
    })
    
     // 获取屏幕宽度
    console.log(window.innerWidth);

定时器

setTimeout()定时器
    window.setTimeout(调用函数, [延迟毫秒数]);
    当时间到了就调用函数  window调用时可以省略
    定时器可能有很多,经常给定时器赋值一个标识符
    var time = setTimeout(calkback, 2000);
    function calkback() {
    }
    
    停止定时器
    window.clearTimeout(定时器名称);
    clearTimeout(time);
    
setInterval()定时器
    window.setInterval(回调函数, [间隔毫秒数])
    window可以省略  反复调用一个函数,每隔一段时间调用一次
    var time = setInterval(function () {
    
    }, 1000)
    
    停止定时器
    window.clearInterval(定时器名称);
    clearInterval(time);

JS执行机制

同步:前一个认为执行结束后执行后一个任务
异步:同时进行多个任务

同步任务都是在主线程上执行,形成一个执行栈
异步是通过回调函数实现的  异步任务(回调函数)是放在任务队列(消息队列)当中
异步任务通常有三种类型
普通事件:如click,resize等
资源加载:load,error等
定时器:setInterval,setTimeout

先执行执行栈中的同步任务,遇见异步任务(回调函数),放到任务队列(消息队列)当中,等待同步任务全部执行,系统就会按次序读取任务队列中的异步任务。

location对象

location属性:用于获取或设置窗体的URL,并且可以用于解析URL
URL统一资源定位符
一般语法格式
通信协议://主机(域名)[:端口号]/路径/[?参数]#片段
protocol://hose[:port]/path/[?query]#fragment
http://www.itcast.cn/index.html?name=andy&age=18#pink

location对象的属性
	返回主机名host  返回端口号port  返回路径pathname  返回片段hash
    获取URL
    console.log(location.href);
    设置URL,跳转的新的页面
    location.href = 'http://www.itcast.cn'
    获取参数
    location.search
    
location对象的方法
    与href一样可以跳转页面,保留历史浏览记录可以进行后退操作
    location.assign(URL);
	跳转页面,不保留历史浏览记录不能进行后退操作
	location.replace(URL);
	重新刷新页面  相当于属性按钮或者f5  如果参数为true表示强制刷新相当于ctrl+f5
	location.reload();

navigator对象

 if ((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) {
            window.location.href = ""; //手机
        }else {
            window.location.href = ""; //电脑
        }

history对象

后退:history.back()
前进:history.forward()
前进后退:history.go(参数)  如果参数为1前进一个网页,如果参数为-1后退一个网页
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值