Day 01

正课:

1.什么是DOM:

2.DOM Tree

3.遍历DOM树:

1.什么是DOM:

原生js=ECMAScript(核心语法)+

DOM(专门操作网页内容的API)+ 3天

BOM(专门操作浏览器窗口的API)+ 2天

DOM: Document Object Model

专门操作网页内容的API

DOM标准: W3C 规定了操作一切结构化文档的API。

核心DOM: 操作一切结构化文档(包括HTML和XML)的通用API

万能,但繁琐

HTML DOM: 专门操作HTML文档的简化版API

只对部分常用的API提供了简化

不是万能

XML DOM: 专门操作XML文档的API

鄙视题: HTML XHTML DHTML XML

HTML:专门编写网页内容的语言

XHTML: 更严格的HTML标准

DHTML: 一切实现动态网页效果的技术统称

DHTML=HTML+CSS+JS

XML: 可扩展的标记语言

语法同HTML,但标签可自定义

专门用于持久保存或在网络中传输结构化数据

<student>

<name>杨幂</name>

<math>81</math>

<chs>56</chs>

</student>

JSON: JavaScript Object Notation

'{"name":杨幂,"math":81,"chs":56}'

DOM可执行的操作:

***查找 修改 添加 删除

2. ***DOM Tree:

什么是DOM树:

网页中一切内容在内存中都是以树形结构组织在一起的。

网页加载过程:

当接收到HTML文档时:

创建一个树根节点:document对象

读取HTML内容时:

每读取一项内容就创建一个节点对象

将节点对象挂到document下

网页中的一切内容都是一个节点对象:

节点对象:Node

三大属性:

nodeType:节点类型:

document: 9

element: 1

attribute: 2

text: 3

何时: 辨别获得的节点类型时

nodeName: 节点名:

document: #document

element: 标签名(全大写)

何时: 辨别元素的具体标签名

attribute: 属性名

text: #text

nodeValue: 节点值:

document: null

element: null

attribute: 属性值

text: 文本内容

节点间关系:

节点树: 包含所有html内容的DOM树

1. 父子关系:

parentNode: 父节点

childNodes: 所有直接子节点

返回一个动态集合-类数组对象

firstChild: 第一个子节点

lastChild: 最后一个子节点

2. 兄弟关系:

nextSibling: 下一个兄弟

previousSibling: 前一个兄弟

何时使用:

已经获得一个节点,要找它周围的相邻的节点。

问题: 容易受看不见的空文本干扰

解决: 如果只需要获取元素,而不关心文本,可用元素树

元素树: 仅包含元素节点的树结构

强调: 不包含一切文本节点

1. 父子关系:

parentElement: 父元素

children: 所有直接子元素

返回一个动态集合-类数组对象

firstElementChild: 第一个子元素

lastElementChild: 最后一个子节点

2. 兄弟关系:

nextElementSibling: 下一个兄弟

previousElementSibling: 前一个兄弟

问题: 浏览器兼容性: IE9+

3.遍历节点:

2步:

1. 先定义函数仅遍历直接子节点

2. 对每个直接子节点应用和父节点相同的操作

算法: 深度优先遍历

childNodes和children:

live collection(动态集合):

不实际存储节点的完整属性

问题:每次访问集合时,都会重新查找DOM树

遍历:

for(var i=0;i<childNodes.length;i++)

造成反复查找DOM树

解决:

for(var i=0,len=childNodes.length;i<len;i++)

问题:递归的效率低

解决:用遍历API+循环

遍历API:

1. 节点迭代器:

按照深度优先的原则,逐个返回每个子节点。

何时: 只要按照深度优先的顺序,遍历所有子代节点时。

如何:2步:

1.用指定父元素创建节点迭代器对象:

var iterator=

document.createNodeIterator(

parent,NodeFilter.SHOW_ALL,

.SHOW_ELEMENT

null,false

);

2.反复调用iterator的nextNode方法

返回正在遍历的当前节点对象

直到返回null为止

2.TreeWalker:

比节点迭代器更灵活的API:

基本用法和NodeIterator一样

只不过扩展了:

walker.parentNode()

walker.firstChild();

walker.lastChild();

walker.nextSibling();

walker.previousSibling();

如何: 2步:同NodeIterator

*******************************************************************************

Day 02

回顾:

1. DOM树:

节点对象: Node

nodeType

document: 9

element: 1

attribute: 2

text:3

nodeName

document: #document

element: 标签名(全大写)

attribute: 属性名

text: #text

nodeValue

document: null

element: null

attribute: 属性值

text: 文本内容

节点间关系:

节点树:

1. 父子关系:

elem.parentNode

elem.childNodes (live collection)

elem.firstChild

elem.lastChild

2. 兄弟关系:

elem.previousSibling

elem.nextSibling

元素树:

1. 父子关系:

elem.parentElement

elem.children (live collection)

elem.firstElementChild

elem.lastElementChild

2. 兄弟关系:

elem.previousElementSibling

elem.nextElementSibling

遍历:

1. function getChildren(parent){

//输出parent

var children=parent.childNodes;//children

for(var i=0,len=children.length;i<len;i++){

getChildren(children[i]);

}

}

2. 遍历API:

NodeIterator:

var iterator=document.createNodeIterator(

parent,NodeFilter.SHOW_ALL, null, false

.SHOW_ELEMENT

);

var curr=iterator.nextNode();//获得下一个节点

while((curr=iterator.nextNode())!=null){

//curr就是当前节点

}

TreeWalker:

var walker=document.createTreeWalker(

parent,NodeFilter.SHOW_ALL, null, false

.SHOW_ELEMENT

);

基本用法同iterator,外还扩展了:

walker.parentNode();

walker.firstChild();

walker.lastChild();

walker.nextSibling();

walker.previousSibling();

正课:

1. ***查找:

1. 利用节点间关系查找周围的元素

2. 用HTML属性查找:

按id:  var elem=document.getElementById("id");

只能找到一个元素

如果没找到,返回null

强调: 必须用document调用。

按标签名:

var elems=

parent.getElementsByTabName("标签名");

在指定父元素parent下查找指定标签名的元素

返回live collection

强调: 查找所有子代节点

按name:

var elems=

parent.getElementsByName("name");

在指定父元素parent下查找指定name属性的元素

返回live collection

按class:

var elems=

parent.getElementsByClassName("class");

在指定父元素parent下查找指定class属性的元素

返回live collection

如果getElementsXXX没找到,返回空集合[]

3. 用选择器查找:

1. 只查找一个符合选择器要求的元素:

var elem=parent.querySelector("selector");

如果没找到,返回null

2. 查找多个符合选择器要求的元素:

var elem=parent.querySelectorAll("selector");

如果没找到,返回空集合[]

强调: 返回no-live collection:

包含完整属性的集合,反复访问不会导致重复查找DOM树

鄙视题: getXXX vs querySelector

1. 执行效率:

如果通过一个属性即可找到的元素

getXXX更快  返回live collection

querySelector 更慢  no-live collection

2. 代码量:

如果需要通过多次查找才能获得想要的元素时

querySelector 更简单

getXXX 繁琐

4. VIP通道:

document.body

document.head

document.documentElement : html

回顾:

1. 查找:

1. 节点间关系:

节点树:

1. 父子关系:

parentNode

childNodes

firstChild

lastChild

2. 兄弟关系:

previousSibling

nextSibling

元素树:

1. 父子关系:

parentElement

children

firstElementChild

lastElementChild

2. 兄弟关系:

previousElementSibling

nextElementSibling

2. 按html属性找:

document.getElementById()

parent.getElementsByTagName();

parent.getElementsByName();

parent.getElementsByClassName();

3. 按选择器查找:

parent.querySelector();

parent.querySelectorAll();

4. VIP通道:

document.body

document.head

document.documentElement - html

正课:

1. 修改:

内容:

属性: 标准、自定义

样式: 内联样式、内/外部样式表

1. 修改内容:

elem.innerHTML: 元素开始标签到结束标签之间的html内容

elem.textContent: 元素开始标签到结束标签之间的文本内容

去掉html标签

IE8.innerText

练习: 技巧: 如果遍历过程中会删除数组的元素,则要从后向前反向遍历。

2. 访问或操作元素的属性:

标准属性:

核心DOM: 万能

1. 访问属性节点对象:

var node=elem.attributes[i/"属性名"];

var node=elem.getAttributeNode("属性名");

node.value->获得属性值

2. 获得属性值:

var value=elem.getAttribute("属性名");

3. 修改属性值:

elem.setAttribute("属性名","值");

4. 移除属性:

elem.removeAttribute("属性名");

5. 判断是否包含指定属性:

var bool=elem.hasAttribute("属性名");

HTML DOM: 将html标准属性封装到了元素对象中

elem.属性名

问题: 仅能访问HTML标准属性

自定义属性:

核心DOM: 万能

HTML5 规定:

1, 定义自定义属性时: data-属性名="值"

2, 读取自定义属性: elem.dataset.属性名

property   vs  attribute

显式写在开始标签中的: attribute

强调: getAttribute只能获得在页面上显式定义的属性值

在内存中对象里保存的: property

标准属性: 既是property也是attribute

自定义属性: 只是attribute

input type="checkbox" 要获得选中状态checked

不能用getAttribute,一定要用elem.checked

*******************************************************************************

Day 03

回顾:

1. ***查找:

1. 节点间关系:

节点树:

1. 父子关系:

parentNode

childNodes

firstChild

lastChild

2. 兄弟关系

previousSibling

nextSibling

元素树:

1. 父子关系:

parentElement

children

firstElementChild

lastElementChild

2. 兄弟关系

previousElementSibling

nextElementSibling

2. 按HTML查找:

按id: document.getElementById();

按标签名: parent.getElementsByTagName();

按name: parent.getElementsByName();

按class: parent.getElementsByClassName();

3. 按选择器:

找一个: parent.querySelector()

找多个: parent.querySelectorAll()

4. VIP:

document.body

document.head

document.documentElement

2. 访问属性:

标准属性:

核心DOM:

1. 获得属性值: getAttribute("属性名")

2. 设置属性值: setAttribute("属性名",值)

3. 移除属性: removeAttribute("属性名")

4. 判断是否包含: hasAttribute("属性名")

HTML DOM:

elem.属性名

自定义属性:

核心DOM:

HTML5: 1. 定义时: data-属性名="值"

2. 访问时: elem.dataset.属性名

property  vs  attribute

正课:

1. 修改:

样式: 内联样式, 内/外部样式表

2. 增加和删除:

1. 修改样式:

访问内联样式:

修改样式: elem.style.css属性名

获取样式: 问题: 仅能访问内联样式

解决: var style=getComputedStyle(elem)

style.css属性名 ——只读

其中,css属性名都要去横线,变驼峰:

比如: background-color:  backgroundColor

list-style-type: listStyleType

问题: 一条语句只能修改一个样式

解决: 将一套样式,放入class

用程序操作class

课堂练习:

获得焦点onfocus: 元素从不可操作到可操作的状态变化

失去焦点onblur: 元素从可操作变回不可操作的变化

修改内/外部样式表中的属性:

1. 获得样式表对象: var sheet=document.styleSheets[i]

2. 获得cssRule对象: var rule=sheet.cssRules[i];

特殊: rule是一个keyframes:

var subRule=rule.cssRules[i]

3. 修改cssRule中的属性: rule.style.css属性名=值

Chrome: 不允许sheet对象访问本地的css样式表文件

正课:

1. 添加和删除:

2. ***HTML DOM常用对象:

Image    Select       Table       Form

Option

1. 添加和删除:

添加: 3步:

1. 创建空元素对象:

var a=document.createElement("a");

相当于: <a></a>

2. 设置元素的关键属性:

a.href="http://tmooc.cn"

a.innerHTML="go to tmooc";

3. 将元素挂到指定父元素下:

末尾追加: parent.appendChild(a);

插入: parent.insertBefore(a,old);

替换: parent.replaceChild(a,old);

***优化: 尽量少的操作DOM树:

html->DOM Tree

Render Tree->layout->paint

css->cssRules

如何: 1. 如果同时添加父元素和子元素,要在内存中先将所以子元素添加到父元素下,将父元素一次性加入DOM树

2. 如果同时添加多个平级子元素,要先将平级子元素加入文档片段,再将文档片段整体加到页面。

练习: select元素: onchange事件: 选中项发生改变时触发

selectedIndex属性: 当前选中项的下标

文档片段: 内存中临时存储多个平级子元素的虚拟父元素

何时: 添加多个平级元素时,都要先将子元素追加到文档片段中缓存,再将文档片段一次性添加到页面的父元素下

如何: 3步:

1. 创建文档片段:

var frag=document.createDocumentFragment();

2. 将平级子元素,先追加到frag下: 用法同普通父元素

3. 将文档片段,整体添加到页面

删除: parent.removeChild(child);

child.parentNode.removeChild(child);

2. HTML DOM常用对象:

Image: <img />

创建: var img=new Image();

Select: <select>

属性:

selectedIndex:  当前选中项的下标

options: 获得select下所有option元素的集合

Option:<option>

创建: var opt=new Option(text,value);

相当于: var opt=

document.createElement("option");

opt.innerHTML=text;

opt.value=value;

属性: index、text、value、selected

value: 如果选中项有value,则select的value等于选中项的value

如果选中项没有value,则select的value等于选中项的内容

方法:

add(option): 向select下追加一个option对象

appendChild(option)

remove(i): 移除select下i位置的option

事件: onchange: 当选中项发生改变时触发

*******************************************************************************

Day 04

回顾:

1. 添加和删除:

添加: 3步:

1. var a=document.createElement("a")

2. 设置关键属性

3. 将元素添加到DOM树:

parent.appendChild(a);

parent.insertBefore(a,old);

parent.replaceChild(a,old);

优化: 尽量少的操作DOM树,避免反复layout

1. 如果同时添加父元素和子元素,应在内存中先将子元素拼到父元素下,再将父元素一次性添加到DOM树

2. 如果同时添加多个平级子元素,应先将所有子元素放入文档片段,再将文档片段一次性添加到DOM树

文档片段:

1. var frag=document.createDocumentFragment();

2. frag.appendChild(child);

3. parent.appendChild(frag);

删除: parent.removeChild(child);

child.parentNode.removeChild(child);

2. HTML DOM常用对象:

Image: var img=new Image();

Select:

属性: selectedIndex,   options,   value

方法: add(opt),   remove(i)

事件: onchange

Option:

创建: var opt=new Option(text,value)

正课:

1. HTML DOM常用对象:

Table

tHead:

var thead=table.createThead();

table.deleteThead();

rows:

var tr=thead.insertRow(i);

//省略i,表示末尾追加

thead.deleteRow(i);

//i不能省略

cells:

var td=tr.insertCell(i);

//省略i,表示末尾追加

tr.deleteCell(i)

tBodies

tBody:

var tbody=table.createTBody();

//没有table.deleteTBody!

tFoot: 同tHead

Table.rows:

table.insertRow(i);

table.deleteRow(i);

row.rowIndex: 标识row在整个表中的下标位置

table.deleteRow(row.rowIndex)

强调: 所有creatxxx/insertxxx方法都会自动将新元素添加到父元素下,不需要appendChild

练习: 确认框: confirm   两个按钮

点确认,就返回true,否则返回false

Form

获取: var form=document.forms[i/id/name];

属性:

length: 表单中,表单元素的个数

elements[i/id/name]

获得表单中的元素:

form.name => form.elements["name"]

方法:  submit(); 手动提交表单

事件:

每个表单元素都有两个方法:

elem.focus(); //让elem获得焦点

elem.blur(); //让elem失去焦点

*******************************************************************************

Day 05

正课:

1. BOM:

打开和关闭窗口

窗口大小和窗口定位

*****定时器

1. 什么是BOM: Browser Object Model

BOM是专门操作浏览器的API

window: 两个角色

1. 代替global,充当全局对象

2. 封装操作浏览器窗口的API

history: 保存当前窗口打开后成功访问过的url的历史记录栈

navigator: 保存浏览器配置信息

location: 保存当前窗口正在打开的url的对象

screen: 保存当前显示器或桌面分辨率信息

event: 在事件发生时,自动保存事件相关信息的对象

2. 打开和关闭窗口:

window.open() 打开,window.close()关闭当前窗口

打开超链接的方式总结:

1. 在当前窗口打开新链接,可后退

html: <a href="url"></a>

js: open("url","_self")

2. 在当前窗口打开新链接,不可后退

js: location.replace("url");

3. 在新窗口打开新链接,可打开多个

html: <a href="url" target="_blank"></a>

js: open("url")

4. 在新窗口打开新链接,只能打开一个窗口

内存中,每个窗口都有一个唯一的名字name属性

name属性是在内存中唯一标识一个窗口的名称

浏览器规定: 相同name的窗口的只能打开一个

后打开的会刷新先打开的。

在打开新窗口时,可自定义name属性

预定义name属性值: _self  _blank ...

html: <a href="url" target="name"></a>

js: open("url","name")

3. 窗口大小和窗口定位(了解):

窗口大小:

获取窗口大小:

1. 获取完整窗口大小: outerWidth/outerHeight

2. 获得文档显示区大小: innerWidth/innerHeight

修改窗口大小:

1. 在打开窗口时,就可定义新窗口的大小和位置:

2步:

1.定义配置字符串:

var config="top=?,left=?,width=?,height=?"

//只是文档显示区的大小

2. 打开窗口时,传入配置字符串

open("url","name",config);

2. 通过API调整窗口大小:

resizeTo(width,height)

width/height定义的是完整大小

resizeBy(width的增量,height的增量)

强调:

1. 只能修改在打开时,就修改了位置和大小的弹出窗口

2. 无法修改当前窗口自己的大小

通过一个窗口修改另一个窗口的大小

窗口定位:

获取窗口左上角定位:

window.screenLeft||window.screenX

window.screenTop||window.screenY

修改窗口的位置:

moveTo(x,y);

moveBy(x的增量,y的增量)

练习:

1. 屏幕的大小:

完整大小: screen.height  screen.width

去掉任务栏之后的剩余大小:

screen.availHeight  screen.availWidth

2. 事件发生时,鼠标的位置:

e.screenX; 相对于屏幕左上角的x坐标

e.screenY; 相对于屏幕左上角的y坐标

回顾:

1. ***HTML DOM常用对象:

Table

创建: createTHead()   createTBody()    createTFoot

删除: deleteTHead()   deleteTFoot()

tHead

insertRow(i)   deleteRow(i)//i相对于当前行分组内的位置

rows:

tr

insertCell(i)    deleteCell(i)

cells: td

tBodies

tBody

tFoot

insertRow(i)     deleteRow(i)//i相对于整个表中的位置

rows:

tr.rowIndex: tr相对于整个表的位置

Form:

获得Form: document.forms[i/id/name]

form:

属性: length

方法: submit();

获得表单元素: form.elements[i/id/name]

form.name

elem:

方法: elem.focus()       elem.blur()

2. BOM

打开和关闭窗口:

打开: var pop=open("url","name",config)

其中: config="top=?,left=?,width=?,height=?"

//文档显示区大小

关闭: close()

打开连接四种方式:

1. 在当前窗口打开,可后退:  open("url","_self")

2. 在当前窗口打开,不可后退: location.replace("url");

3. 在新窗口打开,可重复打开: open("url")

4. 在新窗口打开,只能打开一个: open("url","name")

窗口大小与窗口定位

大小: outerWidth/outerHeight

innerWidth/innerHeight

修改: resizeTo(width,height)//完整大小

resizeBy(width的增量,height的增量)

定位: window.screenLeft||window.screenX

window.screenTop||window.screenY

修改: moveTo(left,top)

moveBy(left的增量,top的增量)

正课:

1. *****定时器

什么是: 让程序按照指定的时间间隔自动执行任务

何时: 动画

周期性定时器: 让程序按照指定的时间间隔反复自动执行同一任务。

何时: 只要反复自动执行一项任务

如何: 3件事:

1. 任务函数: 定义每次要执行的任务

2. 启动定时器:  timer=setInterval(任务函数,interval)

让引擎每隔interval ms自动执行一次任务函数

其中: timer: 是当前定时器任务的一个序号

3. 停止定时器: clearInterval(timer)

如果需要停止定时器,都要在启动时就提前保存序号

如何自动停止定时器:

在任务函数的结尾,判断一个临界值,如果达到临界值,就停止定时器.

一次性定时器: 让程序先等待一段时间,再自动执行一次任务。

执行一次后,自动停止。

何时: 只要先等待一段时间,再执行一次任务

用法: 同周期性定时器

1. 任务函数:

2. 启动: timer=setTimeout(task,wait);

3. 停止: clearTimeout(timer);

不是停止执行,而是停止等待

正课:

1. BOM常用对象: history,   location,   navigator

2. ***event

1. BOM常用对象:

history: 保存当前窗口打开后成功访问过的url历史记录栈

history.go(n): 前进n步

前进一步: history.go(1)

后退一步: history.go(-1)

刷新: history.go(0)

location: 封装当前窗口正在打开的url的对象

属性:

href: 完整url

protocol: 协议

host: 主机名+端口

hostname: 主机名

port: 端口

pathname:路径

hash: #锚点名

search: ?表单变量

方法:

在当前窗口打开新链接:

location.href="url";

location="url";

location.assign("url");

在当前窗口打开,不可后退:

location.replace("url");

重新加载当前页面:

location.reload(force)

其中: force: 表示是否强制从服务器硬盘获取文件。

true/false

navigator: 封装浏览器配置信息的对象

cookieEnabled: 判断浏览器是否启用cookie

cookie: 客户端本地,持久存储用户私密数据的文件

plugins: 包含了所有插件的信息

userAgent: 包含浏览器名称和版本号的字符串

*******************************************************************************Day 06

回顾:

1. 定时器:

1. 任务函数:

周期性: 任务函数结尾可能需要判断临界值,自动停止

2. 启动定时器:

周期性: timer=setInterval(任务函数,interval);

一次性: timer=setTimeout(任务函数,wait);

3. 停止定时器:

周期性: clearInterval(timer);  timer=null

一次性: clearTimeout(timer); timer=null

动画:

DISTANCE   DURATION   STEPS

step   interval

timer  moved

start(): setInterval(moveStep.bind(this),interval);

moveStep(): 将主角移动一个step

在moveStep结尾,判断临界值,自动停止

2. BOM常用对象:

history.go(n)

location:

属性:

href,  protocol, host, hostname,port,  pathname, hash, search

方法:

1. 在当前窗口打开新连接,可后退:

location="url";

location.href="url";

location.assign("url");

2. 在当前窗口打开,不可后退:

location.replace("url");

3. 重新加载当前页面:

location.reload(false/true)

navigator:

cookieEnabled

plugins

userAgent

正课:

1. ***event:

1. 什么是事件: 用户手动触发的或浏览器自动触发的页面或元素状态的改变。

所有事件: https://developer.mozilla.org/en-US/docs/Web/Events

当事件发生时,浏览器会自动调用事件处理函数:

事件处理函数: 当事件发生时,自动调用的函数

on事件名 ——其实就是一个元素的特殊属性

特殊: 需要绑定一个函数

如何绑定事件处理函数: 3种:

1. 在元素的开始标签中绑定:

<button onclick="js语句(this)"></button>

button.onclick=function(){//this->button

eval("js语句(this)")

}

当单击按钮时:  button.onclick()

问题: 不符合内容与行为分离的原则,不便于维护

解决:

2. 在js中为元素的事件处理函数属性赋值:

btn.onclick=function(){//this->button

...

}

问题: 一个事件处理函数属性,只能绑定一个函数对象

解决:

3. 使用API添加事件监听:

btn.addEventListener("事件名",函数对象)

btn.removeEventListener("事件名",函数对象)

优: 1. 同一事件处理函数属性同时可绑定多个函数对象

2. 可移除绑定的函数对象

3. 可改变事件触发的顺序

事件周期:

DOM: 3个阶段:

1. 捕获: 从最外层元素,向内层元素,逐个记录绑定的事件处理函数。默认,暂不触发任何事件。

2. 目标触发:  优先触发目标元素上绑定的事件处理函数

目标元素: 实际点击的元素

3. 冒泡: 按照捕获的顺序,由内层,向外层逐层触发捕获的事件处理函数

修改事件触发的顺序:

btn.addEventListener("事件名",函数对象,capture)

其中:capture表示是否在捕获阶段就提前触发

默认false, 只在冒跑阶段才触发

改为true, 在捕获阶段提前触发

事件对象: event

事件发生时,自动创建的,封装事件信息的对象

还提供了对事件进行操作的API

获得event对象:

DOM: 事件发生时,会自动创建event对象

会将event对象作为事件处理函数的第一个参数自动传入。

阻止冒泡: e.stopPropagation();

利用冒泡:

优化: 尽量少的创建事件监听对象

事件监听对象容易形成闭包,很难释放

解决: 如果多个平级子元素需要绑定相同的事件处理函数时,只要在父元素上绑定一次即可。所有子元素共用

核心问题:

1. 如何获得目标元素: e.target

2. 屏蔽不需要的元素的干扰

取消事件(阻止默认行为): 当事件执行过程中,遇到问题,可取消事件。不再触发

如何: e.preventDefault();

练习: form对象: 事件: onsubmit  当提交前触发

回顾:

1. ***event

elem.addEventListener("事件名",函数,capture);

elem.removeEventListener("事件名",函数);

e.stopPropagation(); //取消冒泡

e.target //获得目标元素

e.preventDefault(); //阻止默认行为

正课

1. ***event

事件坐标:

参照屏幕左上角: e.screenX, e.screenY

参照文档显示区左上角: e.clientX||e.x  ,   e.clientY||e.y

参照所在父元素的左上角: e.offsetX , e.offsetY

页面滚动事件:

onscroll:

获得页面滚动过的距离:

document.body.scrollTop||                                            document.documentElement.scrollTop

2. cookie:

创建: document.cookie=

"变量名=值;expires="+date.toGMTString();

最新文章

  1. java中scanner类的用法
  2. 4. K线基础知识
  3. 如何知道使用的是哪种shell?
  4. oracle数据库高级应用之《触发器的建立》
  5. Google Guava之--cache
  6. POJ1845Sumdiv(求所有因子和 + 唯一分解定理)
  7. paper 55:图像分割代码汇总
  8. Softerra LDAP Browser 使用及配置 有图有真相
  9. Java 基础学习1 -- 基础语法
  10. DemoExample
  11. 正则表达式的秘籍-b
  12. 第一章——Activity的生命周期
  13. VMware workstation 安装错误提示1021解决方法
  14. Laravel踩坑笔记——illuminate/html被抛弃
  15. 永久关闭selinux | 防火墙
  16. RESTful api风格介绍
  17. Assembly.LoadFrom加载程序集无法释放资源的解决方案
  18. python中stack在实际中的简单应用之平衡符号
  19. Gym-101653:acific Northwest Regional Contest (2019训练第一场)
  20. 发送统计邮件shell脚本

热门文章

  1. Makefile 一点一滴(三)—— 尝试简单的变量替换
  2. 使windows隐藏文件全部显示出来
  3. 【转】Sublime Text3注册码(可用)
  4. Javascript跨域
  5. Sql 常用时间转换
  6. red hat enterprise 6安装tftp服务
  7. mysql关于timestamp类型
  8. 如何布局包含Image和Title的UIButton
  9. cocos2d-x 3.2 创建新项目问题
  10. http数据返回值