1. 如何绑定一个事件?有几种方法?
1.onclick(缺点:只能绑定一次)
div.onclick = function () { }
2.addEventListener(‘事件类型’, 处理函数, false)
div.addEventListener(‘click’, function () { }, false)
(优点:可以给一个元素绑定多个事件, 依次执行)
3.IE特有的一个, 类似上面的addEventListener
div.attachEvent(‘on’ + type, function () { })
题目:怎么点击一个li输出其相应的顺序?
var lis = document.getElementsByTagName('li');
for (var i = 0; i < lis.length; i++) {
(function (n) {
lis[n].addEventListener('click', function () {
console.log(n);
}, false)
}(i))
}
2. 如何快速输入li a? li顺序?
ul > li{ a } 4、ul > li{ $ } 4
3. 事件处理程序的运行环境this是什么?
1.ele.onXXX = function (event) { }
程序this指向的是dom元素本身
比如:
div.onclick = function () {
console.log(this)
}
2.obj.addEventListener(type, fn, false);
3.IE独有的一个方法
obj.attachEvent(‘on’ + type, function);
this指向的是window(了解即可)
4. 怎么解除事件处理?
1.div.onclick = false / null;
比如: 一个只能执行一次的点击事件怎么写?
div.onclick = function () {
console.log('a');
this.onclick = null;
}
2.div.removeEventListener(type, function, false);
3.IE独有:div.detachEvent(‘on’ + type, function);
5. 事件处理模型—事件冒泡、捕获是什么?
事件冒泡:
结构上(非视觉上)嵌套关系的元素,同一事件,子元素冒泡想父元素(自底向上)
< div class="a" >
<div class="b"></div>
</div >
比如,如果a和b都有点击事件,那么点击b的时候,a事件也会触发,触发顺序:1b 2a
事件捕获
结构上(非视觉上)嵌套关系的元素,同一事件,自父元素捕获至子元素(自顶向下)
<div class="a">
<div class="b"></div>
</div>
触发顺序:先捕获、后冒泡<br />focus, blur, change, submit, reset, select等事件不冒泡<br />
下面点击content之后,控制台会输出什么?为什么?
var box = document.getElementsByClassName('box')[0];
var content = document.getElementsByClassName('content')[0];
box.addEventListener('click', function () {
console.log('boxBubble');
}, false);
content.addEventListener('click', function () {
console.log('contentBubble');
}, false);
// 捕获,最后的false变成true
box.addEventListener('click', function () {
console.log('boxCatch');
}, true);
content.addEventListener('click', function () {
console.log('contentCatch');
}, true)
6. 如何取消冒泡?
比如document有事件,点击div的时候document的事件会执行,
那么怎么才能点击div的时候,document不执行?
div.onclick = function (e) {
//stopPropagation()和cancelBubble = true;都行
//注意,这里的e是系统自动传入的,包含了事件的各个状态
e.stopPropagation();
e.cancelButtle = true;
this.style.backgroundColor = 'green';
}
7. 阻止默认事件:
return false; 以对象属性的方式注册的事件才生效
event.preventDefault() w3c标注,IE9以下不兼容
event.returnValue = false; 兼容IE
以上三个,记住第一个就好,其他了解
div.onclick = function (e) {
return false;
e.preventDefault();
e.returnValue = false;
}
也可以, 这样也是取消a的默认事件, 其中void()类似return
8. 什么是事件对象?源对象?有什么作用?啥是事件委托?
IE浏览器会把事件放到window.event, 而不是e上,所有要做个兼容
var event = e || window.event //兼容
事件源对象:
event.target 火狐只有这个
event.srcElement le只有这个
这俩chrome都有,所以还需要写个兼容
var target = event.target || event.srcElement
什么是通过冒泡实现事件委托?
var ul = document.getElementsByTagName('ul')[0];
ul.onclick = function (e) {
var event = e || window.event;
var target = event.target || event.srcElement;
console.log(target.innerText);
}
实现逻辑:点击li事件,会冒泡给ul事件,而ul会找到源事件,然后输出里面的内容
优点: 性能 - 不需要循环所有元素一个个绑定事件
灵活 - 当有新的子元素时不需要重新绑定事件
9. window.onload = function(){}实现逻辑是什么?
html和css执行的时候是并行解析的。
html执行的时候会形成一个domTree,css会生成cssTree
两个树最后会形成一个树,叫做renderTree,然后才会绘制页面
dom节点的解析:先解析,挂到dom树上,然后另开一个线程去下载
onload必须等待整个文档全部解析完之后,renderTree,图片各种资源全部下载完之后,才会执行
10. 怎么实现拖拽?如何封装成一个函数?
var disX, disY;
div.onmousedown = function (e) {
var left = div.style.left;
var top1 = div.style.top;
disX = e.pageX - parseInt(left);
disY = e.pageY - parseInt(top1);
document.onmousemove = function (e) {
var event = e || window.event;
div.style.left = e.pageX - disX + "px";
div.style.top = e.pageY - disY + "px";
}
div.onmouseup = function () {
document.onmousemove = null;
}
}
封装函数:注意elem必须是定位元素(有position,而且有left=0,top=0,如果没有这俩,left和top就是auto)
function drug(elem) {
var disX, disY;
elem.addEventListener('mousedown', function (e) {
disX = e.pageX - parseInt(elem.style.left);
disY = e.pageY - parseInt(elem.style.top);
document.addEventListener("mousemove", test, false)
function test(e) {
elem.style.left = e.pageX - disX + "px";
elem.style.top = e.pageY - disY + "px";
}
elem.addEventListener("mouseup", function () {
document.removeEventListener("mousemove", test, false);
}, false);
}, false);
}
drug(div);
11. 事件分类有哪些?
1.鼠标事件有哪些?
click,mousedown,mousemove,mouseup,contextmenu,mouseover,mouseout,mouseseeter,mouseleave
2.mouseover和mouseenter啥关系?
mouseover = mouseenter mouseout = mouseleave
contextmenu是干啥的?取消右键菜单事件
3.怎么判断鼠标左键点击还是右键点击?
只能通过mousedown和mouseup判断。0 / 1 / 2;
DOM3标准规定:click事件只能监听左键,只能通过mousedown和mouseup来判断鼠标键
4.如何解决mousedown和click的冲突?
click = mousedown + mouseup
执行顺序:mousedown、mouseup、click
所以出发mousedown的一定会出发mouseup和click
那么怎么可以让他不触发click?
var key = false;
var firstTime, lastTime;
div.onmousedown = function () {
firstTime = new Date().getTime();
}
div.onmouseup = function () {
lastTime = new Date().getTime();
if (lastTime - firstTime < 300) {
key = true;
}
}
div.onclick = function () {
if (on) {
console.log("aaa")
on = false;
}
}
12. 键盘监听事件有哪些?
keydown keypress keyup
执行顺序是什么?
keydown、keypress、keyup
keypress是什么?作用是啥?
keydown没有charCode
keydown可以监听到所有的键盘类按键事件
keypress有charCode
keypress只能监听字符键盘事件。shift和上下左右、ctrl等控制键都不监听。
document.onkeypress = function(e) {
console.log(String.fromCharCode(e.charCode));
}
13. 文本事件有哪些?
input focus blur change
输入事件:文本框输入
聚焦事件:文本框聚焦
失去焦点:文本框失焦
改变:聚焦前和失焦后文本框内容改变
怎么实现输入框?
<input type='text' value='请输入用户名' style='color:#999'
onfocus="if(this.value=='请输入用户名') {
this.value='';
this.style.color = '#424242'
}"
onblur="if(this.value=='') {
this.value='请输入用户名';
this.style.color='#999'
}" />
14. 滚动事件:scroll
window.onscroll = function () {
console.log(window.pageXOffset + " " + pageYOffset)
console.log(window.pageXOffset + " " + pageYOffset)
}
当然,必须先有滚动条可以实现滚动才行。可以br*200先实现滚动条