Pencil Project表单验证库:自定义规则与错误处理
在使用Pencil Project进行GUI原型设计时,表单验证是确保用户输入数据合法性的关键环节。本文将详细介绍如何利用Pencil Project内置的表单验证机制,创建自定义验证规则并实现优雅的错误处理,帮助开发者构建更健壮的交互原型。
表单验证基础架构
Pencil Project的表单验证系统分散在多个核心文件中,主要通过JavaScript实现验证逻辑和错误提示。核心验证模块包括:
- 导出向导验证:app/archive/exportWizard.js实现了导出流程中的页面选择、目标路径等关键信息验证
- 私有集合对话框:app/archive/privateCollectionDialog.js提供了集合名称等必填项的验证逻辑
- 页面详情对话框:app/archive/pageDetailDialog.js包含页面属性输入的验证与错误提示
这些模块共同构成了Pencil Project的表单验证基础,采用了"即时验证+提交验证"的双重验证策略,确保用户输入的有效性。
内置验证规则解析
Pencil Project提供了多种常用的内置验证规则,可直接应用于不同类型的表单字段:
必填项验证
最基础也最常用的验证规则,确保关键信息不为空。在app/archive/privateCollectionDialog.js中实现:
PrivateCollectionDialog.validatePage = function () {
if (PrivateCollectionDialog.collectionName.value == null || PrivateCollectionDialog.collectionName.value.length == 0) {
Util.error(Util.getMessage("error.title"), Util.getMessage("please.enter.collection.name"), Util.getMessage("button.close.label"));
PrivateCollectionDialog.collectionName.focus();
return false;
}
return true;
};
这段代码检查集合名称是否为空,如果为空则调用Util.error显示错误信息,并将焦点返回给输入框,引导用户修正。
选择项验证
在导出功能中,需要确保用户至少选择一个页面进行导出。app/archive/exportWizard.js中的实现如下:
ExportWizard.validatePageSelection = function () {
if (ExportWizard.pageSelectionGroup.value != "only") return true;
var selected = 0;
Dom.workOn("./xul:listitem", ExportWizard.pageList, function (item) {
if (item.checked) selected ++;
});
if (selected == 0) {
Util.error(Util.getMessage("error.title"), Util.getMessage("please.select.at.least.one.page.to.export"), Util.getMessage("button.close.label"));
return false;
}
return true;
};
此验证逻辑遍历所有页面选项,统计选中数量,如果未选中任何页面则显示错误提示。
路径验证
导出功能还需要验证目标路径的有效性,确保指定路径存在:
ExportWizard.validateOptions = function () {
var exporter = ExportWizard.getSelectedExporter();
if (exporter.getOutputType() != BaseExporter.OUTPUT_TYPE_NONE) {
if (!ExportWizard.targetFilePathText.value) {
Util.error(Util.getMessage("error.title"), Util.getMessage("please.select.the.target.directory"), Util.getMessage("button.close.label"));
ExportWizard.targetFilePathText.focus();
return false;
}
var file = Components.classes["@mozilla.org/file/local;1"]
.createInstance(Components.interfaces.nsILocalFile);
file.initWithPath(ExportWizard.targetFilePathText.value);
if (!file.parent.exists()) {
Util.error(Util.getMessage("error.title"), Util.getMessage("the.specified.path.does.not.exists"), Util.getMessage("button.close.label"));
ExportWizard.targetFilePathText.focus();
return false;
}
}
return true;
};
这段代码不仅检查路径是否为空,还通过nsILocalFile接口验证路径是否真实存在,提供了更严格的输入验证。
自定义验证规则开发
虽然Pencil Project提供了基础验证功能,但在实际项目中往往需要根据特定业务需求创建自定义验证规则。以下是创建自定义验证规则的步骤:
1. 创建验证函数
首先,在相关的对话框或表单处理文件中创建验证函数。例如,为一个电子邮件字段添加格式验证:
function validateEmailField(emailField) {
var email = emailField.value;
if (email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
Util.error("验证错误", "请输入有效的电子邮件地址", "关闭");
emailField.focus();
return false;
}
return true;
}
2. 集成到验证流程
将自定义验证函数集成到表单的提交验证流程中:
CustomFormDialog.validatePage = function () {
// 先执行内置验证
if (!PrivateCollectionDialog.validatePage()) {
return false;
}
// 执行自定义电子邮件验证
if (!validateEmailField(document.getElementById("contactEmail"))) {
return false;
}
return true;
};
3. 添加错误提示本地化
为了支持多语言,应将错误消息添加到本地化文件中,而不是硬编码:
// 在对应语言的属性文件中添加
error.invalid.email=请输入有效的电子邮件地址
// 在验证函数中使用
Util.error(Util.getMessage("error.title"), Util.getMessage("error.invalid.email"), Util.getMessage("button.close.label"));
错误处理机制详解
Pencil Project采用统一的错误处理机制,通过Util.error函数显示一致的错误提示。这个机制在app/archive/messageDialog.js中实现:
45: } else if (message.type == "error") {
46: icon.className = "error-icon";
47: icon.className = "error-icon";
错误处理流程主要包含以下几个关键环节:
错误提示UI组件
错误提示使用模态对话框实现,包含错误图标、标题和消息内容,确保用户无法忽略验证错误。错误图标通过CSS类"error-icon"定义样式,位于app/css/pencil.css中。
错误消息本地化
所有错误消息都通过Util.getMessage函数获取,支持多语言显示:
Util.error(Util.getMessage("error.title"), Util.getMessage("please.enter.collection.name"), Util.getMessage("button.close.label"));
这种方式使得错误消息可以根据用户的语言设置自动切换,提升国际化体验。
焦点管理
验证失败后,系统会自动将焦点返回到需要修正的输入控件:
PrivateCollectionDialog.collectionName.focus();
这一细节大大提升了用户体验,用户无需手动寻找错误字段。
高级应用:动态验证与实时反馈
对于更复杂的表单,可以实现动态验证,在用户输入过程中提供实时反馈,而不是等到提交时才验证。实现这一功能的步骤如下:
添加输入事件监听器
// 在setup函数中为输入框添加事件监听器
CustomFormDialog.setup = function () {
// ... 其他初始化代码 ...
var emailField = document.getElementById("contactEmail");
emailField.addEventListener("input", function() {
validateEmailOnType(emailField);
});
};
实现实时验证函数
function validateEmailOnType(emailField) {
var email = emailField.value;
var errorElement = document.getElementById("emailError");
if (email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
errorElement.textContent = Util.getMessage("error.invalid.email");
errorElement.style.display = "block";
emailField.classList.add("invalid");
} else {
errorElement.style.display = "none";
emailField.classList.remove("invalid");
}
}
添加验证样式
在app/css/form.less中添加验证相关样式:
.invalid {
border: 1px solid #ff4444;
background-color: #fff5f5;
}
.error-message {
color: #ff4444;
font-size: 0.9em;
margin-top: 4px;
display: none;
}
最佳实践与常见问题
验证性能优化
对于包含大量字段或复杂验证逻辑的表单,应注意验证性能:
- 延迟验证:使用
setTimeout延迟执行验证,避免每次输入都触发验证 - 验证缓存:缓存已通过的验证结果,避免重复验证
- 分段验证:只验证当前活动的表单部分
常见验证陷阱
- 过度验证:避免对用户输入进行不必要的限制,如过度严格的密码规则
- 错误消息不明确:确保错误消息清晰说明问题和解决方法
- 忽略辅助技术:错误提示应能被屏幕阅读器等辅助技术识别
可访问性考虑
为确保所有用户都能理解验证错误,应:
- 使用ARIA属性标记错误字段:
aria-invalid="true" - 提供错误摘要,并链接到每个错误字段
- 确保错误消息具有足够的颜色对比度
总结与扩展
Pencil Project提供了灵活而强大的表单验证基础架构,通过内置的验证规则和错误处理机制,可以满足大多数原型设计中的表单验证需求。开发者可以通过创建自定义验证规则扩展这些功能,实现特定业务逻辑的验证。
未来扩展方向包括:
- 创建验证规则库:将常用验证规则封装为可复用的函数库
- 实现异步验证:支持AJAX验证,如用户名唯一性检查
- 可视化验证规则编辑器:通过GUI界面配置验证规则,无需编写代码
通过掌握这些验证技术,开发者可以构建更加健壮和用户友好的交互原型,提升整体用户体验。建议参考app/archive/exportWizard.js和app/archive/privateCollectionDialog.js中的实现,进一步了解Pencil Project表单验证的最佳实践。
要深入学习Pencil Project的表单验证机制,建议从以下文件开始研究:
- app/archive/exportWizard.js - 完整的多步骤表单验证实现
- app/archive/privateCollectionDialog.js - 基础表单验证示例
- app/archive/messageDialog.js - 错误提示UI组件
- app/css/form.less - 表单样式与验证反馈样式
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



