在 Web 表單開發中,常見需求是允許用戶動態添加多組「文件上傳 + URL 輸入」字段,並在提交前進行格式驗證。本文將分析一個典型的 jQuery 實現案例,指出其中的問題並提供優化方案。
提供的 JavaScript 代碼存在多個關鍵問題:
<form id="uploadForm" action="<%=request.getContextPath()%>/add.do" method="POST" enctype="multipart/form-data">
<div id="fileGroups">
<div class="file-group">
<input type="file" name="myfiles" class="file-input" required />
<label>網站地址:</label>
<input type="url" name="url" class="url-input" placeholder="https://example.com" />
<button type="button" class="btn btn-danger remove-btn">刪除</button>
</div>
</div>
<button type="button" id="addMore" class="btn btn-info">添加更多</button>
<button type="submit" class="btn btn-success">確認提交</button>
</form>
document.addEventListener('DOMContentLoaded', () => {
const form = document.getElementById('uploadForm');
const container = document.getElementById('fileGroups');
const addBtn = document.getElementById('addMore');
let groupCount = 1;
// 添加新組
addBtn.addEventListener('click', () => {
groupCount++;
const group = document.createElement('div');
group.className = 'file-group';
group.innerHTML = `
<input type="file" name="myfiles" class="file-input" required />
<label>網站地址:</label>
<input type="url" name="url" class="url-input" placeholder="https://example.com" />
<button type="button" class="btn btn-danger remove-btn">刪除</button>
`;
container.appendChild(group);
// 綁定刪除事件
group.querySelector('.remove-btn').addEventListener('click', (e) => {
if (container.children.length > 1) {
e.target.closest('.file-group').remove();
} else {
alert('至少保留一組輸入框');
}
});
});
// 表單提交驗證
form.addEventListener('submit', (e) => {
const groups = container.querySelectorAll('.file-group');
let valid = true;
groups.forEach((group, index) => {
const fileInput = group.querySelector('.file-input');
const urlInput = group.querySelector('.url-input');
if (!fileInput.value) {
alert(`第 ${index + 1} 組:請選擇文件!`);
fileInput.focus();
valid = false;
return;
}
if (urlInput.value && !isValidUrl(urlInput.value)) {
alert(`第 ${index + 1} 組:URL 格式不正確!`);
urlInput.focus();
valid = false;
return;
}
});
if (!valid) e.preventDefault();
});
});
// URL 格式驗證(支持常見頂級域名)
function isValidUrl(url) {
const pattern = /^https?:\/\/([\w-]+\.)+[\w-]+(\/[\w-./?%&=]*)?$/i;
return pattern.test(url);
}
後端(Java/Servlet)接收時,`myfiles` 和 `url` 將作為數組接收:
// Java 示例
String[] files = request.getParameterValues("myfiles");
String[] urls = request.getParameterValues("url");
// 配合 multipart 解析器(如 Apache Commons FileUpload)處理文件上傳
動態表單的關鍵在於:結構化的 DOM 操作、完善的前端驗證、與後端數組參數的對應。避免使用過時的 jQuery 字符串拼接方式,採用現代原生 JS 或成熟框架(Vue/React)會讓代碼更易維護、擴展性更強。