js

从addEventListener说起js事件传递

addEventListener的第三个参数可以被当作是否使用capture模式的开关,默认不使用,即事件传递方法为冒泡传递。 冒泡的方法是从下到上,或者说从内到外,总是从event target开始向上一级一级传递。例如点击一个链接,冒泡传递是从a的DOM开始传递的,最终到了document(假如中间没有被禁止传递的话)。 在某些老浏览器上(例如IE9以下),这是唯一的事件传递方式。现代浏览器还支持capture方式传递事件。 capture是从最外层开始向内传递事件。 和事件相关的两个操作:preventDefault和stopPropagation,前者阻止事件默认行为发生,例如点击链接,默认行为是跳转到某页面,但如果调用preventDefault,则不会再跳转页面。不管是从内向外还是从外向内传递事件,事件的默认行为总是在事件传递结束后再执行的,如果不是这样,整个传递链条上的handler就不能有效处理事件了,例如从内向外传递,如果一开始默认行为就执行了,那上层的DOM根本无法阻止该事件发生与否了。 在传递过程中,每一层的事件处理方法(event

js

js中new、prototype、function提升问题

在一个前端面试题中发现几个概念,虽说面试题考的一般都不太容易在工作中遇到,但掌握这些对于debug、阅读代码、有时理解原理有帮助,原文在这里,直接去原文看也不错。 执行结果都是弹出alert。虽然也写了不少js,但和oo相关的概念并没有弄清楚,借着这个题能掌握一些。 在js中一个function可以被直接调用,也可能被new,而后者显然是oo中的东西,好像在java中常见。一个function被new,这个function就被看作是oo中class的构造函数,会返回一个object,如果function中有this.field_name=name之类的语句,产生的object中就会有field_name这个属性,同时有一点需要注意的是,即便是new,也相当于执行了这个function一次,所以里面其他的操作也都是执行过了的,并不只是生成了object和设置了各种属性。另外,如果作为构造函数,不应该有返回值,但js就是允许有,