【问题标题】:matTooltip not working correctly on iOS (Safari)matTooltip 在 iOS (Safari) 上无法正常工作
【发布时间】:2021-03-25 15:40:34
【问题描述】:

我正在使用来自Angular MaterialTooltip,但工具提示无法在 iOS (Safari) 上正确显示。这是我遇到的行为:

  • 装有 iOS 12 的 iPhone:长按按钮会显示工具提示,但也会执行 click 事件
  • 装有 iOS 13 的 iPad:长按时根本没有工具提示
  • 装有 iOS 14 的 iPhone:长按时会显示工具提示,但会出现弹出菜单(剪切、复制、粘贴...)并选择下面的文本

在 Android 上,一切都按预期工作。在我看来,matTooltip 根本无法在 iOS 上运行。这是我的设置:

Angular CLI:8.3.29
角度:8.2.14
@angular/cdk 8.2.3
@角/材料8.2.3

我的示例代码基于this here:

app.component.html

<button mat-raised-button
        matTooltip="Info about the action"
        aria-label="Button that displays a tooltip when focused or hovered over"
        (click)="clickEvent()">
  Action
</button>

app.component.css:

* {
    -webkit-touch-callout: none;
    -webkit-user-select: none; /* Disable selection/copy in UIWebView */
}

app.component.ts:

import { Component } from '@angular/core';
import {MatDialog, MatDialogConfig} from '@angular/material';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'tooltip';

  constructor(private dialog: MatDialog) {}

  clickEvent(){
    window.alert('clicked');
  }
}

app.module.ts:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
import {MatTooltipModule} from '@angular/material/tooltip';
import {MatButtonModule} from '@angular/material/button';
import {MatDialogModule} from '@angular/material';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    NoopAnimationsModule,
    MatTooltipModule,
    MatButtonModule,
    MatDialogModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

我尝试应用特殊的 CSS(见上文),但该 CSS 必须以不同的方式应用才能生效。但是元素仍然存在问题,无法选择(例如在表单中)。

这是一个错误还是我遗漏了什么?

【问题讨论】:

    标签: ios angular angular-material tooltip angular-material2


    【解决方案1】:

    Angular material docs on tooltip(参见 api 部分 -> Directives -> MatToolTip -> properties -> TouchGestures),实际上对这种行为做了一些说明:

    工具提示应如何处理触摸手势。在触摸设备上,工具提示指令使用长按手势来显示和隐藏,但它可能与本机浏览器手势冲突。为了解决这个冲突,Angular Material 禁用了触发器上的原生手势,但这可能不适用于特定元素(例如输入和可拖动元素)。此选项的不同值配置触摸事件处理如下:

    • auto - 为所有元素启用触摸手势,但尽量避免 与特定元素上的本机浏览器手势冲突。在 特别是,它允许在输入和文本区域上进行文本选择,并且 保留本地浏览器拖动标记为的元素 可拖动。
    • on - 为所有元素启用触摸手势并禁用 本机浏览器手势无一例外。
    • off - 禁用触摸 手势。请注意,这将阻止工具提示显示 触摸设备。

    基于此,可以使用您的示例代码尝试类似的操作:

    <button mat-raised-button #tooltip="matTooltip"
            matTooltip='Info about&#13;the action'
            matTooltipPosition="right"
            matTooltipClass="allow-cr"
            aria-tooltip="Button that displays and hides a tooltip triggered by other buttons"
            matTooltipTouchGestures="on">
      Action
    </button>
    

    【讨论】:

    • 感谢您的提示。明天我会测试更多(因为我的 iOS 14 设备目前不可用)。我在其他设备上进行了尝试,结果如下:点击事件,一切都保持不变。如果没有点击事件,它可以在 iOS 12 设备上运行,但仍然不能在 iPad 上运行……(click) 在这里扮演什么角色?
    • 虽然我无法清楚地理解您的评论,但您可以尝试在 clickEvent() 函数执行结束时返回 false 以防止默认行为。看到这个:stackoverflow.com/questions/855360/….
    • 我目前的结果:装有 iOS 13 的 iPad:工具提示根本不起作用。 带有 iOS 12 的 iPhone:尽管在事件内部有 return false,但在长按时触发了 click 事件,但是当 click 事件被删除时,一切正常根据需要在这里。 iOS 14 的 iPhone 模拟器:长按显示工具提示,但也选择文本(在本例中为文本“信息”)。所有的共同点(除了 iPad):单击不仅会执行 click 事件,还会显示工具提示(不是那么重要,但我想提一下)。我可以做些什么来改善工具提示的行为吗?
    • 抱歉,我无法针对所执行的 IOS 事件提出任何具体建议,我的答案基于 Angular 文档,这是我根据 API 部分中的规范所能提供的最好的。
    • 没问题,感谢您的帮助。你认为我应该将此报告为错误还是我做错了什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 2017-12-02
    • 2022-07-14
    • 1970-01-01
    相关资源
    最近更新 更多