面试问题
Q1 . link标签和import标签的区别有什么?
外部引用CSS有两种方法,link标签和import
1.加载顺序区别
link和页面一同加载,import在页面加载完之后再加载
2.兼容性区别
link的兼容性比import好
@import
是 CSS2.1 才有的语法,故只可在 IE5+ 才能识别;
link
标签作为 HTML 元素,不存在兼容性问题。
3.DOM可控性区别
可以通过 JS 操作 DOM ,插入link
标签来改变样式;
由于 DOM 方法是基于文档的,无法使用@import
的方式插入样式。
4.从属关系区别@import
是 CSS 提供的语法规则,只有导入样式表的作用;
link
是HTML提供的标签,不仅可以加载 CSS 文件,还可以定义 RSS、rel 连接属性等。
5.权重区别(该项有争议,下文将详解)link
引入的样式权重大于@import
引入的样式。
Q2 .如何让事件先冒泡后捕获
首先,如果是目标元素自身的事件想要先冒泡后捕获,就把添加冒泡事件代码放在添加捕获事件前面。
但是,对于非目标元素的事件,作为父元素,想不到有特别好的办法能实现先冒泡后捕获。能想到的就是:
设置一个用于判断是否冒泡的外部变量,在事件捕获的时候先判断变量是否已经冒泡,没有的话process.nextTick(fn),在冒泡中把变量修改了,同步代码执行完成,异步代码执行之前就执行process的回调函数中再判断执行。
但是感觉这样并不完美,中间还会经过很多同步代码。
或者setTimeout(fn,0)或者setImmediate(fn),但是这两个方法又要等到所有异步代码执行完才行。
根据w3c标准,应先捕获再冒泡。若要实现先冒泡后捕获,给一个元素绑定两个addEventListener,其中一个第三个参数设置为false(即冒泡),另一个第三个参数设置为true(即捕获),调整它们的代码顺序,将设置为false的监听事件放在设置为true的监听事件前面即可。
Q3 . 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路:
//当前结点为根结点时:
//1)若根结点无右子树,返回NULL
//2)若根结点有右子树,返回右子树中最左端的结点
//当前结点为左叶子结点:
//直接返回其父结点
//当前结点为右叶子结点
//1)若其祖父结点存在且其父结点是其祖父结点的左结点,返回其祖父结点
//2)否则,返回NULL
//当前结点为非叶子结点
//1)若无右子树,返回其父结点
//2)若有右子树,返回其右子树中最左端的结点