XMLHttpRequest

 

<script language="javascript" type="text/javascript">


<!--
var xmlhttp;

// 创建一个XMLHTTPRequest对象
function createXMLHTTPRequext(){
 if(window.ActiveXObject) {
    xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
    }
    else if(window.XMLHTTPRequest){
       xmlhttp = new XMLHTTPRequest();
    }
}

 

function PostOrder(xmldoc)
{
    createXMLHTTPRequext();
   
 // 方法:open
    // 创建一个新的http请求,并指定此请求的方法、URL以及验证信息
    // 语法:oXMLHttpRequest.open(bstrMethod, bstrUrl, varAsync, bstrUser, bstrPassword);
    // 参数
    //  1> bstrMethod
    //        http方法,例如:POST、GET、PUT及PROPFIND。大小写不敏感。
 
    //   2> bstrUrl
    //    请求的URL地址,可以为绝对地址也可以为相对地址。
    //    
 //  3> varAsync[可选]
    //    布尔型,指定此请求是否为异步方式,默认为true。如果为真,
 //   当状态改变时会调用onreadystatechange属性指定的回调函数。
 
    //   4> bstrUser[可选]
    //    如果服务器需要验证,此处指定用户名,如果未指定,当服务器需要验证时,会弹出验证窗口。
    //
 //  5> bstrPassword[可选]
    //    验证信息中的密码部分,如果用户名为空,则此值将被忽略。
    
    // 备注:调用此方法后,可以调用send方法向服务器发送数据。
    xmlhttp.Open("get", "http://localhost/example.htm", false);
    // var book = xmlhttp.responseXML.selectSingleNode("//book[@id='bk101']");
    // alert(book.xml);

   
    // 属性:onreadystatechange
    // onreadystatechange:指定当readyState属性改变时的事件处理句柄
    // 语法:oXMLHttpRequest.onreadystatechange = funcMyHandler;
    // 如下的例子演示当XMLHTTPRequest对象的readyState属性改变时调用HandleStateChange函数,
    // 当数据接收完毕后(readystate == 4)此页面上的一个按钮将被激活
    // 备注:此属性只写,为W3C文档对象模型的扩展.
    xmlhttp.onreadystatechange = HandleStateChange;
   
    // 方法:send
    // 发送请求到http服务器并接收回应
    // 语法:oXMLHttpRequest.send(varBody);
    // 参数:varBody (欲通过此请求发送的数据。)
    // 备注:此方法的同步或异步方式取决于open方法中的bAsync参数,如果bAsync == False,此方法将会等待请求完成或者超时时才会返回,如果bAsync == True,此方法将立即返回。
    // This method takes one optional parameter, which is the requestBody to use. The acceptable VARIANT input types are BSTR, SAFEARRAY of UI1 (unsigned bytes), IDispatch to an XML Document Object Model (DOM) object, and IStream *. You can use only chunked encoding (for sending) when sending IStream * input types. The component automatically sets the Content-Length header for all but IStream * input types.
    // 如果发送的数据为BSTR,则回应被编码为utf-8, 必须在适当位置设置一个包含charset的文档类型头。
    // If the input type is a SAFEARRAY of UI1, the response is sent as is without additional encoding. The caller must set a Content-Type header with the appropriate content type.
    // 如果发送的数据为XML DOM object,则回应将被编码为在xml文档中声明的编码,如果在xml文档中没有声明编码,则使用默认的UTF-8。
    // If the input type is an IStream *, the response is sent as is without additional encoding. The caller must set a Content-Type header with the appropriate content type.
    xmlhttp.Send(xmldoc);
   
    // 方法:getAllResponseHeaders
    // 获取响应的所有http头
    // 语法:strValue = oXMLHttpRequest.getAllResponseHeaders();
    // 备注:每个http头名称和值用冒号分割,并以\r\n结束。当send方法完成后才可调用该方法。
    alert(xmlhttp.getAllResponseHeaders());
 
 
    // 方法:getResponseHeader
    // 从响应信息中获取指定的http头
    // 语法:strValue = oXMLHttpRequest.getResponseHeader(bstrHeader);
    // 备注:当send方法成功后才可调用该方法。如果服务器返回的文档类型为"text/xml", 则这句话
    // xmlhttp.getResponseHeader("Content-Type");将返回字符串"text/xml"。可以使用getAllResponseHeaders方法获取完整的http头信息。
 // 输出http头中的Content-Type列:当前web服务器的版本及名称。
    alert(xmlhttp.getResponseHeader("Content-Type"));
   
   
    document.frmTest.myButton.disabled = true;
    // 方法:abort
    // 取消当前请求
    // 语法:oXMLHttpRequest.abort();
    // 备注:调用此方法后,当前请求返回UNINITIALIZED 状态。
    // xmlhttp.abort();
   
    // 方法:setRequestHeader
    // 单独指定请求的某个http头
    // 语法:oXMLHttpRequest.setRequestHeader(bstrHeader, bstrValue);
    // 参数:bstrHeader(字符串,头名称。)
    //       bstrValue(字符串,值。)
    // 备注:如果已经存在已此名称命名的http头,则覆盖之。此方法必须在open方法后调用。
    // xmlhttp.setRequestHeader(bstrHeader, bstrValue);
}


function HandleStateChange()
{
      // 属性:readyState
    // 返回XMLHTTP请求的当前状态
    // 语法:lValue = oXMLHttpRequest.readyState;
    // 备注:变量,此属性只读,状态用长度为4的整型表示.定义如下:
    // 0 (未初始化) 对象已建立,但是尚未初始化(尚未调用open方法)
    // 1 (初始化) 对象已建立,尚未调用send方法
    // 2 (发送数据) send方法已调用,但是当前的状态及http头未知
    // 3 (数据传送中) 已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误,
    // 4 (完成) 数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据
    if (xmlhttp.readyState == 4){
       document.frmTest.myButton.disabled = false;
      
         // 属性:responseBody
       // 返回某一格式的服务器响应数据
       // 语法:strValue = oXMLHttpRequest.responseBody;
       // 备注:变量,此属性只读,以unsigned array格式表示直接从服务器返回的未经解码的二进制数据。
       alert(xmlhttp.responseBody);
      
       // 属性:responseStream
       // 以Ado Stream对象的形式返回响应信息
       // 语法:strValue = oXMLHttpRequest.responseStream;
       // 备注:变量,此属性只读,以Ado Stream对象的形式返回响应信息。
       alert(xmlhttp.responseStream);
      
         // 属性:responseText
       // 将响应信息作为字符串返回
       // 语法:strValue = oXMLHttpRequest.responseText;
       // 备注:变量,此属性只读,将响应信息作为字符串返回。XMLHTTP尝试将响应信息解码为Unicode字符串,
       // XMLHTTP默认将响应数据的编码定为UTF-8,如果服务器返回的数据带BOM(byte-order mark),XMLHTTP可
       // 以解码任何UCS-2 (big or little endian)或者UCS-4 数据。注意,如果服务器返回的是xml文档,此属
       // 性并不处理xml文档中的编码声明。你需要使用responseXML来处理。        
         alert(xmlhttp.responseText);
        
         // 属性:responseXML
       // 将响应信息格式化为Xml Document对象并返回
       // 语法:var objDispatch = oXMLHttpRequest.responseXML;
       // 备注:变量,此属性只读,将响应信息格式化为Xml Document对象并返回。如果响应数据不是有效的XML文档,
       // 此属性本身不返回XMLDOMParseError,可以通过处理过的DOMDocument对象获取错误信息。
       alert("Result = " + xmlhttp.responseXML.xml);
      
         // 属性:status
       // 返回当前请求的http状态码
       // 语法:lValue = oXMLHttpRequest.status;
       // 返回值:长整形标准http状态码,定义如下:
       // Number:Description 
       // 100:Continue
         // 101:Switching protocols
         // 200:OK
         // 201:Created
         // 202:Accepted
         // 203:Non-Authoritative Information
         // 204:No Content
         // 205:Reset Content
         // 206:Partial Content
         // 300:Multiple Choices
         // 301:Moved Permanently
         // 302:Found
         // 303:See Other
         // 304:Not Modified
         // 305:Use Proxy
         // 307:Temporary Redirect
         // 400:Bad Request
         // 401:Unauthorized
         // 402:Payment Required
         // 403:Forbidden
         // 404:Not Found
         // 405:Method Not Allowed
         // 406:Not Acceptable
         // 407:Proxy Authentication Required
         // 408:Request Timeout
         // 409:Conflict
         // 410:Gone
         // 411:Length Required
         // 412:Precondition Failed
         // 413:Request Entity Too Large
         // 414:Request-URI Too Long
         // 415:Unsupported Media Type
         // 416:Requested Range Not Suitable
         // 417:Expectation Failed
         // 500:Internal Server Error
         // 501:Not Implemented
         // 502:Bad Gateway
         // 503:Service Unavailable
         // 504:Gateway Timeout
         // 505:HTTP Version Not Supported
         // 备注:长整形,此属性只读,返回当前请求的http状态码,此属性仅当数据发送并接收完毕后才可获取。
       alert(xmlhttp.status);
      
       // 属性:statusText
       // 返回当前请求的响应行状态
       // 语法:strValue = oXMLHttpRequest.statusText;
       // 备注:字符串,此属性只读,以BSTR返回当前请求的响应行状态,此属性仅当数据发送并接收完毕后才可获取。
       alert(xmlhttp.statusText);
    }
}
//-->
</script>


 

XMLHttpRequest 是一种用于在浏览器和服务器之间进行异步通信的技术,允许网页在不刷新整个页面的情况下与服务器交换数据。 ### XMLHttpRequest 的基本介绍 从代码中可以看出,XMLHttpRequestEventTarget 接口定义了 7 个事件,分别是 onloadstart、onprogress、onabort、ontimeout、onerror、onload、onloadend。每个 XMLHttpRequest 里面都有一个 upload 属性,upload 是一个 XMLHttpRequestUpload 对象。XMLHttpRequestXMLHttpRequestUpload 都继承了同一个 XMLHttpRequestEventTarget 接口,所以 xhr 和 xhr.upload 都有这 7 个事件。此外,onreadystatechange 是 XMLHttpRequest 独有的事件。因此,xhr 一共有 8 个相关事件,即 7 个 XMLHttpRequestEventTarget 事件加上 1 个独有的 onreadystatechange 事件;而 xhr.upload 只有 7 个 XMLHttpRequestEventTarget 事件 [^2][^3]。 ### XMLHttpRequest 的使用方法 使用 XMLHttpRequest 对象发送请求的基本步骤如下: 1. **获取 XMLHttpRequest 对象实例的引用**:可以创建一个新的实例,也可以访问包含有 XMLHttpRequest 实例的一个变量。 2. **设置状态改变处理函数**:把对象的 onreadystatechange 属性设置为指向一个 JavaScript 函数的指针,该函数会处理 XMLHttpRequest 对象状态的改变。 3. **指定请求的属性**:使用 XMLHttpRequest 对象的 open() 方法指定将发出的请求。open() 方法取 3 个参数,一个是指示所用方法(通常是 GET 或 POST)的串,另一个是表示目标资源 URL 的串,还有一个 Boolean 值,指示请求是否是异步的。 4. **发送请求**:使用 XMLHttpRequest 对象的 send() 方法把请求传送到指定的目标资源。send() 方法接受一个参数,通常是一个串或一个 DOM 对象,这个参数会作为请求体的一部分传送到目标 URL。向 send() 方法提供参数时,要确保 open() 中指定的方法是 POST。如果没有数据要作为请求体的一部分发送,则使用 null [^1]。 以下是一个简单的使用 XMLHttpRequest 发送 GET 请求的示例代码: ```javascript // 创建 XMLHttpRequest 对象 const xhr = new XMLHttpRequest(); // 处理状态改变事件 xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { console.log(xhr.responseText); } }; // 打开请求 xhr.open('GET', 'https://example.com/api/data', true); // 发送请求 xhr.send(null); ``` ### XMLHttpRequest 的原理 XMLHttpRequest 的工作原理基于浏览器与服务器之间的 HTTP 协议。当创建一个 XMLHttpRequest 对象并调用 open() 方法指定请求的相关信息后,浏览器会根据这些信息构建一个 HTTP 请求。然后,使用 send() 方法将请求发送到服务器。服务器接收到请求后,会进行相应的处理,并返回一个 HTTP 响应。浏览器接收到响应后,XMLHttpRequest 对象的状态会发生改变,通过监听 onreadystatechange 事件,可以获取响应的状态和数据 [^1]。 ### XMLHttpRequest 的应用场景 XMLHttpRequest 常用于以下场景: - **动态加载内容**:在不刷新整个页面的情况下,动态加载新的内容,如新闻列表的滚动加载。 - **表单数据提交**:异步提交表单数据,避免页面刷新,提高用户体验。 - **实时数据更新**:定期从服务器获取最新数据,如股票行情、天气预报等。 ### 可能遇到的报错 例如,可能会出现 “Uncaught DOMException: Failed to execute 'open' on 'XMLHttpRequest': Synchronous requests from a document must not set a response type.” 这样的报错 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值