none
刷新页面无法触发DocumentComplete事件 RRS feed

  • 问题

  • 开发环境:
    VB6,IE9,WIN7

    试验网址:
    http://ess.10010.com

    试验过程:
    可以用BHO,也可以直接画个webbrowser

    当Navigate到试验网址时,能够触发DocumentComplete.各项测试正常.
    然后按F5刷新页面.此时不会触发DocumentComplete事件.有触发DownloadComplete,ProgressChange事件,并且ReadState值已为4(已完成).用httpWatch监控是有数据产生的.

    重新调用Navigate方法打开此网站时,又可以触发DocumentComplete事件.

    将试验网站换成其他的(如esales.10010.com),测试又完全正常.

    提问:
    1.DocumentComplete在什么情况下会被触发? 网上说只要ReadState=4就会触发,而上面的测试说明并不是这样.
    2.为什么就这个网站刷新时不会触发DocumentComplete事件?难道是用了什么特殊技术?
    2012年10月15日 15:28

答案

全部回复

  • 你好,

    我经过测试,发现F5的确不会触发DocumentCompleted事件——我用百度(www.baidu.com)测试过也是如此。


    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年10月16日 4:30
    版主
  • 我没用过VB6,但是发现这个链接里的情况和你的比较像,是c#的,http://stackoverflow.com/questions/711040/c-sharp-webbrowser-control-not-firing-the-documentcompleted-event

    Think again!

    • 已标记为答案 三断笛1 2012年10月17日 2:26
    2012年10月16日 9:16
  • 我试过换到XP,IE6,问题依然存在.而且换一个网站就能得到正确的结果,并不是所有的页面都不能触发这个事件.所以我想不是换一个mshtml.dll能解决的,我电脑里现在有5个大小不同的这个文件,从3M到17M不等.没能解决触发DocumentComplete的问题,所以我现在使用DownloadComplete事件,并且枚举窗口所有框架,找到我需要处理的页面进行处理.

    附上枚举页面的代码,希望能帮助到有需要的人.至于DocumentComplete的问题,待项目完成后再研究吧.

    谢谢各位.

    '枚举页面中所有的frame
    Private Sub EnumFrames(ByVal wb As SHDocVw.WebBrowser, wbs As Collection)
        On Error GoTo ErrorHandle
        Dim pContainer  As olelib.IOleContainer
        Dim pEnumerator As olelib.IEnumUnknown
        Dim pUnk        As olelib.IUnknown
        Dim pBrowser    As SHDocVw.WebBrowser
        'If Not (TypeOf wb Is olelib.IOleContainer) Then Exit Sub
        Set pContainer = wb.Document
        
        If pContainer.EnumObjects(OLECONTF_EMBEDDINGS, pEnumerator) = 0 Then
            Set pContainer = Nothing
            Do While pEnumerator.Next(1, pUnk) = 0
                On Error Resume Next
                Err.Clear
                Set pBrowser = pUnk
       
                If Err.Number = 0 Then
                    wbs.Add pBrowser
                    Call EnumFrames(pBrowser, wbs)
                Else
                    'Debug.Print Err.Description
                End If
            Loop
            Set pEnumerator = Nothing
        End If
        Exit Sub
    ErrorHandle:
    End Sub
    2012年10月17日 2:25
  • 2012年10月17日 2:27
    版主
  • 另外,在.NET的控件里面,有PreviewKeyDown事件,如果VB6的控件里面也有的话,可以在这里判断按键F5和Ctrol-R,如果是这两个键,则使用Navigate方法指向当前Webbrowser的URL。 但是我测试的时候,不知道为什么刷新两次才触发一次documentcomplete事件。。 仅作参考吧-

    Think again!

    2012年10月17日 2:44