WebAPI

web APIs是W3C的标准 主要学习DOM BOM

页面交互

API(应用程序编程接口)是一些预先定义的函数,方便用,不需要理解

web API是浏览器提供的一套操作浏览器功能和页面元素的API(BOM DOM)

DOM

DOM(文档对象模型),是W3C组织推荐的处理可扩展标记语言(HTML/XML)的标准编程接口

已经定义了有一系列的DOM接口,通过这些DOM接口可以改变网页的内容、结构和样式。

DOM树

一个页面就是一个文档 document

页面中的所有标签都是元素 element

网页中所有的内容都是节点 node

DOM把以上内容都看成对象

DOM使得HTML形成一颗DOM树,包含文档、元素、节点

获取元素

DOM主要来操作元素

获取页面中的元素:

  • 根据ID获取

    getElementById()

    var element = document.getElementById(id)
    // 返回的是一个元素对象
    
  • 根据标签名获取

    getElementsByTagName()

    var element = document.getElementsByTagName()
    

    返回的是获取元素对象的集合,伪数组形式存储

  • 通过HTML5新增的方法

    getElementsByClassName() 根据类名获得某些元素集合

    querySelector() 返回指定选择器的第一个对象 选择器需要加符号(.box #nav)

    querySelectorAll() 返回指定选择器的所有元素对象

  • 特殊元素获取

    //1. 获取body元素var a = document.body;//2. 获取html元素var b = document.documentElement;
    

DOM事件

JavaScript可以创建动态页面,事件是可以被JavaScript侦测到的行为

网页中每个元素都可以产生触发JavaScript的事件

事件三要素

事件源

一个对象

var a = document.getElementById('id');

事件类型

如何触发 点击还是经过

事件处理程序

一个函数赋值的方式

// 对象元素+动作函数 =  自定义函数()
a.onclick = function(){// code
}

DOM事件

事件 触发条件
onload 和 onunload 用户进入或离开页面时
onclick 鼠标点击
onmouseover 鼠标移动到触发
onmouseout 鼠标离开触发

onload 事件可用于检查访客的浏览器类型和版本,以便基于这些信息来加载不同版本的网页。

onloadonunload 事件可用于处理 cookies。

节点

节点操作还是为了获取元素

DOM获取元素:

  • document.getElementById()
  • document.getElementsByTagName()
  • document.querySelector

逻辑性不强,繁琐

利用节点层次关系获取元素

  • 利用父子兄节点关系获取元素

逻辑性强,简单,兼容性差

什么是节点?

网页中所有的内容都是节点(标签,属性,文本,注释)

在DOM中,节点用node来表示

HTML DOM树中所有节点均可通过JavaScript进行访问,所有HTML元素(节点)均可被修改,创建,删除

一般,节点至少拥有nodeType(节点类型) nodeName(节点名称) nodeValue(节点值)

  • 元素节点 nodeType = 1
  • 属性节点 nodeType = 2
  • 文本节点 nodeType = 3 (文字,空格,换行)

实际开发中,主要还是元素节点(即标签)

节点操作

1)父级节点

子节点.parentNode
  • 得到的是离元素最近的父级节点
  • 如果找不到,就返回null

2)子节点

父节点.childNodes
  • 返回所有的子节点,包括元素和文本
父节点.children
  • 只返回子元素节点
父节点.firstChild
  • 返回第一个子节点,包含所有节点
父节点.lastChild
  • 返回最后一个子节点,同上
父节点.firstElementChild
  • 返回第一个子元素节点,last 同理
  • 兼容性问题,IE9+支持

3)兄弟节点

节点.nextSibling

4)创建节点

document.createElement('tagName')

动态创建

5)删除节点

node.removeChild(child)

阻止链接跳转:<a href='javascript:;'>abc</a>

这个很重要,比如你要做一个按钮,点击后打开或者关闭某个盒子,我们把按钮做成a的样式,是为了鼠标有点击的效果(不然鼠标以为是文字,虽然能点击,但交互性不好)。

设置成a后一定要阻止链接跳转!因为这样才不会刷新,一刷新就又恢复了,就会造成一闪而过的情况。

<a id="log" href="javascript:void(0);">登录</a>

我的总结:

  • 链接为真,点击后页面会刷新,跳转到新的页面。
  • 链接为假,点击后不刷新,执行我们的 JS 效果。

6)克隆节点

节点.cloneNode()

如果括号参数为空或者false,则是浅拷贝,只克隆节点本身,不克隆里面的子节点。

括号为true,是深拷贝,复制标签+内容

三种动态创建元素区别

  • document.write()
  • element.innerHTML
  • document.createElement()

区别

document.write()直接将内容写入页面的内容流。当文档流执行完毕,会导致页面全部重绘。

element.innerHTML将内容写入某个DOM节点,不会导致页面重绘。

document.createElement()创建多个元素结构清晰。

DOM核心

DOM是属于编程接口,获取过来的DOM元素是一个对象

DOM主要就是对元素的操作:创建增删查改属性事件

创建

  • document.write()
  • element.innerHTML
  • document.createElement()

  • appendChild

  • insertBefore

  • removeChild

  • 修改元素属性:src href title
  • 修改普通元素内容:innerHTML innerText
  • 修改表单元素:value type disabled
  • 修改元素样式:style className

获取查询dom的元素

  • DOM的API:getElementById getElementsByTagName
  • H5:querySelector querySelectorAll
  • 利用节点操作:父子兄

属性操作(主要针对自定义属性)

  • setAttribute:设置DOM的属性值
  • getAttribute:得到DOM的属性值
  • removeAttribute:移出属性值

事件操作(事件源.事件类型 = 函数程序

鼠标事件、键盘。。

改变元素内容

获取一个元素的对象,给他一个操作函数,去改变另一个元素的值

innerText

innerHTML

案例:按钮显示当前时间

<body><button>显示当前系统时间</button><div>某个时间</div><script>// 获取元素var btn = document.querySelector('button');var div = document.querySelector('div');// 注册事件 (元素+操作指令+定义函数)btn.onclick = function () {div.innerText = get_the_data();}// 获取时间函数function get_the_data() {var data = new Date();var year = data.getFullYear(); //返回年份var month = data.getMonth() + 1; //返回月份,但是0开头var dates = data.getDate(); //返回几号var arr = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];var day = data.getDay(); //周一返回1,周六返回6,周日返回0return '今天是' + year + '年' + month + '月' + dates + '日' + arr[day];}</script></body>

案例:切换密码栏输入密码是否可见

<body><div class="box">       <input type="password"></div><button>code</button><script>var btn = document.querySelector('button');var pwd = document.querySelector('input')var flag = 0;btn.onclick = function(){if (flag == 0){pwd.type = 'text';    flag = 1;           }else{pwd.type = 'password';flag = 0;}}</script>
</body>

操作元素总结

操作元素

  • 操作元素内容

    • innerText
    • innerHTML
  • 操作元素属性

    • src href title alt
  • 操作表单元素属性

    • type value disabled

    (普通盒子里面的文字是用innerHTML来修改,表单里面的文字用value来改)

  • 操作元素样式属性

    • element.style(少)
    • className(多)

案例:换背景壁纸

四个图片小图排成一起,每点击一张图片,就把body的背景图片换成这张壁纸

<style>body {background: url("/img/bc1.jpg") no-repeat center top;}
</style><body><ul class="baidu"><li><img src="/img/bc1.jpg" alt=""></li><li><img src="/img/bc2.jpg" alt=""></li><li><img src="/img/bc3.jpg" alt=""></li><li><img src="/img/bc4.jpg" alt=""></li></ul><script>// 获取元素 取出ul img里面的所有图片var imgs = document.querySelector('.baidu').querySelectorAll('img');// 遍历所有图片,添加点击事件,把当前(this)的图片地址加到body里面for (var i=0; i<imgs.length; i++){imgs[i].onclick = function(){// this.src就是我们点击图片的路径document.body.style.backgroundImage = 'url('+this.src+')';}}</script>
</body>

案例:列表的全选与反全选

// jall是表头复选框input的id
// jtb是表身的id
var jall = document.getElementById('jall'); //上面的全选按钮
var jtb = document.getElementById('jtb').getElementsByTagName('input'); //下面的所有的复选框jall.onclick = function(){for(var i=0; i<jtb.length; i++){jtb[i].checked = this.checked;}
}for(var i=0; i<jtb.length; i++){jtb[i].onclick = function(){var flag = true;for(var i=0; i<jtb.length; i++){if(!jtb[i].checked){flag = false;}}jall.checked = flag;}
}

监听事件(注册&解绑)

addEventListener() 方法

添加当用户点击按钮时触发的事件监听器:

document.getElementById("myBtn").addEventListener("click", displayDate);

addEventListener() 方法为指定元素指定事件处理程序。

addEventListener() 方法为元素附加事件处理程序而不会覆盖已有的事件处理程序。

能够向一个元素添加多个事件处理程序。

能够向一个元素添加多个相同类型的事件处理程序,例如两个 “click” 事件。

能够向任何 DOM 对象添加事件处理程序而非仅仅 HTML 元素,例如 window 对象。

addEventListener() 方法使我们更容易控制事件如何对冒泡作出反应。

当使用 addEventListener() 方法时,JavaScript 与 HTML 标记是分隔的,已达到更佳的可读性;即使在不控制 HTML 标记时也允许您添加事件监听器。

能够通过使用 removeEventListener() 方法轻松地删除事件监听器。

举例:此示例使用 addEventListener() 方法将 click 事件(显示当前时间)附加到按钮。

<button id="myBtn">试一试</button><p id="demo"></p><script>document.getElementById("myBtn").addEventListener("click", displayDate);function displayDate() {document.getElementById("demo").innerHTML = Date();}
</script>

注意,这里不能使用匿名函数的方式,要把函数名明确的显示出来,方便调用。调用的时候不用加引号。

但是要用也是可以的,比如

element.addEventListener("click", function(){ alert("Hello World!"); });

语法

element.addEventListener(event, function, useCapture);
  • 第一个参数是事件的类型(比如 “click” 或 “mousedown”)。
  • 第二个参数是当事件发生时我们需要调用的函数。
  • 第三个参数是布尔值,指定使用事件冒泡(false)还是事件捕获(true)。此参数是可选的。

注意: 请勿对事件使用 “on” 前缀;请使用 “click” 代替 “onclick”。

DOM事件流

事件流描述的是从页面中接受事件的顺序。

事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流。

三个阶段

捕获阶段 从上往下 顶层到底层

当前目标阶段

冒泡阶段 从下往上 底层到顶层

JS只能得到其中一个阶段,通过设定布尔值,让父子关系的盒子事件有一个先后顺序。

实际开发中更关注事件冒泡

有些事件是没有冒泡的:onblur onfocus

事件对象

什么是事件对象?

var j = document.querySelector('div');
j.onclick = function(event){};

event就是一个事件对象,写到监听函数小括号里面

onclick是事件(鼠标事件、键盘事件),event是事件对象

事件对象是事件的一系列相关数据的集合

查看事件对象

j.addEventListener('click', function(e){console.log(e);
})

e里面就包含了鼠标点击的一系列信息

兼容性问题:

IE 678 通过window.event获取

console.log(window.event)

兼容写法:e = e ||window.event

事件对象的常用属性和方法

事件对象属性方法 说明 兼容问题
e.target 返回触发事件的对象 标准
e.srcElement 返回触发事件的对象 非标准 ie6-8使用
e.type 返回事件的类型,比如click mouseover 不带on
e.cancelBubble 改属性阻止冒泡 非标准 ie6-8使用
e.returnValue 该属性阻止默认事件,比如不让链接跳转 非标准 ie6-8使用
e.preventDefault() 该方法阻止默认事件,比如不让链接跳转 标准
e.stopPropagation() 该方法阻止冒泡 标准

this 和 target

  • 给谁绑定事件,this就指向谁
  • 我们点击哪个对象,(这个元素没有绑定事件,但是可以冒泡排上去),指向的就是这个对象元素

阻止冒泡

冒泡有好处,也有坏处

div.addEventListener('click', function(e){...e.stopPropagation();
}, false);

事件委托

也称事件代理,在jQ中称为事件委派

事件委托的原理:

不是每个子节点单独设置事件监听器,而是监听器设置在父节点上,然后利用冒泡原理影响每个子节点。

作用是 只操作一次DOM,提高性能

我们在父节点上注册事件,但我们点击的是自节点。我们想改变点击的子节点的样式,可以用event.target来做

禁用选项

禁用右键菜单

document.addEventListener('contextmenu', function(e){e.preventDefault();
})

禁用鼠标选中文字

document.addEventListener('selectstart', function(e){e.preventDefault();
})

鼠标事件对象

键盘事件对象

获得焦点

focus()

案例:按下s键,搜索框获得焦点

<body><input type='text'><script>var search = document.querySelector('input');document.addEventListener('keyup', function(){if(e.keyCode === 83){search.focus();}})</script>
</body>

注意keyup keydown的区别

NOTE:keydown和keypress在文本框里面的特点:他们两个ssh事件触发的时候,文字还没有落入文本框中。keyup触发时文字已经进去了

H5自定义属性

保存并使用数据,数据保存到页面中而不是数据库中

通过 getAttribute('属性') 获取

H5规范:data- 开头

H5新增:element.dataset.index ie11才支持

表单验证

JavaScript笔记之二:DOM-BOM相关推荐

  1. ppk on javascript 笔记(六)--BOM

    浏览器对象模型(Browser Object Model)是语言核心和DOM之间的一个过渡层,这个过渡层特指Javascript的客户端实现,它的主要任务是管理浏览器窗口并使得它们可以彼此通信.win ...

  2. 我的JavaScript笔记(二)

    一.Web API先导     1.1 JS的组成         JavaScript:ECMAscript(JS语法).DOM(页面文档对象模型).BOM(浏览器对象模型).Web API由后两个 ...

  3. JavaScript笔记之二--- 崔西凡day03

    JS的对象 string对象 属性 length 方法 与html有关的方法 bold方法fontcolorsubsup 与java类似的方法 concatcharat 返回指定位置字符串indexo ...

  4. JavaScript笔记(二)——HTML中的JavaScript

    JavaScript笔记(二) 读书笔记 HTML中的JavaScript 内容概要 2.1 <\script\>元素 2.1.1 标签位置 2.1.2 推迟执行脚本 2.1.3 异步执行 ...

  5. JavaScript一线大厂面试秘籍:面向对象+dom\bom+事件+特性\动画+面试题+基础

    JavaScript(简称"JS")是一种具有函数优先的轻量级,解释型或即时编译型的高级编程语言.虽然它是作为开发Web页面的脚本语言而出名的,但是它也被用到了很多非浏览器环境中, ...

  6. JavaScript 学习笔记(二)

    JavaScript 学习笔记(二) 文章目录 JavaScript 学习笔记(二) 一 JSON 1. JSON 对象 什么是JSON对象 JSON对象与Javascript对象的区别 在JavaS ...

  7. javascript原生事件句柄、BOM、DOM对象属性方法总结

    javascript原生事件句柄.BOM.DOM对象属性方法总结 JS事件句柄 事件句柄 类型 说明 onabort 事件句柄 图像加载被中断 onblur 事件句柄 元素失去焦点 onfocus 事 ...

  8. JavaScript学习(二十)—DOM中常用的属性

    JavaScript学习(二十)-DOM中常用的属性 1.clientWidth属性 作用:获取元素或页面的可视的区域的宽度 格式:节点.clientWidth 2.clientHeight属性 作用 ...

  9. 【前端】js 视频笔记(DOM BOM)

    教程地址:https://www.bilibili.com/video/BV1k4411w7sV 中文文档:https://developer.mozilla.org/zh-CN/docs/Web/A ...

最新文章

  1. python表示不服怎么办_10万+的短视频被批量生产了,Python表示不服!
  2. 电力系统分析课设短路电流计算simulink仿真
  3. Git 提交 .gitignore文件
  4. java 循环结构和常用的类 总结笔记
  5. chrome 占用大量内存直到网页崩溃_Chrome吃内存太夸张!几招解决Chrome占内存硬伤...
  6. Mac OS X下MySql卸载方法
  7. 技术圈儿001---分布式事务最经典的七种解决方案
  8. 直流电机PID调节——P
  9. mybatis的set标签
  10. Pyhton学习——Day60
  11. RHEL5下unixODBC 与 sqliteodbc 连接配置
  12. 8光12电ERPS工业级环网交换机 PLC自动化环网柜一键环网交换机
  13. Vue开发工具dev-tools的安装与使用
  14. 基于SSM+SpringBoot+Vue+ElmentUI实现公司案件管理系统
  15. 开源电子书项目FBReader初探(一)
  16. 联想y7000电脑未正确启动_联想y7000wifi突然不能用了是怎么回事
  17. linux7开放3306端口,CentOS 7 开放3306端口
  18. Moya、RxMoya基本使用
  19. 微信设置换个字体,格调瞬间起来了
  20. PCB设计技巧一百问

热门文章

  1. 指南 | 广播电视节目制作经营许可证
  2. Vue.js学习笔记 02、Vue组件篇笔记
  3. 西安交通大学 6046班级主页
  4. 邮件变成了Winmail.dat
  5. python selenium爬取QQ空间说说
  6. 使用Ubuntu下usb抓包工具(usbmon)进行数据抓取的一次记录
  7. excel生成随机数时间
  8. EXCEL文件已损坏,无法打开,解决办法
  9. 利用PCB向导(component wizard)画BGA封装
  10. 100天从 Python 小白到大神最良心的学习资源!