javascript - 如何在内部 v-tooltip 悬停时关闭外部 v-tooltip

标签 javascript vue.js vuejs2 v-tooltip

我有两个工具提示,一个在外部元素上,另一个在内部元素上,如下所示:

Nested Tooltips

如何在显示内部工具提示时删除外部工具提示?

Here's a Fiddle

代码非常标准,但请记住,有时 v-tooltip像模式一样放置工具提示 - 在正文级别,因此工具提示实际上可能不会嵌套。

<div id="app">
  <div v-tooltip="'Outer Tooltip'">
    Outer Area
    <div v-tooltip="'Inner Tooltip'">
      okokok
    </div>
  </div>
</div>

这是我尝试过的:

在 Outer Tooltip 上我放了一个这样的类:

v=tooltip="{content:'Outer Tooltip', classes:['killOnOtherOpen']}"

然后在内部工具提示上:

v=tooltip="getTextAndDoStuff()"
...
getTextAndDoStuff(){
    $('.killOnOtherOpen').close();
    return "Inner Tooltip";
}

但是我得到一个错误:

Error in render: "TypeError: $(...).close is not a function"

我试过这样:.close; - 就像 close 不是一个函数 - 但没有任何反应,甚至没有错误。

我正在寻找一种更优雅或更标准的方法来执行此操作。向每个嵌套的工具提示集添加一个类和一个方法需要一段时间。

最佳答案

您可以在处理 mouseover 事件时使用 stop 修饰符来解决这个问题,并添加一个名为 isOpen 的 bool 属性来显示/包含外部工具提示。

stop 修饰符将阻止事件传播

console.clear()

new Vue({
  el: '#app',
  data: {
    isOpen: false,
    message: 'Outer Tooltip'

  }
})
body {
  font-family: sans-serif;
  margin: 42px;
}

.tooltip {
  display: block !important;
  z-index: 10000;
}

.tooltip .tooltip-inner {
  background: black;
  color: white;
  border-radius: 16px;
  padding: 5px 10px 4px;
}

.tooltip .tooltip-arrow {
  width: 0;
  height: 0;
  border-style: solid;
  position: absolute;
  margin: 5px;
  border-color: black;
}

.tooltip[x-placement^="top"] {
  margin-bottom: 5px;
}

.tooltip[x-placement^="top"] .tooltip-arrow {
  border-width: 5px 5px 0 5px;
  border-left-color: transparent !important;
  border-right-color: transparent !important;
  border-bottom-color: transparent !important;
  bottom: -5px;
  left: calc(50% - 5px);
  margin-top: 0;
  margin-bottom: 0;
}

.tooltip[x-placement^="bottom"] {
  margin-top: 5px;
}

.tooltip[x-placement^="bottom"] .tooltip-arrow {
  border-width: 0 5px 5px 5px;
  border-left-color: transparent !important;
  border-right-color: transparent !important;
  border-top-color: transparent !important;
  top: -5px;
  left: calc(50% - 5px);
  margin-top: 0;
  margin-bottom: 0;
}

.tooltip[x-placement^="right"] {
  margin-left: 5px;
}

.tooltip[x-placement^="right"] .tooltip-arrow {
  border-width: 5px 5px 5px 0;
  border-left-color: transparent !important;
  border-top-color: transparent !important;
  border-bottom-color: transparent !important;
  left: -5px;
  top: calc(50% - 5px);
  margin-left: 0;
  margin-right: 0;
}

.tooltip[x-placement^="left"] {
  margin-right: 5px;
}

.tooltip[x-placement^="left"] .tooltip-arrow {
  border-width: 5px 0 5px 5px;
  border-top-color: transparent !important;
  border-right-color: transparent !important;
  border-bottom-color: transparent !important;
  right: -5px;
  top: calc(50% - 5px);
  margin-left: 0;
  margin-right: 0;
}

.tooltip[aria-hidden='true'] {
  visibility: hidden;
  opacity: 0;
  transition: opacity .15s, visibility .15s;
}

.tooltip[aria-hidden='false'] {
  visibility: visible;
  opacity: 1;
  transition: opacity .15s;
}

.box {
  border: 1px solid red;
  border-radius: 2px;
  padding: 15px;
  margin: 20px;
  text-align: center;
  cursor: pointer;
}

.box:hover {
  box-shadow: 0 0 4px;
}
<script src="https://unpkg.com/popper.js"></script>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/v-tooltip"></script>

<div id="app">
  <div v-tooltip="{content: message,
    show: isOpen}" class="box" @mouseover.stop="isOpen=true">
    {{ message }}
    <div v-tooltip="'Inner tooltip'" @mouseover.stop="isOpen=false" class="box">
      okokok
    </div>
  </div>
</div>

关于javascript - 如何在内部 v-tooltip 悬停时关闭外部 v-tooltip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53106709/

相关文章:

javascript - Vuejs - 如何在作用域插槽中的父子之间传递更改

javascript - 更新 Vue.js 中的父类

javascript - (Javascript) 访问 Firebase 实时数据库列表中的最后一个元素

javascript - 在 Ember.js 中为模板渲染 2 个模型时出错

vue.js - 关键依赖 : the request of a dependency is an expression, vue.js

vuejs2 - VueJs 开发工具面板未显示

javascript - 无法使 vue.js element-ui 对话框在子组件内工作

JavaScript 客户端宽度 : why is this returning undefined?

javascript - Chrome 控制台中 SetInterval() 的毫秒数

javascript - 如何在 Vue + Axios 中使用 List.JS?