在 Domino 中的 web 上提交()后字段未保存

Posted

技术标签:

【中文标题】在 Domino 中的 web 上提交()后字段未保存【英文标题】:Field does not get saved after submit() on web in Domino 【发布时间】:2018-10-17 19:33:20 【问题描述】:

这与我几天前发布的一个问题有关。那里的答案使我发现了这个问题。

我在提交按钮中有以下代码

if (validateFields(document.forms[0])==true)
    if (validateAdditionalFields(document.forms[0])==true)         
        document.getElementById("Status").value = "Submitted for RFP";      
        getRespParty('ResponsibleParty');                   
        document.forms[0].submit();
    

我在JSHeader的getRespParty函数中有如下代码

function getRespParty(x) 
var noEmployees = document.getElementById('NoEmployees').value;
var stateName = document.getElementById('State').value  
var url = 'http://' + window.location.host + 
'/ebsprospects.nsf/(GetResponsiblePerson)?OpenAgent&NoEmployees=' + 
 noEmployees + '&State=' + stateName;     
var xhttp = new XMLHttpRequest();
xhttp.open("GET", url);
xhttp.onreadystatechange = function() 
    if (this.readyState == 4 && this.status == 200)     
        document.getElementById(x).value = xhttp.responseText;  
    
;
xhttp.send();

(GetResponsiblePerson) 代理以这段代码结束(我正在执行一系列 dbLookups 以返回一个特定的人,这就是它必须在 LS 中的原因)

Dim nam As NotesName
Set nam = session.Createname(respParty)
Print "Content-type:text/plain"    
Print nam.Abbreviated

ResponsibleParty 字段是文本,可见,可编辑,html 选项卡上的 ID 字段是 ResponsibleParty。当代码返回时,该字段显示我希望看到的名称。但是,它似乎并没有真正保存它,因为客户端文档在匹配的责任方字段中不包含任何内容。 WQS 中没有代码。客户端中的责任方字段是隐藏和可编辑的,状态字段也是如此,它确实被保存了,所以至少我知道保存正在工作?

为什么代理返回的字段值不保存?逻辑类型甚至可行还是我需要以不同的方式来做?

【问题讨论】:

嗨,这可能是时间问题。您的 xmlhttp 可能是异步的。提交页面后,该字段将更新。一种解决方案是在 readystatechange 函数中提交表单... 难以置信!这就是答案。非常感谢。 【参考方案1】:

正如@umeli 所说,这是一个时间问题。您正在调用 getRespParty(),但只要调用 XMLHttpRequest,代码就会继续,退出函数并在 Ajax 调用完成之前执行提交。

恕我直言,一个更优雅的解决方案是使用来自 getRespParty() 的回调,并在那里调用提交:

document.getElementById("Status").value = "Submitted for RFP";      
getRespParty('ResponsibleParty', function()  document.forms[0].submit() ); 

然后你修改getRespParty():

function getRespParty(x, callback) 
    var noEmployees = document.getElementById('NoEmployees').value;
    var stateName = document.getElementById('State').value  
    var url = 'http://' + window.location.host + 
    '/ebsprospects.nsf/(GetResponsiblePerson)?OpenAgent&NoEmployees=' + 
    noEmployees + '&State=' + stateName;     
    var xhttp = new XMLHttpRequest();
    xhttp.open("GET", url);
    xhttp.onreadystatechange = function() 
        if (this.readyState == 4 && this.status == 200)     
            document.getElementById(x).value = xhttp.responseText; 
            if (callback != null && typeof callback === "function") 
                callback();
            
        
    ;
    xhttp.send();

为了进一步改进,您可以使用不同的参数调用回调函数,具体取决于 XMLHttpRequest 是否成功:

if (this.readyState == 4) 
    if(this.status == 200)     
        document.getElementById(x).value = xhttp.responseText; 
        if (callback != null && typeof callback === "function") 
            callback(true);
        
     else 
        if (callback != null && typeof callback === "function") 
            callback(true, this.status);
        
    

现在您可以读取该值并在主回调函数中执行不同的操作:

document.getElementById("Status").value = "Submitted for RFP";      
getRespParty('ResponsibleParty', function(success, statusCode)  
    if (success) 
        document.forms[0].submit();
     else 
        alert("Ajax call failed with status "+statusCode);
    
);

任何时候你执行异步调用,如果你打算在调用函数之后执行操作,你应该使用回调。

【讨论】:

以上是关于在 Domino 中的 web 上提交()后字段未保存的主要内容,如果未能解决你的问题,请参考以下文章

在注册表单上,表单字段未保存在浏览器自动填写提交时。(ReactJs)

提交联系表 7 后如何防止在未输入必填字段的情况下重定向到某个 URL

Domino、CORS 和 OPTIONS 请求

按“提交”按钮后“此页面无法正常工作 10.110.15.17 未发送任何数据”

Django:未提交表单中的只读字段

使用 React Native 提交数据后重置表单中的字段