input readonly 问题
<input type="text" class="custom-select-input" readonly
:value="selectedProvinceOption + ' / ' + selectedDistrictOption" placeholder="Province / District"
>
这个代码里 placeholder 不生效 为什么
在 HTML 表单元素中,readonly 属性的作用是让输入框不可编辑,但仍然允许用户选择和复制输入框中的文本。然而,当一个输入框是只读的(即设置了 readonly 属性),placeholder 属性不会被渲染。这是 HTML 标准的一部分。
如果希望在 readonly 状态下仍然显示占位符文本,可以通过一些额外的 CSS 或 JavaScript 来实现。
使用 CSS 和 JavaScript 实现占位符效果
以下是一个示例,展示如何使用 CSS 和 JavaScript 来模拟只读状态下的占位符效果。
示例代码
<template>
<div>
<div class="custom-select-wrapper">
<input type="text" class="custom-select-input" readonly
:value="displayValue" @focus="showPlaceholder = false" @blur="checkPlaceholder">
<span class="placeholder" v-if="showPlaceholder">{{ placeholder }}</span>
</div>
</div>
</template>
<script>
export default {
data() {
return {
selectedProvinceOption: '',
selectedDistrictOption: '',
placeholder: 'Province / District',
showPlaceholder: true,
};
},
computed: {
displayValue() {
return this.selectedProvinceOption + ' / ' + this.selectedDistrictOption;
},
},
watch: {
displayValue(newValue) {
this.showPlaceholder = newValue.trim() === '';
},
},
methods: {
checkPlaceholder() {
this.showPlaceholder = this.displayValue.trim() === '';
},
},
};
</script>
<style>
.custom-select-wrapper {
position: relative;
display: inline-block;
}
.custom-select-input {
padding: 10px;
font-size: 16px;
width: 200px;
}
.placeholder {
position: absolute;
top: 50%;
left: 10px;
transform: translateY(-50%);
color: #999;
pointer-events: none;
user-select: none;
}
</style>
解释
-
HTML 模板:
- 使用
div包裹input,并在div中添加一个span来显示占位符。 - 绑定
input的focus和blur事件,以控制占位符的显示和隐藏。
- 使用
-
Vue 实例数据和计算属性:
selectedProvinceOption和selectedDistrictOption存储选择的省份和区县。placeholder存储占位符文本。showPlaceholder控制占位符的显示状态。displayValue计算属性用于生成输入框的显示值,并监控其变化以更新占位符状态。
-
方法:
checkPlaceholder在blur事件时调用,检查输入框是否为空,如果为空则显示占位符。
-
CSS:
- 通过
position: relative和position: absolute实现占位符文本的定位。 - 设置
pointer-events: none和user-select: none使占位符文本不可交互。
- 通过
这种方式确保即使在 readonly 状态下,仍然能够显示占位符文本。

浙公网安备 33010602011771号