关于vue.js:elementui的eldialog和eldrawer当鼠标拖动到遮罩层会触发关闭bug修复

166次阅读

共计 1445 个字符,预计需要花费 4 分钟才能阅读完成。

咱们在应用 el-dialog 和 el-drawer 时候,当弹框内有表单,用户不小心想复制个内容,拖动光标,最初光标落点在 dialog 或者 drawer 的遮罩层,导致弹框敞开,而将用户辛苦填写的内容给革除掉了。这是甲方爸爸忍耐不了的!!!因而就呈现了我这个解决办法!

  1. 在 src 目录下,(既和 main.js)同级创立一个名为 fixMouseOutsideAutoClose.js。如下:

    src
    |- ...
    |- src
    |- main.js
    |- fixMouseOutsideAutoClose.js
  2. 在 fixMouseOutsideAutoClose.js 文件内写入如下代码:

    import {Dialog, Drawer} from "element-ui";
    const DialogPatched = {
    extends: Dialog,
    data() {
    return {wrapperMouseDowned: false,};
    },
    mounted() {this.$el.onmousedown = (e) => {
    this.wrapperMouseDowned =
    e.target.classList.contains("el-dialog__wrapper");
    };
    },
    methods: {handleWrapperClick() {if (!this.closeOnClickModal || !this.wrapperMouseDowned) return;
    this.handleClose();},
    },
    };
    const DrawerPatched = {
    extends: Drawer,
    data() {
    return {wrapperMouseDowned: false,};
    },
    mounted() {this.$el.onmousedown = (e) => {
    this.wrapperMouseDowned = e.target.classList.contains("el-drawer__container");
    };
    },
    methods: {handleWrapperClick() {if (this.wrapperClosable && this.wrapperMouseDowned) {this.closeDrawer();
    }
    },
    },
    };
    export default {install(Vue) {Vue.component(Dialog.name, DialogPatched);
    Vue.component(Drawer.name, DrawerPatched);
    },
    };
  3. 在 main.js 中引入此文件,且必须在 element-ui 应用之后在应用。如下:

    // main.js 内引入 fixMouseOutsideAutoClose.js
    import PATCH_fixMouseOutsideAutoClose from "./fixMouseOutsideAutoClose.js";
    // set ElementUI lang to EN
    Vue.use(ElementUI, { locale});
    // 笼罩原生 ElDialog&ElDrawer,如果是按需引入的须要在按需引入之后再 use
    Vue.use(PATCH_ElOverlayAutoClose);

按以上操作即可实现光标拖动到 dialog 内部不会主动触发敞开事件了。

究其原因不属于事件冒泡。是所有节点再页面上,鼠标抬起时候会触发点击事件。因而须要再原始节点鼠标按下时候给一个状态,如果 click 事件触发的元素不是按下鼠标的元素则让 click 事件生效即可。

正文完
 0