Web开发 | WebAPI 介绍 & 使用总结 (四)

WebAPI 介绍

浏览器提供的一套操作浏览器功能和页面元素的API (BOM和DOM)
掌握常见的浏览器提供的API的调用方式 MDN-Web API

JavaScript的组成

image.png

ECMAScript - 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的“浏览器大战”,双方为了在JavaScriptJScript一决生死,于是大规模的赋予浏览器强大的功能。微软在网页技术上加入了不少专属事物,既有VBScriptActiveX、以及微软自家的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;
  }
}


事件的三个阶段

  1. 捕获阶段 (从外向内)
  2. 当前目标阶段 (最开始选择的那个)
  3. 冒泡阶段 (从里向外)
    事件对象.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

元素的类型

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,490评论 1 11
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,126评论 0 21
  •   DOM(文档对象模型)是针对 HTML 和 XML 文档的一个 API(应用程序编程接口)。   DOM 描绘...
    霜天晓阅读 3,644评论 0 7
  • Web前端技术由html、css和 javascript三大部分构成,是一个庞大而复杂的技术体系,其复杂程度不低于...
    web佳阅读 508评论 0 1
  • 以后是对于初学者有帮助的一些JS的方法API,使用即说明 ■JS组成■1,ECMAScript : js的核心标准...
    简爱的三年阅读 827评论 0 0