首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何阻止按钮阻塞onPaste事件

如何阻止按钮阻塞onPaste事件
EN

Stack Overflow用户
提问于 2021-10-25 21:53:04
回答 1查看 226关注 0票数 1

我有一个图像模式,用户可以上传或粘贴图像。这两种方法都很好,但目前我在模式上有按钮捕捉焦点,所以粘贴只能通过手动单击按钮外部的方式工作。如果这个组件有焦点,或者组件中的任何东西都有焦点,我希望任何粘贴都能工作。

代码语言:javascript
复制
<div onPaste="onPaste()">
  <button class="__cancel" aria-label="Close" onClick="onClickCancel()">
  <button ... upload .../>
</div>

是否有办法允许粘贴操作通过按钮?

这实际上是一个角度应用程序,因此下面更接近我的实际代码:

代码语言:javascript
复制
<div (paste)="onPaste($event)" cdkTrapFocusAutoCapture cdkTrapFocus>
  <button class="__cancel" aria-label="Close" (onClick)="onClickCancel()">
  <button ... upload .../>
</div>

我尝试过将粘贴方法添加到按钮中,但它们不会触发。

代码语言:javascript
复制
<div (paste)="onPaste($event)" cdkTrapFocusAutoCapture cdkTrapFocus>
  <button class="__cancel" aria-label="Close" (onClick)="onClickCancel()" (paste)="onPaste($event)">
  <button ... upload   (paste)="onPaste($event)".../>
</div>

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-26 18:14:07

Paste事件被所有HTML元素拦截,但它只对可编辑上下文的元素(如<input><textarea>)有影响。

<div>s或<p>s等元素只有在有内容时才能接受(paste)。通过打开contenteditable,这是可能的

代码语言:javascript
复制
<div onPaste="onPaste()" contenteditable="true">
  <button class="__cancel" aria-label="Close" (click)="onClickCancel()">
                                              //^-here also
  <button ... upload .../>
</div>

下面是关于这一点的API文档摘录:

如果光标位于可编辑上下文中,则粘贴操作将以给定上下文支持的最合适格式(如果有的话)插入剪贴板数据。 粘贴操作在不可编辑的上下文中不起作用,但粘贴事件会触发。

此外,由于隐私限制,这一要素应成为重点:

为了防止滥用,除非脚本在具有焦点的文档的上下文中执行,否则不能使用此API。

不同的浏览器可能有不同的行为,但记住这些限制可能有助于代码在任何地方工作。

编辑

使按钮可满足会产生一些问题。

  • 用户可以对该区域进行聚焦,并将有一个光标。这可以通过使用 可满足的{插入色:透明;}
  • 它还使用户能够更改他们的内容,这可能是不想要的。可以通过添加一个按键处理程序来修复这个问题:

例如:

代码语言:javascript
复制
  preventKey(event: KeyboardEvent) {
    // Buttons need contenteditable to receive (paste),
    // but we don't want our buttons to be editable, so this is blocked by this function.
    if (
      !(
        event.key === 'Tab' ||
        event.keyCode == 9 ||
        ((event.ctrlKey || event.metaKey) &&
          (event.key === 'v' || event.keyCode == 86))
      )
    ) {
      event.preventDefault();
    }
  }
  • 粘贴到可内容元素上不适用于safari --除非我们使用 用户选择:自动;

如果您有一个角度的项目(如在最初的问题),这打破了cdkTrapFocus。据作者所知,这是一个角度上的错误。请参阅https://github.com/angular/components/issues/23846

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69715163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档