Dynamics 365统一界面手机号格式化JS更新后失效,仅自定义界面可用求修复
修复Dynamics 365统一界面中手机号格式化JavaScript失效问题
我之前在Dynamics 365统一界面更新后也碰到过类似的脚本失效问题,大概率是新版本对表单脚本的执行逻辑、事件上下文或者字段交互做了调整。咱们一步步来排查修复:
1. 检查字段事件的上下文传递设置
首先去统一界面的表单编辑器里,找到mobilephone字段的OnChange事件注册,确保**“传递执行上下文”**这个选项是勾选状态。新版更新后有时候这个设置会被重置,导致executionContext无法正确获取formContext,脚本直接静默失败,这是最常见的原因。
2. 调整字段赋值与保存逻辑
你的脚本里在设置完格式化后调用了formContext.data.entity.save(),在新版统一界面中,这种强制自动保存很容易触发字段验证冲突或者打断界面的原生交互流程。建议:
- 移除强制保存的代码,让表单的自然保存机制处理
- 设置值后触发字段的OnChange事件,确保界面实时刷新显示格式化后的内容
修改这部分代码:
// 替换原来的保存代码 formContext.getAttribute("mobilephone").setValue(formatPhone); formContext.getAttribute("mobilephone").fireOnChange(); // 移除这行:formContext.data.entity.save();
3. 优化数字提取的正则表达式
原来的replace(/\D/g, '')在处理某些Unicode特殊字符时可能会有遗漏,改成更健壮的正则来提取所有数字:
var phoneNumbers = mobilePhone.replace(/[^\d]/g, '');
4. 修复表单加载通知的未定义变量
你的formOnLoad函数里用了message和myUniqueId两个变量,但没有定义,新版统一界面会因为这个报错,进而影响后续脚本执行。补上这两个变量的定义:
var message = "表单已加载,手机号格式化功能已启用"; var myUniqueId = "phoneFormatNotification";
5. 添加调试日志定位问题
在脚本里加入console.log,方便你用浏览器开发者工具的Console标签查看脚本执行细节,比如是否正确获取了手机号、进入了哪个格式化分支:
console.log("原始手机号值:", mobilePhone); console.log("提取后的纯数字:", phoneNumbers);
修改后的完整代码
var XXX = window.XXX || {}; (function() { // 在表单OnLoad事件中运行的代码 this.formOnLoad = function(executionContext) { var formContext = executionContext.getFormContext(); // 定义通知内容和唯一ID var message = "表单已加载,手机号格式化功能已启用"; var myUniqueId = "phoneFormatNotification"; // 显示表单级通知,类型为INFO formContext.ui.setFormNotification(message, "INFO", myUniqueId); // 等待5秒后清除通知 window.setTimeout(function() { formContext.ui.clearFormNotification(myUniqueId); }, 5000); } // 在字段OnChange事件中运行的代码 this.mobilePhoneFormatting = function(executionContext) { var formContext = executionContext.getFormContext(); var mobilePhone = formContext.getAttribute("mobilephone").getValue(); var formatPhone = ""; try { if (mobilePhone != null) { // 更健壮的数字提取正则 var phoneNumbers = mobilePhone.replace(/[^\d]/g, ''); console.log("原始手机号:", mobilePhone); console.log("提取后的纯数字:", phoneNumbers); if (phoneNumbers.length == 10) { formatPhone = ("+1 (" + phoneNumbers.substring(0, 3) + ") " + phoneNumbers.substring(3, 6) + "-" + phoneNumbers.substring(6, 10)); } else if (phoneNumbers.length == 11) { formatPhone = ("+" + phoneNumbers.substring(0, 1) + " (" + phoneNumbers.substring(1, 4) + ") " + phoneNumbers.substring(4, 7) + "-" + phoneNumbers.substring(7, 11)); } else if (phoneNumbers.length == 14) { formatPhone = ("+1 (" + phoneNumbers.substring(0, 3) + ") " + phoneNumbers.substring(3, 6) + "-" + phoneNumbers.substring(6, 10) + " x" + phoneNumbers.substring(10, 14)); } else if (phoneNumbers.length == 15) { formatPhone = ("+" + phoneNumbers.substring(0, 1) + " (" + phoneNumbers.substring(1, 4) + ") " + phoneNumbers.substring(4, 7) + "-" + phoneNumbers.substring(7, 11) + " x" + phoneNumbers.substring(11, 15)); } else if (phoneNumbers.length == 4) { formatPhone = ("x" + phoneNumbers.substring(0, 4)); } else { formatPhone = mobilePhone; } formContext.getAttribute("mobilephone").setValue(formatPhone); // 触发字段刷新,确保界面显示正确 formContext.getAttribute("mobilephone").fireOnChange(); // 移除强制保存,避免冲突 // formContext.data.entity.save(); } } catch (err) { txt = "手机号格式化时发生错误。\n\n"; txt += "错误描述: " + err.message + "\n\n"; txt += "点击确定继续。\n\n"; console.error("手机号格式化错误详情:", err); alert(txt); } } })();
按照上面的步骤调整后,应该就能在统一界面恢复手机号格式化功能了。
内容的提问来源于stack exchange,提问作者Chandini Ramesh
相关产品推荐
相关产品推荐

