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();