跳到主要内容

业务

如何阻止输入框里可以输入 e

在 HTML 中,<input type="number" /> 允许用户输入数字,但默认情况下也允许输入字母 e(用于科学计数法,例如:1e3 表示 1000),这在某些业务场景下可能不符合需求。

可以使用 onkeydown 事件过滤输入

<input type="number" onkeydown="return (event.key !== 'e' && event.key !== 'E');" />

自定义 element plus 的每个轮播项有不同的停留时间

场景:使用 element plus 的走马灯 carousel 组件能展示图片和视频,并且支持自定义每个轮播项有不同的停留时间

我们需要通过 next 方法手动控制何时切换到下一个项目。

<script setup lang="ts">
import { ref, onMounted } from 'vue';

const lists = ref([
{ id: 1, type: 'img', banner: '/src/assets/sea1.jpg', target: 'www.baidu.com', duration: 3000 },
{ id: 2, type: 'video', banner: '/src/assets/sky.mp4', target: 'www.baidu.com', duration: 10000 },
{ id: 3, type: 'img', banner: '/src/assets/sea2.jpg', target: 'www.baidu.com', duration: 5000 },
{ id: 4, type: 'img', banner: '/src/assets/sea3.jpg', target: 'www.baidu.com', duration: 8000 }
]);

const carouselRef = ref(null);

let currentTimeout = null;
const handleChange = index => {
if (currentTimeout) clearTimeout(currentTimeout);

// 设置新的定时器,根据当前轮播项的停留时间切换到下一项
currentTimeout = setTimeout(() => {
carouselRef.value.next(); // 切换到下一项
}, lists.value[index].duration);
};

// 检查URL是否包含协议,防止浏览器将目标地址误认为是相对路径
function addProtocolIfMissing(url) {
if (!/^https?:\/\//i.test(url)) {
return 'https://' + url;
}
return url;
}

const handleClick = item => {
const targetUrl = addProtocolIfMissing(item.target);
window.open(targetUrl, '_blank'); // _self
};

onMounted(() => {
handleChange(0); // 手动触发第一次
});
</script>

<template>
<div class="wrapper">
<el-carousel height="300px" ref="carouselRef" :interval="0" @change="handleChange">
<el-carousel-item v-for="item in lists" :key="item.id" @click="handleClick(item)">
<img v-if="item.type === 'img'" :src="item.banner" alt="" />
<video v-else :src="item.banner" autoplay loop muted />
</el-carousel-item>
</el-carousel>
</div>
</template>

<style scoped>
img {
width: 100%;
height: 100%;
object-fit: cover;
}
video {
width: 100%;
height: 100%;
object-fit: cover;
}
</style>