![]()
前言
对于弹框,正常情况是:点击box区域,遮挡层和box元素都会隐藏。而需求是:点击弹框内容,弹框不会隐藏,而点击弹框以外的任何地方弹框隐藏,这里具体说明实现方法。
核心代码
1  | while (elem) {  | 
实现思路
 (1)该while循环的循环条件是:当elem元素存在时,执行循环,否则跳出循环。
    (2)判断elem是不是box。如果是,终止这个点击事件的回调函数,所以就不会执行$('#box').css('display', 'none'); $(".popup").removeClass("popup-show");这两句代码。如何不是,执行elem =elem.parentNode; 。
    (3)那么elem =elem.parentNode; 这行代码的意义在哪里?这么说吧,如果没有这行代码的话,这个while循环将是一个死循环,永远跳不出这个循环。
打印一下elem发生了什么变化~
1  | while (elem) {  | 
当点击box以外的区域时,打印结果为:

分析一下:
 发现经过了四个循环:
    第一个循环:当elem为expense-popup 元素时,经过赋值后,elem为body元素;
 第二个循环:当elem为body元素时,经过赋值后,elem为html元素;
 第三个循环:当elem为html元素时,经过赋值后,elem为document元素;
 第四个循环:当elem为document元素时,因为没有比document层级还要高的元素了,因此elem为null。
 最后,elem为null,不符合while循环条件,因此跳出循环。
完整案例
1  | 
  |