打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
在WebBrowser里如何响应HTML事件
(小仙妹)发表于:2002-03-18 09:40:26
由于这个问题不一定有人回答出来,所以暂时是1分。如果有圆满答案肯定加分。

最近以VB制作程序,以WebBrowser做输出显示还可以(比如输出个报表),但是不能捕捉事件。比如我以WebBrowser打开一个web页,当我用鼠标指向一个IMG时候在网页里会产生一个onmouseover事件,但是这个事件如何让VB程序获得?不知道有什么办法能捕捉HTML元素的事件?
只要能实现如下目的,就算解决了!

1、在WebBrowser里打开一个有两个IMG的网页。
2、当鼠标移动到第一个IMG上的时候,VB程序的Text1显示“A”
3、当鼠标移动到第二个IMG上的时候,VB程序的Text1显示“B”
4、当鼠标点击第一个IMG上的时候,VB程序的Text2的数值加一
5、当鼠标点击第二个IMG上的时候,VB程序的Text2的数值减一

如果真的可以捕捉HTML事件,那将可以制作出极其美观的程序。同时可以省掉很多控件。

另外,是否可以把HTML元素直接放到Form窗体上呢?如果有办法也请给出一个例子。
(想吃老虎的小猪)
以前做过几个小例子放家里了,明天如果还没有朋友拿到那99分,我再来试试看。我记得有这么几个方面的东西需要了解,也算是线索吧。

你试过在VB里面引用接口么?解决了这个问题,剩下的步骤和vc来做没什么区别了。
首先,解决这个问题需要用到一点vb里面不常用的东西。你查一下   Implements   这个   statement   ,vb用它可以引入interface,还可以一定程度上模拟“继承”。

其次,需要查一下IE编程需要调用哪几个接口(不好意思,我不大记得,MSDN   Library上有的东西我都不记——piggybrain)。然后用   implements引入这几个interface,并实现必需的方法。

另外可能还需要用到CallByName这个方法,因为你需要在你的vb程序中创建一个   class,然后传递这个class的一个instance给IE的接口作为callback的方法的载体来响应DHTML中的事件,例如:onmousemove。

(想吃老虎的小猪)
我记得好像需要引用   IWebBrowser2   这个接口(shdocvw.dll),如果要处理DHTML中的events,引用   DWebBrowserEvents2   这个接口。

对了,我查了一下   MSDN   Library,有这么两个标题对你可能有帮助:
Reusing   the   WebBrowser   Control
Reusing   MSHTML

新版本的MSDNLib真麻烦,基本都是.net   framework的东西,卸载,重装之...
(陈锐)
tips:程序中如何监控网页中元素的事件  

对编写脚本熟悉的读者都知道页面中可以添加脚本响应元素的事件,例如超链接的OnClick事件,图片的OnMouseMove事件,我们也可以使VB程序响应这些事件。下面是一个VB响应页面中按钮的Click事件的代码:  
首先建立一个新工程,在Form1中加入一个Webbrowser控件,然后在Form1中加入以下代码:  

Option   Explicit  

Public   Sub   Some_Procedure()  
MsgBox   "你点击了按钮. "  
End   Sub  

Private   Sub   Form_Load()  
'下载空页面  
WebBrowser1.Navigate2   "about:blank "  
End   Sub  

Private   Sub   WebBrowser1_DocumentComplete(ByVal   pDisp   As   Object,   URL   As   Variant)  
'建立事件响应类  
Dim   cfForward   As   clsForward  

'定义在浏览器中显示的HTML代码,其中包含一个按钮btnMyButton  
Dim   sHTML   As   String  
sHTML   =   " <P> This   is   some   text. </P> "  
sHTML   =   sHTML   &   " <P> And   here   is   a   button. </P> "  
sHTML   =   sHTML   &   " <BUTTON   ID=btnMyButton> "  
sHTML   =   sHTML   &   "Click   this   button. </BUTTON> "  

'将HTML代码写入浏览器  
WebBrowser1.Document.body.innerHTML   =   sHTML  

'将事件响应类连接到页面的按钮btnMyButton上  
Set   cfForward   =   New   clsForward  
cfForward.Set_Destination   Me,   "Some_Procedure "  
WebBrowser1.Document.All( "btnMyButton ").onclick   =   cfForward  
End   Sub  

向工程中添加一个Class   Module,Class   Module的Name属性设定为clsForward,在clsForward中添加以下代码:  

Option   Explicit  

Dim   oObject   As   Object  
Dim   sMethod   As   String  
Dim   bInstantiated   As   Boolean  

Private   Sub   Class_Initialize()  
bInstantiated   =   False  
End   Sub  

Public   Sub   Set_Destination(oInObject   As   Object,   sInMethod   As   String)  
Set   oObject   =   oInObject  
sMethod   =   sInMethod  
bInstantiated   =   True  
End   Sub  

Public   Sub   My_Default_Method()  
If   bInstantiated   Then  
CallByName   oObject,   sMethod,   VbMethod  
End   If  
End   Sub  

运行程序,点击Webbrowser中的“Click   this   button”按钮。程序就会弹出消息框提示“你点击了按钮.”

(陈锐)
上面的范例是监控一个有name属性的按钮,对于像图片这样的元素,你可以给它一个Name,或者遍历页面元素获得Img元素,下面是一个遍历页面元素的范例:

怎么用vb   script脚本读出网页中radio选的值?
代码:
<HTML>
<HEAD>

</HEAD>
<BODY>
<script   language= "VBScript ">

function   IntoIT()
        On   error   resume   next
        Set   MyIT   =   Window.document
       
        for   each   oEles   in   MyIT.all
            if   typename(oEles)= "HTMLFormElement "   then
                for   each   oInput   in   oEles.all
                    Select   Case   oInput.Type
                        case   "radio "  
                                    if   oInput.checked   then
                                    astr=astr+oInput.Value+ "Is   selected   <br> "
                            else
                                astr=astr+oInput.Value+ "Is   not   selected   <br> "
                            end   if
                        case   "text "
                            astr= " <p>   text   is   "+astr+oInput.Value+ " </p> "                        
                        case   else
                    end   select
                next
            end   if
        next
       
        MyIT.write   astr
end   function
</SCRIPT>

<form   method= "POST "   action= "--WEBBOT-SELF-- ">
    <p> <input   type= "radio "   value= "V1 "   checked   name= "R1 "> </p>
    <p> <input   type= "radio "   name= "R1 "   value= "V2 "> </p>
    <p> <input   type= "text "   name= "T1 "   size= "20 "> </p>
    <p> <select   size= "1 "   name= "D1 ">
        <option> A1 </option>
        <option> A2 </option>
        <option> A3 </option>
    </select> </p>
    <p> <input   type= "submit "   value= "提交 "   name= "B1 "> <input   type= "reset "   value= "全部重写 "   name= "B2 "> </p>
    <p> <b> <a   href= "VBScript:IntoIT() "   > <br>
                            加入收藏夹 </a> </b> </span> </p>
</form>
</BODY>
</HTML>
基本上就是通过遍历访问页面中的元素来实现的
(想吃老虎的小猪)
tips:程序中如何监控网页中元素的事件  

这段代码很眼熟,从MSDN翻译的吧,呵呵

'将事件响应类连接到页面的按钮btnMyButton上  
Set   cfForward   =   New   clsForward  
cfForward.Set_Destination   Me,   "Some_Procedure "  
WebBrowser1.Document.All( "btnMyButton ").onclick   =   cfForward  

核心代码就这两句。
cfForward.Set_Destination   object,   Method_of_object   (好比传递函数指针,这样的使用方式有点像c#里面的delegate,或者java中传递一个object的instance,并invoke某个method)。完全可以绑定另外的object的method,clsForward内部用   CallByName   来调用比如Form1(传入Me)   这个对象(你自己的其他对象也可以)的   Some_Procedure(Some_Procedure不需要参数,你可以传递其它方法,甚至调用事件处理方法如From1_OnUnload,并传递需要的参数)。
WebBrowser1.Document.All( "btnMyButton ").onclick   =   cfForward  
绑定DHTML的event   object到clsForward的实例。

不过WebBrowser不具备InternetExplorer的部分功能。我前面说需要引用几个interface说错了,不好意思。你的要求不用引用接口,那些interface是用来控制InternetExplorer的instance的,比如监控浏览器下载的内容如果是flash,就忽略(现在很多广告flash的循环做得不好,非常消耗cpu资源,而且flash存在恶意攻击的可能)...
(想吃老虎的小猪)#6楼 得分:0回复于:2002-03-18 11:27:09
另外请教     TechnoFantasy(www.applevb.com)  
我认为   CallByName   就“是”   VB   的   Delegate,只是需要像delegate那样通过interface来约束项目中几个模块(比如不同的人写的)之间用这样的方法进行一些高级的refactory工作。不过眼下有个问题不明白,

Public   Sub   My_Default_Method()  
If   bInstantiated   Then  
CallByName   oObject,   sMethod,   VbMethod  
End   If  
End   Sub  

将某个方法设置为该类的默认方法,除了在vb的类生成工具中设置,还能怎么做呢?
比如除了手工修改   cls文件中,在该方法中加入
Attribute   disConnect.VB_UserMemId   =   0,有没有办法在写cls的代码的时候将该方法标注为默认方法(属性也是如此)呢?
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
监控网页中元素的事件
VB 解决webbrowser用IE弹出新窗口问题.
请问VB能否在程序运行过程中将变量的值赋给数据库的字段? - VB6论坛 - 编程论坛
VB中使用PNG格式图片的一种新方法
【excel vba】使用WebBrowser直接加载网页在excel表中
VB实现自动填表
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服