【问题标题】:Quill.js doesn't work properly in a Vuetify v-dialogQuill.js 在 Vuetify v-dialog 中无法正常工作
【发布时间】:2019-03-09 18:12:57
【问题描述】:

我正在尝试在 Vuetify v-dialog 中使用 Quill.js 编辑器,但是当用户在当前打开的下拉菜单之外单击时,工具栏下拉菜单不会关闭。

我做了一个 js Fiddle: https://jsfiddle.net/6d7bef5n/

<div id="app">
  <v-app>
     <quill-editor v-model="content"></quill-editor>
     <v-dialog v-model="dialog">
        <quill-editor v-model="contentKo"></quill-editor>
      </v-dialog>
     <v-btn @click.stop="dialog = !dialog">Open Quill in a Modal</v-btn>
  </v-app>
</div>
Vue.use(VueQuillEditor)

Vue.use(VueQuillEditor)
new Vue({
  el: "#app",
  data() {
    return {
      content: "I'm OK",
      contentKo: "I'm Wrong, Toolbar dropdowns are not closing on blur",
      dialog: false
    }
  }
});

似乎 v-dialog 组件在他的内容槽内的事件上做错了,可能是打开/关闭行为,但没有找到什么。

谢谢

【问题讨论】:

  • @MarlburroW 我制作的自定义选择组件也有同样的问题。当我在 Vuetify 对话框中使用它时,当我单击它外部时它不会关闭它的下拉列表。您找到问题的解决方案了吗?
  • 否 :(,我认为这是由激活 v-dialog 时删除的 eventListener 引起的(可能是模糊或焦点事件),我真的不知道,我要调查vuetify 代码库中的更多内容:github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/…
  • 我找到了我的问题的原因,它是由这一行引起的:github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/… 如果我删除这一行,当我点击它外部时,我的下拉菜单会正确关闭。但是删除此行可能会导致不必要的副作用。
  • 是的,评论那行代码也解决了我的问题。然后点击事件传播,我的指令/组件接收它。

标签: vue.js vuetify.js quill


【解决方案1】:

正如@MarlburroW 指出的那样,当用户在对话框内部单击时,Vuetify 的 VDialog 组件会停止单击事件的传播。

https://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/components/VDialog/VDialog.js#L284

在我的例子中,我有一个自定义指令,可以检测目标元素之外的点击,例如下拉组件。这行得通,但是如果您在 Vuetify 的对话框中使用这样的组件,自定义指令将不起作用,因为 VDialog 停止了点击事件的传播。

Vuetify 有自己的外部点击指令,它们用于菜单、选择...等。它不会受到这个问题的影响。

https://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/directives/click-outside.ts

我查看了 Vuetify 的指令和我自己的指令之间的区别,它起作用的原因是它们使用捕获而不是冒泡事件侦听器。

下面的codepen演示了它:

https://codepen.io/geersch/pen/LoLgYK

onClick = function (e) { console.log('The click event bubbled up.'); };

document.body.addEventListener('click', onClick, { capture: true });
// document.body.addEventListener('click', onClick, { capture: false });

dialog = document.querySelector('#dialog');
dialog.addEventListener('click', function (e) {
    e.stopPropagation();
});

所以我只是将指令更改为也使用捕获。

【讨论】:

    【解决方案2】:
    .quill-editor {
      user-select: auto !important;
      -moz-user-select: auto !important;
      -webkit-user-select: auto !important;
      -ms-user-select: auto !important;
    }
    

    试试看。它对我有用。

    【讨论】:

    • 尝试修复我的 jsfiddle :jsfiddle.net/6t9seo8a/1 但这并不能解决我的问题。我认为它与 Javascript 更相关。
    猜你喜欢
    • 2021-08-04
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多