自2020年7月以来,UfqiLong不断升级完善。在改进过程中,我们遇到了以前从未见过的问题。使用GTAjax在UfqiLog中异步提交BlessedChang的文章内容时,随机提交失败。进一步跟踪发现,当点击提交时,GTAjax接管了表单提交动作,并触发了进度显示和倒计时操作。然而奇怪的是,GTAjax在后台实际上并没有将提交发送到服务器端。于是我们决定开启GTAjax的debug模式,深入分析一下,为什么之前没有这个问题,为什么这个问题是随机出现的,为什么第一次提交失败,第二次操作成功了.?带着这些问题,我们来深入分析一下。开启GTAjax的调试模式比较简单。在运行时参数中:varmyGTAjax=newGTAjax();myGTAjax.set('isdebug',true);这样就可以打开GTAjax的进程数据输出,从而观察整个通信过程。通过分析debuglog,问题很快锁定在了postForm.submit()节点上。即在使用ForceFrame方式进行表单提交时,最终的数据提交依赖于JavaScript的HTMLFormElement.submit()方法。这是W3C、HTMLDOM、JavaScript等标准组织封装的方法,不能进一步反汇编。问题变成为什么submit()提交失败?通过进一步分析,我们发现GTAjax在接管真正的HTMLForm时,通常会通过_DFM_F方法向onsubmit返回false,从而阻止正常提交,然后GTAjax在提交postForm之前进行一系列准备动作。submit()提交。奇怪的是,GoogleChrome、MSEdge等浏览器,即使之前为HTMLForm设置了_DFM_F,调用postForm.submit()时也不会受影响,而当GTAjax通过_RGT方法初始化设置后,会再次调用_DFM_F,然后再次调用postForm.submit(),但它可以通过,并按预期与服务器通信。我们推测可能是最近GoogleChrome和MSEdge浏览器升级,在提交HTMLForms前加入了JavaScript等状态检查,所以如果发现一个Form的onsubmit绑定了returnfalse动作,会自动终止当前操作;否则,照常继续。定位问题并粗略分析原因后,接下来就是解决问题的方法。如果当前执行的HTMLForm设置了onsubmit校验,则需要重写已经设置好的onsubmit,使其覆盖之前的设置,尤其是returnfalse的设置,以便后续的Form提交操作能够顺利进行。改进主要集中在_SUB,一个内部调用的子程序。在执行postForm.submit()之前检查当前postForm的onsubmit。//postForm.submit();//可能因此而失败。\_DFM\_F。10:422020-07-04if(postForm.onsubmit==null){postForm.submit();GTAj.\_DBG(GTAj.vA\['ib'\],'this.\_SUB','同步表单:\['+postForm.name+'\]正在提交。');}else{GTAj.currentPostFormId=postForm.name!=”?postForm.name:postForm.id;postForm.onsubmit=(function(){varmyTimerId=window.setTimeout(function(formId){document.getElementById(GTAj.currentPostFormId).submit();GTAj.\_DBG(GTAj.vA\['ib'\],'this.\_SUB','异步表单:\['+GTAj.currentPostFormId+'\]正在提交。');},10);//-0.01秒returntrue;})();如果没有设置当前执行的postForm的onsubmit,则继续沿用之前的逻辑,直接执行postForm.submit();如果当前执行的postForm的onsubmit已经设置,那么就需要重写onsubmit的绑定赋值操作。经过多次实验,我采用了JavaScript匿名函数的方式,重新赋值了当前postForm的onsubmit。最初,我们为当前的postForm分配一个匿名函数,例如:postForm.onsubmit=function(){returntrue;}在我们实测的过程中,这个匿名函数,在不同的应用场景,不同的浏览器中,匿名函数不执行的地方还是存在一些随机性的。为了安全起见,我们进一步改进了这个匿名函数,不仅定义了匿名函数,而且在后面执行了这个函数,并将返回值赋给了postForm.onsubmit。在匿名函数体之外,我们还通过全局变量GTAj将当前执行的postForm的相关信息带入匿名函数;在匿名函数体中,我们设置了一个会立即执行的新匿名函数,而这第二个嵌入的匿名函数将完成表单的实际提交。执行时机变为:....1)定义一个匿名函数A---2)在匿名函数A中定义另一个异步匿名函数B---3)执行这个匿名函数A---4)返回匿名函数A给postForm.onsubmit赋值为true——5)时间触发匿名函数B的执行——6)实际执行postForm.submit()操作————7)监听服务器返回值的进度。..改进后可以在GoogleChrome和MSEdge中使用MozillaFirefox和多种浏览器的不同应用场景实测达到了预期效果,提交Form不执行的情况不会再出现或出现随机,故障问题已顺利解决。完整的程序源码可以在GTAjax主页(https://ufqi.com/dev/gtajax/)和GitHub(wadelau/GTAjax)找到。这可能是软件更新历史上间隔时间最长的一次更新。GTAjax官网首页记录最后一次更新时间为2011-07,距今已有九年。真是让整个软件作者都觉得时间过得真快。一方面他觉得时间过得太快了,同时也为GTAjax的旺盛生命力感到惊喜,它历经十余年,依然能顽强地为业务系统服务。这不就是《BestasAir》的绝妙案例吗?GTAjax工作在几乎每个工作日都开启的基于gMIS的Jimmys系统中,他总是能够基于GTAjax完成每一个HTTP请求。事实上,自2011年以来,GTAjax也进行了小的升级、改进和错误修复。根据软件源码中的更新标记,至少有以下几次。*GTAjax.js*@abstract:General-TargetedAjax*@author:wadelau@hotmail.com,wadelau@gmail.com*@since:2006-2-1714:04*@code:5.7//a.bc,funcsaddedb+,errsupdatedc+*@NOTICE:DONOTUSETHISCOMMERICALLYWITHOUTAUTHOR'sPAPERAUTHORIZATION*@update:2011年2月1日星期二20:47:03GMT*2011年1月26日星期三17:31:33GMT*08年7月20日星期三:08:09BST2011*2012年3月16日星期五16:36:52CST*2015年2月20日星期五12:15*2016年1月24日星期日12:56:43CST*2018年5月25日星期五08:51:23CST,代码格式优化和cA.sort错误修复*2018年10月31日星期三21:57:26CST,+表单名称验证*2019年8月16日星期五11:06,带有表单验证的imprvs*2020-07-0411:55,错误修复使用forceFrame提交失败。GTAjax成立于2006年2月,至今已有15年历史。对于日新月异的软件和互联网行业来说,这几乎是古董软件。但基于开放的标准和成熟的技术栈,15年过去了,GTAjax依然稳定运行,并应用在各种网页软件中,不能不说是一个相当成功的案例。可以想象和比较的是,在应用层软件中,有多少可以使用15年?别说15年了,基于私有类库和标准开发的软件可能5年、10年后就很难找到了。GTAjax与gMISJimmys等软件一起,能够运行到现在,并继续运行到未来5年、10年,是值得庆祝的事情。软件的生命力或生命周期有多长?它需要多长时间?摩尔定律说,硬件的计算速度每18个月翻一番。软件是否只需要18个月就可以修改、升级、替换,甚至完全推导、重构?事实上,GTAjax存活的时间越长,就越有可能遇到“追不上”的情况。毕竟科技的发展进步日新月异,每3-5年几乎就是翻天覆地的变化。GTAjax能坚持可用、好用、能用15年,应该算是某种“成功”。很多几乎同时期的软件都消失了。也可以想象,如果不使用HTML、CSS、JavaScript等开放标准,而是使用某公司的某项私有技术,情况可能完全无法预料,更谈不上与时俱进,日新月异..从纵向的时间跨度来看,保护和珍惜一款软件,尽可能地延缓它的生命周期,保持它的生命力,唯一的办法就是用开放的技术和标准来构建面向未来的软件。从这方面来说,基于WEB的应用软件已经完全赢得了基于某个公司或平台的“原生应用”。10年前,几乎在WEB软件真正流行的时候,美国苹果公司的Appstore反其道而行之,倒逼自家平台软件(App)构筑强大的软件壁垒,同时引导和吓得无数软件开发者不断为其开发软件(App),少则几个月,多则数十个月。App的快速变化也意味着大量新写的代码如昙花一现。当然,也有少数本地应用在10多年的时间和空间中顽强地频繁更新升级,比如游戏魔兽世界、即时通讯软件腾讯QQ等。这也包括运行网络软件的网络浏览器,如MSIE、MozillaFirefox、GoogleChrome、AppleSafari、Opera等。在人民网工作时,我们实际使用基于WEB的内部办公系统(OA)好几年(5-6年?),我想,为什么不升级和采用新技术呢?即使又过了5-6年(10多年前),这个OA系统还在运行。现在想想,这是一笔巨大的财富,因为软件本身的技术栈是一个开放的标准,并没有很快被业界抛弃,所以企事业单位的投入得到了延伸,继续发挥作用.当然,这并不意味着开放和发展的技术标准停滞不前。相反,开放、开放、开源的技术也在不断完善和升级。但由于影响巨大,各方需要进行多轮磋商,综合考虑各种因素。一个公司的技术进步一定是慢的,当然是理性和评价的。比如在GTAjax的开发计划中,规划了GTAjax-6.x版本,主要考虑以下外部因素:*2015年2月20日星期五12:15*6.xBearsHTML5ECMAScript5,6HTTP/2以及事件驱动、高缓存、高性能和可读性*的代码风格,尤其是HTML5、JavaScript6和HTTP2。这些是业界多年来公开讨论的技术标准。它们正变得越来越成熟,并将在部署新应用程序时加速采用。相信在不久的将来,当GTAjax-6.x准备就绪时,它一定能够充分利用这些新技术特性,在兼容的前提下,继续为互联网社区做出新的贡献,未来15、30和50年。相关GTAjax更新博客包括:1)gMISGMIS更新Workflow工作流、FileMgr文件柜和GTAjax等模块(https://ufqi.com/blog/gmis-workflow-filemgr-gtajax/),2)-gMIS,-GWA2,-GTAjax一起更新(https://ufqi.com/blog/gmis-gwa2-gtajax-update/)。世界仍未太平,新冠肺炎疫情仍在蔓延。愿软件开发者开发出更多生命周期更长的软件,为世界和平贡献智慧和力量。不要让软件成为快销品,而要让软件成为耐用品、艺术品。https://ufqi.com/blog/gtajax-updt-form-submit-202007-R/M2SR
