'我是想利用这个函数取出来网页的全部元素
'不是frame,就直接记下他的名称
'对frame对象,就回调继续枚举
'参数wb1可以是webbrowser,或者frame
'但是提示堆浅溢出
Private Function GetFrame(wb1 As Object) As String
'调用:
'Rtxt1.Text = GetFrame(Web1)
'Rtxt1.Text = GetFrame(Web1.Document.frames(1).Document.frames)
   GetFrame = ""
   Dim x As Object
   For Each x In wb1.Document.All
     If UCase(x.tagname) <> "IFRAME" Then
        GetFrame = GetFrame & x.tagname & ":" & "" & vbCrLf      
     ElseIf UCase(x.tagname) = "IFRAME" Then
        GetFrame = GetFrame & x.tagname & ":" & x.Name & GetFrame(x) & vbCrLf  
     End If
   Next
 
End Function那我大侠帮看看?谢谢先!

解决方案 »

  1.   

    GetFrame = GetFrame & x.tagname & ":" & x.Name & GetFrame(x) & vbCrLf  
    ===估计是这一句
    我一运行,就提示堆浅溢出,就退出了
    没有返回那个出错的地方
      

  2.   

    加上option explicit,然后在GetFrame = "" 这里加断点,运行到这里后按F8,一步一步调试
      

  3.   

    老大,我测试了,有些网页可以,有些网页不行
    Option ExplicitPrivate Sub Command1_Click()
       Rtxt1.Text = GetFrame(Web1)
    End SubPrivate Sub Form_Load()
      '使用2个比较流行的网站126,sohu测试
      '登陆进去,点击“写信”按钮,右边出现收件人,主题、正文框,就点击Command1
      '经过测试,126的可以,没有报错,sohu的就报错
      'sohu报错是这一句:GetFrame = GetFrame & x.tagname & ":" & x.Name & GetFrame(x) & vbCrLf 
      Web1.Navigate2 "http://mail.126.com/" 
      Web1.Navigate2 "http://mail.sohu.com/"
    End Sub
    '我是想利用这个函数取出来网页的全部元素
    '不是frame,就直接记下他的名称
    '对frame对象,就回调继续枚举
    '参数wb1可以是webbrowser,或者frame
    '但是提示堆浅溢出
    Private Function GetFrame(wb1 As Object) As String
    '调用:
    'Rtxt1.Text = GetFrame(Web1)
    'Rtxt1.Text = GetFrame(Web1.Document.frames(1).Document.frames)
      GetFrame = ""
      Dim x As Object
      For Each x In wb1.Document.All
        If UCase(x.tagname) <> "IFRAME" Then
            GetFrame = GetFrame & x.tagname & ":" & "" & vbCrLf
        ElseIf UCase(x.tagname) = "IFRAME" Then
            GetFrame = GetFrame & x.tagname & ":" & x.Name & GetFrame(x) & vbCrLf
        End If
      NextEnd Function
      

  4.   

    'Rtxt1.ScrollBars 设置为 rtfVertical
    Option ExplicitPrivate Sub Command1_Click()
        Call GetFrame(Web1)
    End SubPrivate Sub Form_Load()
        Web1.Navigate2 "http://mail.126.com/"
    '    Web1.Navigate2 "http://mail.sohu.com/"
        Me.Rtxt1.Text = ""
    End Sub
    Private Sub GetFrame(ByVal wb1 As Object)
      Dim x As Object
      Static i As Integer
      For Each x In wb1.Document.All
        If UCase(x.tagname) <> "IFRAME" Then
            Me.Rtxt1.SelStart = Len(Rtxt1.Text)
            Me.Rtxt1.SelText = x.tagname & ";"
        Else
            Me.Rtxt1.SelStart = Len(Rtxt1.Text)
            Me.Rtxt1.SelText = x.tagname & ";" & vbCrLf
            i = i + 1
            If i > 10 Then
                Exit Sub
            End If
            Call GetFrame(x)
        End If'    Me.Rtxt1.SelStart = Len(Rtxt1.Text)
    '    Me.Rtxt1.SelText = x.tagname & ";"
      Next
    End Sub
    看一下运行结果就知道了。如果不加退出会死循环。
      

  5.   

    谢谢大侠!我测试了,126的是没有什么疑问,就是那个sohu,出现大量的一样的tagname,莫名其妙,为什么那么多相同的?
    我写这个函数的目的,本来是想枚举网页的全部元素。就是,要是没有frame,就将全部的text,option,select,checkbox,textarea枚举出来,要是有IFRAME,就将那个IFRAME里面全部的text,option,select,checkbox,textarea枚举出来,循环,一直得到全部的元素为止。但是现在我看到sohu的大量一样的元素,不知是不是那个地方重复了?继续请教,谢谢先!
      

  6.   

    晕,我怎么测试的126都不行,frame循环重复了,好像frame就是web1一样。
      

  7.   

    好像frame就是web1一样。===是,我发现126的只是显示第一层web1的元素,没有显示frame,iframe,frameset下面的元素
    要考虑的是frame下面有子frame,子frame下面有孙子frame,...怎么办?继续请教