为了仿真接口的返回数据,组里写了一个自动填充数据页面,每次走到这个页面都须要人工点击返回。页面上有2个form,target都指向_self, 今天写了一个利用js分别提交这2个表单的实现,功能很直接,也没有细想,就提交了代码。在ie和chrome下均可以工做,可是在firefox下,2个表单只提交了一个。利用httpfox抓包一看,提示了一个错误: POST (Aborted) NS_BINDING_ABORTED. 下面简要记录下处理的过程. 前端
window.onload = autoReturn; function autoReturn() { var value = window.confirm("auto return or not?"); if(value==true) { ajaxNotify(); //return form document.return_form.submit(); } } function ajaxNotify() { var xmlhttp; if(window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest(); } else { xmlhttp = new ActiveObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange = function() { if(xmlhttp.readyState==4 && xmlhttp.status==200) { console.log(xmlhttp.responseText); } } //notify form var form = document.notify_form; var inputs = form.getElementsByTagName('input'); var postData = ''; for(var i=0, len=inputs.length; i<len; i++) { if(i!=0) postData += '&'; postData += inputs[i].name + '=' + inputs[i].value; } xmlhttp.open("POST", form.action, true); xmlhttp.send(postData); console.log("postData=" + postData); }上面是最初的代码,因为页面很简单,这里并无用jquery等插件。在Firefox中反复测试了几回,发现利用ajax POST方法提交的表单老是没法提交,一直显示: POST (Aborted) NS_BINDING_ABORTED, httpfox请求包中Content的内容为: Error loading content (NS_ERROR_DOCUMENT_NOT_CACHED)。在网上搜了一番,发现有很多人遇到NS_ERROR_DOCUMENT_NOT_CACHED的错误,大都和fire cache参数的配置有关,具体的能够参考httpfox讨论。但是这个问题和我遇到的并不一致,在@yuanbo同窗的提醒下,用js的encodeURIComponent方法,对数据字段作一次encode,并设置了http 头信息,代码以下:
//notify form var form = document.notify_form; var inputs = form.getElementsByTagName('input'); var postArr = []; for(var i=0, len=inputs.length; i<len; i++) { postArr.push(inputs[i].name + "=" + encodeURIComponent(inputs[i].value)); } xmlhttp.open("POST", form.action, true); xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xmlhttp.send(postArr.join('&')); console.log("postData=" + postArr.join('&'));
但是,问题依然存在。没办法了,只好先注释掉提交页面的代码,仅提交POST部分,居然能够提交。这时候就会发现专业的力量了,@yuanbo指出,是否是firefox提交表单时,把以前的POST取消掉了?这一分析与以前提示的错误信息恰好吻合。按照这个思路对代码做进一步调整: 等post方法返回后再提交,并设置timeout,强行提交页面. jquery
window.onload = autoReturn; function autoReturn() { var value = window.confirm("auto return or not?"); if(value==true) { ajaxNotify(); } } function ajaxNotify() { var xmlhttp; if(window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest(); } else { xmlhttp = new ActiveObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange = function() { document.return_form.submit(); if(xmlhttp.readyState==4 && xmlhttp.status==200) { console.log(xmlhttp.responseText); } } //notify form var form = document.notify_form; var inputs = form.getElementsByTagName('input'); var postArr = []; for(var i=0, len=inputs.length; i<len; i++) { postArr.push(inputs[i].name + "=" + encodeURIComponent(inputs[i].value)); } xmlhttp.open("POST", form.action, true); xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xmlhttp.send(postArr.join('&')); setTimeout(function(){ document.payment_return.submit(); }, 500); console.log("postData=" + postArr.join('&')); }
前端代码与浏览器息息相关,了解浏览器的基本原理能够写出更健壮的代码。 ajax