25 / 06 / 26

NetSuite Date 类型字段失焦

场景描述

在 NetSuite 中不论是标准记录还是自定义记录,亦或是Suitelet创建的表单界面,Date 类型字段会存在以下问题:

在 Client Script 的 validateField(scriptContext)函数中验证 Date 类型字段,光标聚焦在Date类型字段后无法失焦,导致无法填写其他字段。

场景举例:

  1. 校验 Date 字段是否早于/晚于某个日期值

  2. 使用confirm校验是否确认修 Date 字段

解决方案

核心:重写 Date 类型字段的事件监听器

  1. 创建一个 Custom Module 文件 (文件名:form_util.js),用于存放封装的重写函

    function overrideDateInputListener(form, dateFieldId) { var funcName = "overrideDateInputListener"; var funcSnippet = 'var dateInput = document.querySelector("#' + dateFieldId + '");' + 'var dateInputCacheValue = "' + dateFieldId + '_cache_value";' + "window[dateInputCacheValue] = dateInput.value;" + "dateInput.onblur = null;" + "dateInput.onchange = function () {" + "setWindowChanged(window, true);" + "this.checkvalid = false;" + "this.isvalid =" + 'validate_field(this, "date", true, false, null, null, false, null, 8) &&' + '((this.shouldDoAlertInAdditionalValidation = true), nlapiValidateField(null, "' + dateFieldId + '"));' + "if (this.isvalid) {" + "window[dateInputCacheValue] = dateInput.value;" + 'nlapiFieldChanged(null, "' + dateFieldId + '");' + "} else {" + "dateInput.value = window[dateInputCacheValue];" + "selectAndFocusField(this);" + "}" + "return this.isvalid;" + "};"; injectScript(form, "custpage_dateinput_snippet" + Date.now(), funcName, funcSnippet); } function injectScript(form, fieldId, funcName, funcSnippet) { form.addField({ type: "INLINEHTML", id: fieldId, label: fieldId, }).defaultValue = '<script type="text/javascript">' + funcSnippet + 'if(document.readyState=="loading") {document.addEventListener("DOMContentLoaded", ' + funcName + ");} else{" + funcName + "();}</script>"; }
  2. 在User Event Script的 beforeLoad(scriptContext) 函数中调用overrideDateInputListener() 函数

/** * @NApiVersion 2.1 * @NScriptType UserEventScript */ define(["./form_util"], (cuxFormUtil) => { function beforeLoad(scriptContext) { if (scriptContext.type === "create" || scriptContext.type === "edit") { cuxFormUtil.overrideDateInputListener(scriptContext.form, "custrecord_sci_inv_date"); } } return { beforeLoad }; });
Powered by Gridea