e.preventdefault()别滥用

文章探讨了在IE8中,错误地在checkbox change事件回调中使用e.preventDefault()导致复选框选中状态未能正确重绘的问题,解释了e.preventDefault()对浏览器行为的影响,并提供了解决方案。

有的时候我们会为事件回调函数添加一个参数(通常是e),并在函数中加入e.preventdefault();以取消默认行为。由于习惯,我顺手将它写到了一个checkbox的change事件中。由于不同的浏览器解释不同,在IE8上出现了一个bug:change事件能进入,但是UI显示上不能讲复选框的选中状态重绘。

分析原因,是我的e.preventdefault()阻止了状态重绘。去掉后,就好了。

e.preventdefault()会阻止什么:

checkbox 、radio的状态变化(并非所有浏览器)。

a标签的跳转

表单的提交

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <title>账户批量生成系统</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Helvetica Neue', sans-serif; background: linear-gradient(135deg, #0f0c29, #302b63, #24243e); color: #e0e0e0; min-height: 100vh; display: flex; justify-content: center; align-items: center; padding: 20px; } .card { width: 100%; max-width: 480px; background: rgba(255, 255, 255, 0.08); backdrop-filter: blur(10px); border-radius: 20px; padding: 40px 30px; box-shadow: 0 8px 25px rgba(0, 0, 0, 0.25); border: 1px solid rgba(255, 255, 255, 0.1); transition: box-shadow 0.3s ease; } .card:hover { box-shadow: 0 12px 35px rgba(0, 0, 0, 0.35); } .title { text-align: center; font-size: 1.8em; font-weight: 600; color: #ffffff; margin: 10px 0 15px; letter-spacing: 0.8px; text-shadow: 0 0 10px rgba(130, 200, 255, 0.4); } .subtitle { text-align: center; font-size: 0.95em; color: #aaa; margin-bottom: 30px; opacity: 0.8; } .form-group { margin-bottom: 22px; } .form-control { width: 100%; padding: 14px 18px; font-size: 1em; background: rgba(255, 255, 255, 0.1); color: white; border: 1px solid rgba(255, 255, 255, 0.2); border-radius: 12px; outline: none; transition: all 0.3s ease; } .form-control::placeholder { color: rgba(255, 255, 255, 0.5); } .form-control:focus { border-color: #6a5af9; box-shadow: 0 0 0 3px rgba(106, 90, 249, 0.3); background: rgba(255, 255, 255, 0.15); } .custom-select-wrapper { position: relative; width: 100%; } .custom-select-trigger { width: 100%; padding: 14px 18px; font-size: 1em; background: rgba(255, 255, 255, 0.1); color: white; border: 1px solid rgba(255, 255, 255, 0.2); border-radius: 12px; cursor: pointer; display: flex; justify-content: space-between; align-items: center; transition: all 0.3s; } .custom-select-trigger::after { content: '▼'; font-size: 0.7em; color: #ccc; } .custom-select.open .custom-select-trigger::after { transform: rotate(180deg); } .custom-options { position: absolute; top: 100%; left: 0; right: 0; margin-top: 6px; background: #1e1e2d; border: 1px solid rgba(255, 255, 255, 0.1); border-radius: 10px; max-height: 200px; overflow-y: auto; z-index: 10; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.4); opacity: 0; visibility: hidden; transform: translateY(-8px); transition: all 0.2s ease; } .custom-select.open .custom-options { opacity: 1; visibility: visible; transform: translateY(0); } .custom-option { padding: 12px 18px; color: #ddd; cursor: pointer; transition: background 0.2s; } .custom-option:hover, .custom-option.selected { background: #6a5af9; color: white; } .btn-submit { width: 100%; padding: 14px; background: linear-gradient(90deg, #6a5af9, #8a7eff); color: white; font-size: 1.1em; font-weight: 600; border: none; border-radius: 12px; cursor: pointer; transition: all 0.3s ease; letter-spacing: 0.8px; box-shadow: 0 4px 15px rgba(106, 90, 249, 0.3); } .btn-submit:hover { background: linear-gradient(90deg, #5d4df8, #7a6dff); box-shadow: 0 7px 20px rgba(106, 90, 249, 0.4); } .msg-box { margin-top: 18px; padding: 12px 16px; border-radius: 10px; font-size: 0.95em; text-align: center; opacity: 0; height: 0; overflow: hidden; transition: opacity 0.4s ease; } .msg-box.show { opacity: 1; height: auto; margin-bottom: 10px; } .msg-success { background-color: rgba(76, 175, 80, 0.2); color: #8bc34a; border: 1px solid rgba(76, 175, 80, 0.3); } .msg-error { background-color: rgba(244, 67, 54, 0.2); color: #ef9a9a; border: 1px solid rgba(244, 67, 54, 0.3); } @media (max-width: 480px) { .card { padding: 30px 20px; border-radius: 16px; } .title { font-size: 1.6em; } } </style> </head> <body> <div class="card"> <h3 class="title">账户批量生成</h3> <p class="subtitle"></p> <form id="register-form" autocomplete="off" action="cdks.php" method="post"> <input type="hidden" id="type" name="type" value=""> <div class="form-group"> <input type="text" class="form-control" id="sqm" name="sqm" placeholder="请输入 GM 授权码" required> </div> <div class="form-group"> <input type="number" class="form-control" id="num" name="num" placeholder="请输入生成数量 (1-1000)" min="1" max="1000" required> </div> <div class="form-group custom-select-wrapper"> <div class="custom-select" id="customSelect"> <div class="custom-select-trigger">请选择类型</div> <div class="custom-options"> <div class="custom-option" data-value="2">账户批量生成</div> </div> </div> </div> <button type="submit" class="btn-submit">✨ 生成授权码</button> <div id="divMsg" class="msg-box"></div> </form> </div> <script> document.addEventListener('DOMContentLoaded', function () { const customSelect = document.getElementById('customSelect'); const trigger = customSelect.querySelector('.custom-select-trigger'); const options = customSelect.querySelectorAll('.custom-option'); const hiddenInput = document.getElementById('type'); const form = document.getElementById('register-form'); const msgBox = document.getElementById('divMsg'); trigger.addEventListener('click', function (e) { e.stopPropagation(); customSelect.classList.toggle('open'); }); options.forEach(option => { option.addEventListener('click', function (e) { e.stopPropagation(); trigger.textContent = this.textContent; hiddenInput.value = this.dataset.value; options.forEach(opt => opt.classList.remove('selected')); this.classList.add('selected'); customSelect.classList.remove('open'); }); }); document.addEventListener('click', function () { customSelect.classList.remove('open'); }); document.addEventListener('keydown', function (e) { if (e.key === 'Enter' && e.target.tagName !== 'TEXTAREA') { e.preventDefault(); } }); form.addEventListener('submit', function (e) { e.preventDefault(); const sqm = document.getElementById('sqm').value.trim(); const num = parseInt(document.getElementById('num').value); const type = hiddenInput.value; msgBox.textContent = ''; msgBox.classList.remove('show', 'msg-success', 'msg-error'); if (!sqm) { showMsg('❌ 请填写 GM 授权码', 'error'); return; } if (!num || num < 1 || num > 1000) { showMsg('⚠️ 生成数量必须在 1 到 1000 之间', 'error'); return; } if (!type) { showMsg('⚠️ 请选择生成类型', 'error'); return; } showMsg(`✅ 正在生成 ${num} 个账户授权码...`, 'success'); }); function showMsg(text, type) { msgBox.textContent = text; msgBox.classList.add('show', type === 'success' ? 'msg-success' : 'msg-error'); } }); </script> </body> </html> 点击生成并未成功加载cdks.php内的信息生成内容
最新发布
11-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值