`
spring0303
  • 浏览: 26799 次
  • 来自: ...
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

用XMLHttpRequest模拟form提交

阅读更多

在使用XMLHttpRequest发送请求的时候,send()方法的调用是最后的一个重要步骤,对于GET请求,和POST请求,send()方法的使用是有差异的。

这个差异体现在send()方法中的参数。如果请求没有主体(比如GET请求一定是没有请求主体的),那么一定要使用send(null);的形式发送请求。

如果是POST请求,我们就需要把请求主体的字符串表示作为send()方法的参数!

一个例子如下,其中需要关注的焦点就是,生成“请求主体字符串”的Javascript通用方法:

js 代码

 

  1. function getRequestBody(oForm) { // 参数oForm是对某个form对象的引用    
  2. var aParams = new Array(); // 用来存储“名-值”对的数组    
  3. for (var i = 0; i < oForm.elements.length; i++) {    
  4. var sParam = encodeURIComponent(oForm.elements[i].name);    
  5. // “名-值”对必须转换成URL编码格式,否则极有可能丢失数据,所    
  6. //以调用了javascript内建的encodeURIComponent函数    
  7. sParam += "=";    
  8. sParam += encodeURIComponent(oForm.elements[i].value);    
  9. aParams.push(sParam);    
  10. }    
  11. return aParams.join("&");    
  12. }   
  13.   

上面数组的应用,主要是为了避免生硬的多字符串连接,这对目前大多数浏览器来说都是一个代价比较高的操作哦。 是不是对客户端太好了?也许你会说,现在的客户端都是G单位的运算频率和内存容量,没必要闲置它们的计算能力呀,但问题不仅仅是这一方面,数组的 push() , join() 方法在这里的使用非常棒。

下面是发送POST请求的函数:

js 代码

 

  1. function sendRequest() {    
  2. var oForm = doucment.forms[0];    
  3. var sBody = getRequestBody(oForm); // 根据form元素中的子元素构造请求主体字符串    
  4. var oXMLHttp = zXMLHttp.createRequest(); // 取得 XMLHttp 对象    
  5.   
  6. oXMLHttp.open("post",oForm.action,true);    
  7. // 注意下面利用XMLHttp对象对请求头Content-Type的设置    
  8. oXMLHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");    
  9. oXMLHttp.onreadystatechange = function() {    
  10. if (oXMLHttp.readyState == 4) {    
  11. if (oXMLHttp.status == 200) {    
  12. saveResult(oXMLHttp.responseText);    
  13. }else {    
  14. saveResult("An error occurred: " + oXMLHttp.statusText);    
  15. }    
  16. }    
  17. }    
  18. oXMLHttp.send(sBody);    
  19. }    

上面的函数有个要注意的地方,就是对请求头的设置!当表单从浏览器传送到服务器时,浏览器将会把请求的内容类型设置为“application/x-www-form-urlencoded”,大多数服务器都需要这种编码格式,才能按照它对接收到的POST数据进行正确的解析。因此通过XMLHttpRequest对象进行这样的一步设置是很重要的,结合最后一步 send() 方法发送请求主体,sendRequest() 函数就有效地模拟了浏览器的提交操作,服务器端程序也就能按预期正确地工作了。

注意,这里是为了模拟浏览器提交。如果是通过请求主体发送一个简单字符串,可以这样:
oXMLHttp.setRequestHeader("Content-Type","text/plain");
如果是要发送XML字符串,就应该:
oXMLHttp.setRequestHeader("Content-Type","text/xml");

zXMLHttp是一个js库文件,里面的createRequest()方法是这样实现的:

js 代码
  1. function createXMLHttp(){   
  2.     if (typeof XMLHttpRequest != "undefined"){   
  3.         return new XMLHttpRequest();   
  4.     }else if (window.ActiveXObject) {   
  5.         var aVersions = ["MSXML2.XMLHttp.5.0","MSXML2.XMLHttp.4.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp","Microsoft.XMLHttp"];   
  6.         for (var i=0;i<aVersions.length;i++){   
  7.             try{   
  8.                 var oXMLHttp = new ActiveXObject(aVersions[i]);   
  9.                 return oXMLHttp;   
  10.             }catch(oError){   
  11.                 //do nothing           
  12.             }   
  13.         }   
  14.     }   
  15. }  

 

注意: 有些浏览器对typeof()运算符,可能返回 null,而不是“undefined”

分享到:
评论

相关推荐

    form表单的异步回调方法

    5. **伪Ajax(Pseudo-AJAX)**:尽管这种异步提交方式不是真正的Ajax(因为没有使用XMLHttpRequest),但它实现了类似的效果,即用户提交表单后,页面不会刷新,而是等待后台的响应。在等待期间,可以显示加载动画或...

    php+js模拟表单通过XMLHttpRequest实现进度条上传视频

    在本文中,我们将深入探讨如何使用PHP和JavaScript(特别是jQuery)通过XMLHttpRequest对象来实现视频文件的模拟表单上传,并且在上传过程中显示进度条,以及上传完成后自动加载和播放视频的功能。 首先,我们需要...

    在java中\"模拟\" XMLHttpRequest

    在Java编程中,"模拟"XMLHttpRequest主要是指创建一个与JavaScript中的XMLHttpRequest对象类似的功能,以便在服务器端进行异步数据通信。XMLHttpRequest是Web开发中的一个重要组成部分,它允许JavaScript在不刷新...

    基于form-data请求格式详解

    JavaScript中,XMLHttpRequest Level 2引入了FormData接口,允许开发者使用JavaScript来构建键值对的集合,并模拟表单提交。使用FormData对象,开发者可以更方便地组织文件和文本数据进行上传。例如,使用fetch API...

    Vue form 表单提交+ajax异步请求+分页效果

    在上面的代码中,我们可以看到使用 `XMLHttpRequest` 或 `fetch` API 实现Ajax异步请求的示例代码。 三、分页效果 分页效果是指在Web应用程序中实现分页功能的技术。通过使用分页效果,我们可以将大量数据分页显示...

    表单提交原理

    在表单提交中,可以通过JavaScript(通常使用jQuery或原生XMLHttpRequest对象)实现异步提交,提升用户体验。 - **AJAX工作流程** - 创建XMLHttpRequest对象。 - 打开连接,设置HTTP方法(GET或POST)、URL和...

    html页面模式get/post请求

    对于POST请求,特别是当数据需要以JSON格式发送时,我们需要借助JavaScript,通常使用AJAX(Asynchronous JavaScript and XML)技术,通过XMLHttpRequest或Fetch API来实现。JSON是一种轻量级的数据交换格式,它的...

    js使用formData实现批量上传

    利用FormData对象,我们可以通过JavaScript用一些键值对来模拟一系列表单控件,我们还可以使用XMLHttpRequest的send()方法来异步的提交这个”表单”.比起普通的ajax,使用FormData的最大优点就是我们可以异步上传一个二...

    模拟Http请求上传文件

    1. **Multipart/form-data**:在上传文件时,我们通常使用`Content-Type: multipart/form-data`,这是HTTP协议中用于表单提交的一种特殊格式,可以同时发送文本和二进制数据,如文件。每个部分之间用分隔符`boundary...

    文件上传的两种情况及mock时对应处理办法

    对于纯前端的测试,可以使用`File`和`Blob`对象创建虚拟文件,然后模拟`XMLHttpRequest`或`fetch`的send方法,触发上传事件。例如,可以使用` FileReader`读取文件内容并构造`FormData`,然后模拟发送请求。 4. **...

    VB在线互联模拟考试系统 毕业设计

    VB的窗体(Form)和控件(Control)可以用于构建这些界面,例如TextBox用于输入答案,ComboBox用于选择选项,Button用于触发事件如提交答案等。客户端与服务器之间的通信通常通过HTTP或HTTPS协议实现,如使用...

    html5表单提交按钮圆形进度条加载动画.zip

    当用户点击提交按钮时,我们可以阻止默认的表单提交行为,通过`event.preventDefault()`,然后异步发送表单数据到服务器,这通常使用`XMLHttpRequest`对象或者更现代的`fetch` API实现。在数据发送过程中,我们可以...

    京东登录模拟

    在创建登录页面时,HTML5的`&lt;form&gt;`元素用于定义表单,`&lt;input&gt;`元素则用来创建各种类型的输入字段,如文本框(type="text")用于用户名和密码输入,`&lt;button&gt;`用于提交按钮。同时,HTML5引入了新的表单属性,比如`...

    脚本自动化之模拟点击和表单填写

    在这个主题“脚本自动化之模拟点击和表单填写”中,我们将深入探讨如何使用脚本实现一个自动化登录网页的功能。这个过程通常涉及到浏览器扩展、JavaScript、网络请求和数据处理等多个方面。 一、浏览器扩展开发 要...

    JS使用post提交的两种方式

    以下是如何使用XMLHttpRequest对象进行POST提交: 1. **创建XMLHttpRequest对象**: ```javascript var xmlobj; function CreateXMLHttpRequest() { if (window.ActiveXObject) { try { xmlobj = new ...

    生成动态表单

    在给定的标题和描述中,我们可以看到这个话题关注的是如何实现动态表单的生成,同时考虑了form提交和ajax异步更新内容的兼容性,以及模拟alert和confirm对话框的交互体验。 一、动态表单生成 动态表单生成的核心...

    Javascript异步表单提交,图片上传,兼容异步模拟ajax技术

    本文将探讨如何使用JavaScript实现异步表单提交,以及如何在其中加入图片上传功能,同时兼容早期浏览器的异步模拟AJAX技术。 ### 前言 异步表单提交和图片上传的核心在于通过JavaScript动态创建和操作DOM元素,...

    JSP_模拟AJAX实现无刷新文件上传

    它通过XMLHttpRequest对象发送HTTP请求,并在后台接收响应,然后使用JavaScript处理返回的数据,动态更新DOM元素。但在涉及文件操作时,由于安全原因,浏览器不允许JavaScript直接访问用户硬盘上的文件。 此时,...

    兼容多个浏览器的单文件上传

    然而,对于不支持File API的老版IE浏览器,我们需要使用传统的方式——form表单的提交来模拟异步上传。 1. **隐藏式form表单**:在页面中创建一个隐藏的form表单,设置其`enctype`为`multipart/form-data`,以支持...

    js以post方式打开新页面

    另外,对于现代Web应用,如果使用了AJAX(XMLHttpRequest或Fetch API),可以考虑使用`fetch` API的`POST`请求配合`window.location.replace`或`window.location.assign`来模拟打开新页面,但这种方法实际上并没有...

Global site tag (gtag.js) - Google Analytics