Model Driven Apps多行文本框邮箱JS验证报错:new.formOnLoad方法不存在
问题排查与代码修改方案
一、触发错误的核心原因:函数名不匹配
错误提示明确指出找不到new.formOnLoad方法,但你的Web资源中定义的函数是valemail,二者不匹配。解决方式二选一:
- 在Model Driven Apps的表单编辑器事件设置中,把绑定的函数名改成
valemail - 把代码里的函数名从
valemail修改为formOnLoad
二、代码逻辑的关键修正点
1. 未调用核心验证逻辑
你定义了validateEmails.execute方法,但外层函数valemail里没有触发它,导致验证代码根本不会运行。需要在函数末尾添加调用:
validateEmails.execute(executionContext);
2. 转义字符语法错误
代码中的<、"是HTML实体,直接放在JS代码里会引发语法错误,需替换为原生JS语法:
<→<"→"
3. 通知逻辑优化
当前代码每发现一个无效邮箱就覆盖一次通知,建议先清除旧通知,再收集所有错误批量显示:
// 在checkEmails开头添加清除旧通知 formContext.getControl("new_brokeremailaddresses").clearNotification(); // 收集所有无效邮箱 const invalidEmails = []; for (let i = 0; i < emails.length; i++) { var email = emails[i].trim(); // 跳过空字符串(兼容字段末尾带分号的情况) if (!email) continue; if (!emailRegex.test(email)) { invalidEmails.push(email); } } // 批量展示错误 if (invalidEmails.length > 0) { const errorMsg = `Invalid emails: ${invalidEmails.join(', ')}`; console.error(errorMsg); formContext.getControl("new_brokeremailaddresses").setNotification(errorMsg); }
三、修正后的完整代码示例
function valemail(executionContext) { var validateEmails = { Context: null, checkEmails: (emailString) => { var formContext = validateEmails.Context; var emails = emailString.split(';'); // 清除旧通知 formContext.getControl("new_brokeremailaddresses").clearNotification(); // 邮箱验证正则表达式 var emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; const invalidEmails = []; // 逐个验证邮箱地址 for (let i = 0; i < emails.length; i++) { var email = emails[i].trim(); if (!email) continue; if (!emailRegex.test(email)) { invalidEmails.push(email); } } // 显示错误提示 if (invalidEmails.length > 0) { const errorMsg = `Invalid email addresses: ${invalidEmails.join(', ')}`; console.error(errorMsg); formContext.getControl("new_brokeremailaddresses").setNotification(errorMsg); } }, execute: (executionContext) => { var formContext = executionContext.getFormContext(); validateEmails.Context = formContext; const emailAttr = formContext.getAttribute("new_brokeremailaddresses"); if(emailAttr) { var emailString = emailAttr.getValue(); if(emailString != null) { validateEmails.checkEmails(emailString.toString()); } } } } // 触发验证逻辑 validateEmails.execute(executionContext); }
四、额外排查方向
- 确认Web资源
new_ValEmailScript已正确发布,且在表单事件中正确关联 - 检查字段名
new_brokeremailaddresses拼写是否与实体字段完全一致 - 测试时按F12打开浏览器控制台,查看是否存在其他JS语法报错
内容的提问来源于stack exchange,提问作者PinkPanther
相关产品推荐
相关产品推荐

