WebAPI 介绍
浏览器提供的一套操作浏览器功能和页面元素的API (BOM和DOM)
掌握常见的浏览器提供的API的调用方式 MDN-Web API
JavaScript的组成
image.pngECMAScript - JavaScript的核心
定义了javascript
的语法规范, JavaScript的核心,描述了语言的基本语法和数据类型,ECMAScript是一套标准,定义了一种语言的标准与具体实现无关
BOM - 浏览器对象模型
一套操作浏览器功能的API
通过BOM可以操作浏览器窗口,比如:弹出框、控制浏览器跳转、获取分辨率等
DOM - 文档对象模型
一套操作页面元素的API
DOM可以把HTML看做是文档树,通过DOM提供的API可以对树上的节点进行操作
BOM
BOM的概念
BOM(Browser Object Model)
是指浏览器对象模型,浏览器对象模型提供了独立于内容的、可以与浏览器窗口进行互动的对象结构。BOM由多个对象组成,其中代表浏览器窗口的Window对象是BOM的顶层对象,其他对象都是该对象的子对象。
比如:刷新浏览器、后退、前进、在浏览器中输入URL等
BOM的顶级对象window
window是浏览器的顶级对象,当调用window下的属性和方法时,可以省略window
注意:window下一个特殊的属性 window.name
对话框
alert()
prompt()
confirm()
页面加载事件
onload
window.onload = function () {
// 当页面加载完成执行
// 当页面完全加载所有内容(包括图像、脚本文件、CSS 文件等)执行
}
onunload
window.onunload = function () {
// 当用户退出页面时执行
}
location对象
location对象是window对象下的一个属性,时候的时候可以省略window对象, location可以获取或者设置浏览器地址栏的URL
URL
统一资源定位符 (Uniform Resource Locator, URL)
scheme://host:port/path?query#fragment
scheme:通信协议
常用的http,ftp,maito等
host:主机
服务器(计算机)域名系统 (DNS) 主机名或 IP 地址。
port:端口号
整数,可选,省略时使用方案的默认端口,如http的默认端口为80。
path:路径
由零或多个'/'符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。
query:查询
可选,用于给动态网页传递参数,可有多个参数,用'&'符号隔开,每个参数的名和值用'='符号隔开。例如:name=zs
fragment:信息片断
字符串,锚点.
location有哪些成员?
- 使用chrome的控制台查看
- 查MDN MDN
成员
- assign()/reload()/replace()
- hash/host/hostname/search/href……
history对象
- back()
- forward()
- go()
navigator对象
-
userAgent
通过userAgent可以判断用户浏览器的类型 -
platform
通过platform可以判断浏览器所在的系统平台类型.
定时器
setTimeout()和clearTimeout()
在指定的毫秒数到达之后执行指定的函数,只执行一次
// 创建一个定时器,1000毫秒后执行,返回定时器的标示
var timerId = setTimeout(function () {
console.log('Hello World');
}, 1000);
// 取消定时器的执行
clearTimeout(timerId);
setInterval()和clearInterval()
定时调用的函数,可以按照给定的时间(单位毫秒)周期调用函数
// 创建一个定时器,每隔1秒调用一次
var timerId = setInterval(function () {
var date = new Date();
console.log(date.toLocaleTimeString());
}, 1000);
// 取消定时器的执行
clearInterval(timerId);
DOM
DOM的概念
文档对象模型(Document Object Model,简称DOM)
,是W3C组织推荐的处理可扩展标志语言的标准编程接口。在网页上,组织页面(或文档)的对象被组织在一个树形结构中,用来表示文档中对象的标准模型就称为DOM。Document Object Model的历史可以追溯至1990年代后期微软与Netscape的“浏览器大战”,双方为了在JavaScript与JScript一决生死,于是大规模的赋予浏览器强大的功能。微软在网页技术上加入了不少专属事物,既有VBScript、ActiveX、以及微软自家的DHTML格式等,使不少网页使用非微软平台及浏览器无法正常显示。DOM即是当时蕴酿出来的杰作。
DOM又称为文档树模型
image.png- 文档:一个网页可以称为文档
- 节点:网页中的所有内容都是节点(标签、属性、文本、注释等)
- 元素:网页中的标签
- 属性:标签的属性
根据id获取元素
<input type="button" id="btn" value="按钮">
<script>
document.getElementById('btn').onclick = function () {
alert('hello.world!');
}
</script>
注意:由于id名具有唯一性,部分浏览器支持直接使用id名访问元素,但不是标准方式,不推荐使用
根据name获取元素*
var inputs = document.getElementsByName('hobby');
for (var i = 0; i < inputs.length; i++) {
var input = inputs[I];
console.log(input);
}
根据类名获取元素
var mains = document.getElementsByClassName('main');
for (var i = 0; i < mains.length; i++) {
var main = mains[I];
console.log(main);
}
根据选择器获取元素
// 只能获取一个元素,如果多个元素使用同一个选择器,只会返回第一个
var text = document.querySelector('#text');
console.log(text);
// 获取多个
var boxes = document.querySelectorAll('.box');
for (var i = 0; i < boxes.length; i++) {
var box = boxes[I];
console.log(box);
}
获取元素总结
* 根据id属性的值获取元素,返回来的是一个元素对象
* document.getElementById("id属性的值");
*
* 根据标签名字获取元素,返回来的是一个伪数组,里面保存了多个的DOM对象
* document.getElementsByTagName("标签名字");
*
* 下面的几个,有的浏览器不支持
*
* 根据name属性的值获取元素,返回来的是一个伪数组,里面保存了多个的DOM对象
* document.getElementsByName("name属性的值")
* 根据类样式的名字来获取元素,返回来的是一个伪数组,里面保存了多个的DOM对象
* document.getElementsByClassName("类样式的名字")
* 根据选择器获取元素,返回来的是一个元素对象
* document.querySelector("选择器的名字");
*
* 根据选择器获取元素,返回来的是一个伪数组,里面保存了多个的DOM对象
* document.querySelectorAll("选择器的名字")
常用事件
点击事件
obj.onclick = function () {
this.style.backgroundColor = 'yellow';
};
鼠标移动
// 为li注册鼠标进入事件
obj.onmouseover = function () {
this.style.backgroundColor = 'yellow';
};
// 为li注册鼠标离开事件
obj.onmouseout = function () {
this.style.backgroundColor = '';
};
获取焦点
// 获取焦点
my$('text').onfocus = function () {
};
// 失去焦点
my$('text').onblur = function () {
};
常用 Api
textContent 与 innerText#####
//设置标签中的文本内容,应该使用textContent属性,谷歌,火狐支持,IE8不支持
//设置标签中的文本内容,应该使用innerText属性,谷歌,火狐,IE8都支持
//如果这个属性在浏览器中不支持,那么这个属性的类型是undefined
//判断这个属性的类型 是不是undefined,就知道浏览器是否支持
//兼容代码
/* 设置文本 */
function setInnerText(element,text) {
if((typeof element.textContent) == "undefined"){//不支持
element.innerText=text;
}else{
element.textContent=text;
}
}
/* 获取任意标签中间的文本内容 */
function getInnerText(element) {
if((typeof element.textContent) == "undefined"){
return element.innerText;
}else{
return element.textContent;
}
}
innerHTML和innerText#####
innerHTML
- innerHTML是可以设置文本内容,innerHTML主要的作用是在标签中设置新的html标签内容,是有标签效果的
innerText
- innerText主要是设置文本的,设置标签内容,是没有标签的效果的
Attribute
getAttribute获取自定义属性的值
<p custom = "10" id="t">1111</p>
<script>
my$('t').onclick = function () {
alert(this.getAttribute('custom'));
};
</script>
removeAttribute获取自定义属性的值
//点击按钮移除元素的自定义属性
my$("btn").onclick=function () {
//my$("dv").removeAttribute("score");
//移除元素的类样式
//值没有了,但是属性还是有的
//my$("dv").className="";
//也可以移除元素的自带的属性
my$("dv").removeAttribute("class");
};
setAttribute 设置自定义属性
spans[i].setAttribute("index",i);
节点
在 HTML DOM 中,所有事物都是节点。DOM 是被视为节点树的 HTML。
HTML DOM 节点树
image.png通过 HTML DOM,树中的所有节点均可通过 JavaScript 进行访问。所有 HTML 元素(节点)均可被修改,也可以创建或删除节点。
节点属性
-
nodeType:节点的类型: 1----标签,2---属性,3---文本
-
nodeName:节点的名字:标签节点---大写的标签名字,属性节点---小写的属性名字,文本节点----#text
-
nodeValue:节点的值:标签节点---null,属性节点---属性值,文本节点---文本内容
节点父、子和同胞
var ulObj=document.getElementById("uu");
//父级节点
console.log(ulObj.parentNode);
//父级元素
console.log(ulObj.parentElement);
//子节点
console.log(ulObj.childNodes);
//子元素
console.log(ulObj.children);
console.log("==============================================");
//第一个子节点
console.log(ulObj.firstChild);//------------------------IE8中是第一个子元素
//第一个子元素
console.log(ulObj.firstElementChild);//-----------------IE8中不支持
//最后一个子节点
console.log(ulObj.lastChild);//------------------------IE8中是第一个子元素
//最后一个子元素
console.log(ulObj.lastElementChild);//-----------------IE8中不支持
//某个元素的前一个兄弟节点
console.log(my$("three").previousSibling);
//某个元素的前一个兄弟元素
console.log(my$("three").previousElementSibling);
//某个元素的后一个兄弟节点
console.log(my$("three").nextSibling);
//某个元素的后一个兄弟元素
console.log(my$("three").nextElementSibling);
节点操作
节点操作,方法
appendChild()
insertBefore()
removeChild()
replaceChild()
节点层次,属性
parentNode
childNodes
children
nextSibling/previousSibling
firstChild/lastChild
元素创建
创建元素的三种方式
document.write()
document.write('新设置的内容<p>标签也可以生成</p>');
innerHTML
var box = document.getElementById('box');
box.innerHTML = '新内容<p>新标签</p>';
document.createElement()
var div = document.createElement('div');
document.body.appendChild(div);
事件
注册/移除事件的三种方式
var box = document.getElementById('box');
// 方式一
box.onclick = function () {
console.log('点击后执行');
};
box.onclick = null;
// 方式二
box.addEventListener('click', eventCode, false);
box.removeEventListener('click', eventCode, false);
// 方式三
box.attachEvent('onclick', eventCode);
box.detachEvent('onclick', eventCode);
function eventCode() {
console.log('点击后执行');
}
兼容模式
function addEventListener(element, type, fn) {
if (element.addEventListener) {
element.addEventListener(type, fn, false);
} else if (element.attachEvent){
element.attachEvent('on' + type,fn);
} else {
element['on'+type] = fn;
}
}
function removeEventListener(element, type, fn) {
if (element.removeEventListener) {
element.removeEventListener(type, fn, false);
} else if (element.detachEvent) {
element.detachEvent('on' + type, fn);
} else {
element['on'+type] = null;
}
}
事件的三个阶段
- 捕获阶段 (从外向内)
- 当前目标阶段 (最开始选择的那个)
- 冒泡阶段 (从里向外)
事件对象.eventPhase属性可以查看事件触发时所处的阶段
事件对象的属性和方法
- event.type 获取事件类型
- clientX/clientY 所有浏览器都支持,窗口位置
- pageX/pageY IE8以前不支持,页面位置
- event.target || event.srcElement 用于获取触发事件的元素
- event.preventDefault() 取消默认行为
阻止事件传播的方式
- 标准方式 event.stopPropagation();
- IE低版本 event.cancelBubble = true; 标准中已废弃
常用的鼠标和键盘事件
- onmouseup 鼠标按键放开时触发
- onmousedown 鼠标按键按下触发
- onmousemove 鼠标移动触发
- onkeyup 键盘按键按下触发
- onkeydown 键盘按键抬起触发
特效
偏移量
- offsetParent用于获取定位的父级元素
- offsetParent和parentNode的区别
var box = document.getElementById('box');
console.log(box.offsetParent);
console.log(box.offsetLeft);
console.log(box.offsetTop);
console.log(box.offsetWidth);
console.log(box.offsetHeight);
image.png
客户区大小Client 可视区域
var box = document.getElementById('box');
console.log(box.clientLeft);左边边框的宽度console.log(box.clientTop);上面的边框的宽度
console.log(box.clientWidth); 可视区域的宽(没有边框),边框内部的宽度
console.log(box.clientHeight);可视区域的高(没有边框),边框内部的高度
image.png
滚动偏移
var box = document.getElementById('box');
console.log(box.scrollLeft) 向左卷曲出去的距离
console.log(box.scrollTop) 向上卷曲出去的距离
console.log(box.scrollWidth) 元素中内容的实际的宽(如果内容很少,没有内容,元素自身的宽),没有边框
console.log(box.scrollHeight) 元素中内容的实际的高(如果内容很少或者没有内容,元素自身的高),没有边框
image.png
网友评论