Use the onReadyStateChange Property (Visual Basic)

來源:互聯網
上載者:User

昨天晚上在宿舍測試VB6調用XMLHttp進行通訊,其中同步調用還是很容易的,但是非同步呼叫很是迷惑,主要是因為XMLHttpRequest.OnReadyStateChange 屬性不清楚怎麼用,如果在javascript裡邊直接用回呼函數還很容易,但是在VB裡邊就很迷惑了,後來看MSDN 2003中的一篇文章才搞清楚,其實也不難,就是你不知道。

下邊的內容是從MSDN上照抄的,其中打黃色的地方是需要注意的。

這篇文章給出了利用DOM、Timer和封裝類的方式進行非同步呼叫,個人感覺最爽的還是封裝類的方式,比較的精巧,關鍵是以前沒有這麼用過。

 

Microsoft XML Core Services (MSXML) 4.0 - DOM Developer's Guide 

Use the onReadyStateChange Property (Visual Basic)
This topic discusses the implementation details necessary to use onreadystatechange notification in Microsoft Visual Basic applications.

Background Information for onReadyStateChange Events
The onreadystatechange callback function was not implemented as a COM automation event in the IXMLHTTPRequest and IServerXMLHTTPRequest components. This is because these components are heavily used in scripting environments, many of which do not support COM events. The onreadystatechange callback function was intended to be easy to use when working with scripting clients such as VBScript and JScript.

Because the onreadystatechange property was not implemented through COM-based automation events, Visual Basic (and C/C++) applications need to implement this callback functionality differently.

Using onReadyStateChange in Visual Basic Applications
In Visual Basic, you can use any of the following approaches to design applications that support onreadystatechange events.

Use a timer control to poll the readyState property. When the value of the readyState property indicates that the data is ready, turn the timer off.
Use a DomDocument object to load the XML and handle the state using the WithEvents keyword.
Note   If you are using the IXMLHTTPRequest and IServerXMLHTTPRequest components to first post your XML data to a Web server, this option will not work for you.
Create a wrapper class, and create a procedure to handle the event within the class module. Set the procedure to the default, and bind the class to the onreadystatechange event to either the IXMLHTTPRequest or IServerXMLHTTPRequest component, depending on which component you are using with your application.
The following sample application demonstrates each of these three approaches.

To use OnReadyStateChange in a Visual Basic application

Open Microsoft? Visual Basic? 6.0. In the New Project dialog box, double-click Standard EXE.
On the Project menu, click References.
In the Available References list, select Microsoft XML,v4.0, and then click OK.
Add four command buttons to Form1 and set the caption of each button as follows:

Control Caption
Command1 Fail
Command2 Polling using Timer
Command3 Using Class Wrapper
Command4 Using DOMDocument

Add a timer control to Form1.
Copy and paste the following code into Form1.

Option Explicit

Public XMLHttpRequest As MSXML2.XMLHTTP40
Public WithEvents XMLDom As MSXML2.DOMDocument40

Private Function FunctionReadyStateChange()
    Debug.Print XMLHttpRequest.readyState
End Function

Private Sub Command1_Click()
    FailedOnReadyState
End Sub

Private Sub Command2_Click()
    TimerResolution
End Sub

Private Sub Command3_Click()
    ClassResolution
End Sub

Private Sub Command4_Click()
    DOMResolution
End Sub

Private Sub FailedOnReadyState()
On Error GoTo FailedState
    If Not XMLHttpRequest Is Nothing Then Set XMLHttpRequest = Nothing
   
    Set XMLHttpRequest = New MSXML2.XMLHTTP40
   
    ' Assign the wrapper class object to onreadystatechange.
    XMLHttpRequest.OnReadyStateChange = FunctionReadyStateChange

    ' Get some stuff asynchronously.
    XMLHttpRequest.open "GET", "http://localhost/test.xml", True
    XMLHttpRequest.send
   
    Exit Sub

FailedState:
    MsgBox Err.Number & ": " & Err.Description

End Sub

Private Sub TimerResolution()
    If Not XMLHttpRequest Is Nothing Then Set XMLHttpRequest = Nothing
    Timer1.Interval = 1
   
    Set XMLHttpRequest = New MSXML2.XMLHTTP40
   
    ' Get some stuff asynchronously.
    XMLHttpRequest.open "GET", "http://localhost/test.xml", True
    XMLHttpRequest.send
End Sub

Private Sub ClassResolution()
    If Not XMLHttpRequest Is Nothing Then Set XMLHttpRequest = Nothing
   
    Dim MyOnReadyStateWrapper As MyReadyStateHandler
    Set XMLHttpRequest = New MSXML2.XMLHTTP40

    ' Create an instance of the wrapper class.
    Set MyOnReadyStateWrapper = New MyReadyStateHandler

    ' Assign the wrapper class object to onreadystatechange. 
    XMLHttpRequest.OnReadyStateChange = MyOnReadyStateWrapper

    ' Get some stuff asynchronously.
    XMLHttpRequest.open "GET", "http://localhost/test.xml", True
    XMLHttpRequest.send

End Sub

Private Sub DOMResolution()
    If Not XMLHttpRequest Is Nothing Then Set XMLHttpRequest = Nothing
    If Not XMLDom Is Nothing Then Set XMLDom = Nothing
   
    Set XMLDom = New MSXML2.DOMDocument40
   
    XMLDom.async = True
    XMLDom.Load "http://localhost/test.xml"
   
End Sub

Private Sub Timer1_Timer()
    Debug.Print XMLHttpRequest.readyState
    If XMLHttpRequest.readyState = 4 Then
        MsgBox "Done"
        Timer1.Interval = 0
    End If
End Sub

Private Sub XMLDom_onreadystatechange()
    Debug.Print XMLDom.readyState
    If XMLDom.readyState = 4 Then
        MsgBox "Done"
    End If
End Sub

From the Project menu, click Add Class Module.
Change the name of the new class module from "Class1" to "MyReadyStateHandler"
Paste the following code into the class module:

Option Explicit

Sub OnReadyStateChange()
    Debug.Print Form1.XMLHttpRequest.readyState
    If Form1.XMLHttpRequest.readyState = 4 Then
        MsgBox "Done"
    End If
End Sub

In the sample code added in the previous step, highlight the procedure name "OnReadyStateChange" by selecting it in the Code window.
From the Tools menu, click Procedure Attributes.
In the Procedure Attributes dialog, the Name combo box should show "OnReadyStateChange."

Click Advanced.
In Procedure ID, select "(Default)" from the available options.
Click OK.

Save the class module (MyReadyStateHandler.cls) to file.
Open Notepad and paste the following XML into it
<?xml version="1.0"?>
<Root>
  <Testing>This is to test the onreadystatechange event on the XMLHTTPRequest or DOMDocument</Testing>
  <Testing>This is due to the event not being declared in the type library</Testing>
</Root>
Save the file as test.xml to your IIS localhost directory. For example, this folder might be C:\Inetpub\wwwroot for a typical default installation of IIS with Windows 2000.
In Visual Basic, from the Run menu, click Start to run the application.
Try the following command options to observe the different approaches to using the onreadystatechange event within Visual Basic.
To force a ready state failure, click Fail.
To view the polling resolution, click Polling using Timer.
To view the wrapper class solution, click Using Class Wrapper.
To view the DOMDocument approach, click Using DomDocument.
For each of the code paths in the previous step, you can place brake-points at various places to step through the code.

原文連結:http://www.nedcomp.nl/support/origdocs/xml4/extracted/dom_howdoi_0rj7.aspx
參考:http://www.xmlhttp.cn/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.