之前在 Safari 上用 focus 事件来实现 Dropdown 下拉菜单,结果在 iOS 上不兼容。

尝试了 MDN 和 stack over flow 上各种奇技淫巧,然而在 iOS 上全都败下阵来。

孙子兵法云:上兵伐谋。看来正面不行,就要侧面来。

与其针对 iOS Safari 这个怪物,不如来次釜底抽薪,永绝后患。

我们不用 iOS 上不友好的事件,只用click这种没有问题的事件接口。

监听到全局的click事件触发,就立即关闭下拉菜单。

app.component.html中监听

  1. <div (click)="onTap($event)" class="h-100"></div>

app.component.ts中处理

  1. export class AppComponent {
  2. constructor(private globalSvc: GlobalStatusService) {
  3. }
  4. onTap(event: Event) {
  5. this.globalSvc.globalClick(event);
  6. }
  7. }

这里封装了一个全局的状态服务GlobalStatusService.ts

  1. import { Injectable } from '@angular/core';
  2. import { Subject } from 'rxjs';
  3. @Injectable({
  4. providedIn: 'root'
  5. })
  6. export class GlobalStatusService {
  7. private clickRootSource = new Subject<Event>();
  8. clickRoot$ = this.clickRootSource.asObservable();
  9. constructor() { }
  10. globalClick(event: Event) {
  11. this.clickRootSource.next(event);
  12. }
  13. }

在全局范围内注入,传播这个点击事件给所有的订户。

Dropdown所在的nav-menu.ts中订阅这个全局点击事件

  1. this.globalSvc.clickRoot$.subscribe(x => {
  2. this.closeNav();
  3. this.closeAuthDropdown();
  4. }

这样当全局点击事件触发时就能自动关闭下拉菜单了,但是呢,我们希望点击菜单中某些区域时不要自动关闭下拉菜单。

这也不难办,我们只要控制这个区域的点击事件不要冒泡即可,例如这个下拉菜单中的一个按钮,

  1. <button class="flex-sm-right" (click)="nobuble($event)">
  2. 子菜单
  3. </button>
  1. nobuble(event: Event) {
  2. event.stopPropagation();
  3. }

通过stopPropagation()阻止事件冒泡,这样全局点击事件就不会触发了,完美实现我们的需求。

如此,终于攻破了 iOS Safari 这个阻止提高用户体验的城池。

Angular 彻底解决 Dropdown 在 Safari 上无法自动关闭的问题的更多相关文章

  1. 解决iphone safari上的圆角问题

    -webkit-appearance : none ; /*解决iphone safari上的圆角问题*/

  2. 在safari上,解决fixed失效问题

    一个页面中有头部.底部和中间内容区域,底部固定在屏幕底端. 头部header 内容main 底部footer 方法一.在main上使用fixed定位,加上overflow-y属性. .main { p ...

  3. 水平/竖直居中在旧版Safari上的bug

    今天调了两个出现在旧版Safari上的layout bug. 它们最初是在同事的iPad上被发现的, 我在自己桌面上安装的Safari 5.1.7上也能够复现. Bug1: .vertical-cen ...

  4. JavaScript new Date()在Safari上的坑

    问题描述 我们经常用yyyy-MM-dd HH:mm:ss格式表示日期,如2018-11-11 00:00:00,在js开发中也经常会把此格式字符串格式化为javascript Date类型,如new ...

  5. Angular复习笔记7-路由(上)

    Angular复习笔记7-路由(上) 关于Angular路由的部分将分为上下两篇来介绍.这是第一篇. 概述 路由所要解决的核心问题是通过建立URL和页面的对应关系,使得不同的页面可以用不同的URL来表 ...

  6. 彻底理解Toast原理和解决小米MIUI系统上没法弹Toast的问题

    1.Toast的基本使用 Toast在Android中属于系统消息通知,用来提示用户完成了什么操作.或者给用户一个必要的提醒.Toast的官方定义是这样的: A toast provides simp ...

  7. 解决虚拟机连接不上外网,不能互相ping通

    0.解决虚拟机连接不上外网,不能互相ping通 直接在linux系统下,编辑修改如下文件: //编辑文件/etc/sysconfig/network-scripts/ifcfg-eth0 [root@ ...

  8. 解决在静态页面上使用动态参数,造成spider多次和重复抓取的问题

    我们在使用百度统计中的SEO建议检查网站时,总是发现“静态页参数”一项被扣了18分,扣分原因是“在静态页面上使用动态参数,会造成spider多次和重复抓取”.一般来说静态页面上使用少量的动态参数的话并 ...

  9. AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...

随机推荐

  1. Maven设置http代理

    背景:有时候公司处于安全因素的考虑,需要通过代理访问因特网,这种情况需要为Maven设置htpp代理 设置步骤如下: 1 首先确认自己无法访问外网公共的中央仓库(可通过ping repo1.maven ...

  2. Chapter 07-Basic statistics(Part3 correlations)

    这一部分使用R基础已安装包中的state.x77数据集.该数据集的数据是关于美国50个州在1977年对人口,收入,文盲率,平均寿命,谋杀率,高中毕业率统计所得. 1.关联的种类(types of co ...

  3. VMware中linux虚拟机的安装

    打开安装的VMware 15,点击新建虚拟机 2.选择典型即可,点击下一步 3.选择“稍后安装操作系统”,点击下一步 4.选择想安的版本,点击下一步 5.设置虚拟机名称及安装位置(路径必须全英文!) ...

  4. Git基础用法

    从远程仓库拉取代码: git clone https://xxxx.xxx.xx 进入拉取到代码的路径下,(文件夹中含有 .git 隐藏文件夹) 查看当前是否关联到远git代码管理 git statu ...

  5. 堡垒机WebSSH进阶之实时监控和强制下线

    这个功能我可以不用,但你不能没有 前几篇文章实现了对物理机.虚拟机以及Kubernetes中Pod的WebSSH操作,可以方便的在web端对系统进行管理,同时也支持对所有操作进行全程录像,以方便后续的 ...

  6. Python 报错集合

    1.django_error:HINT: Add or change a related_name argument to the definition for...报错, 详情见: https:// ...

  7. [TimLinux] JavaScript querySelectorAll返回对象无法使用indexOf问题

    1. querySelectorAll 该函数返回的对象类型为NodeList,这个类型并没有indexOf方法,如果需要使用indexOf方法,需要先将该对象每一项转存入Array对象中,然后就可以 ...

  8. HDU1079 Calender Game

    Adam and Eve enter this year’s ACM International Collegiate Programming Contest. Last night, they pl ...

  9. CS5642-V3与OV5642-FPC通过icamera测试方向的对比图

    有朋友会有如此的疑问:CS5642-V3与OV5642-FPC在采集板上通过icamera测试图像方向是一样吗?通过本文您会找到答案   测试:CS5642-V3与OV5642-FPC的管脚在上 以下 ...

  10. 【Nodejs】392- 基于阿里云的 Node.js 稳定性实践

    前言 如果你看过 2018 Node.js 的用户报告,你会发现 Node.js 的使用有了进一步的增长,同时也出现了一些新的趋势. Node.js 的开发者更多的开始使用容器并积极的拥抱 Serve ...