外观
外观
怡然
345字约1分钟
自用小组件Javascript
2025-01-13
相关信息
需求中需要在一个输入框中点击获得焦点时弹出一个悬浮框,悬浮框内部可以进行输入搜索、点选等操作,点击非悬浮面板区域则隐藏面板。显示的操作可以通过输入框获得焦点的方法实现,但是隐藏显然不可以使用失去焦点的事件。因为悬浮面板中还需进行多个获取焦点的操作,一旦面板获取焦点就会直接隐藏,无法进行后续操作。
contains
<template>
<el-input readonly v-model="queryForm.dept" @focus="showDePanel = true" id="panel-one"
style="max-width: 180px;height: 40px;">
</el-input>
<search-panel v-if="showDePanel" :list="departmentList" @get-node="getDeNode"
@close-panel="showDePanel = false">
</search-panel>
<el-input readonly v-model="queryForm.business" @focus="showBuPanel = true" id="panel-two"
style="max-width: 180px;height: 40px;">
</el-input>
<search-panel v-if="showBuPanel" :list="businessList" @get-node="getBuNode"
@close-panel="showBuPanel = false">
</search-panel>
</template>
<script>
export default{
methods:{
handleGlobalClick(event) {
const target = event.target;
this.positionOne = document.querySelector('#panel-one'); // 输入框一
this.positionTwo = document.querySelector('#panel-two'); // 输入框二
if (this.positionOne && this.positionOne.contains(target)) {
this.showDePanel = true; // showDePanel为其中一个悬浮框显示隐藏的控制字段
} else {
this.showDePanel = false;
}
if (this.positionTwo && this.positionTwo.contains(target)) {
this.showBuPanel = true;
} else {
this.showBuPanel = false;
}
},
},
beforeDestroy() {
document.removeEventListener('click', this.handleGlobalClick);
},
watch: {
showDePanel(newValue, oldValue) {
if (newValue) {
document.addEventListener('click', this.handleGlobalClick);
} else {
document.removeEventListener('click', this.handleGlobalClick);
}
},
showBuPanel(newValue, oldValue) {
if (newValue) {
document.addEventListener('click', this.handleGlobalClick);
} else {
document.removeEventListener('click', this.handleGlobalClick);
}
},
},
}
</script>