浏览器编程中如何处理弹出窗口

在浏览器编程中,不可回避的就是弹出窗口,这里一般指不是用户期望的那种弹出窗口。以下是一家之言,未必是最好的办法。

 

记得在WIN XP SP2之前,IE是不具备这样的功能的。那个时候,正是弹出广告最泛滥的时候,各种各样的弹窗层出不穷,防不胜防、烦不胜烦!也就是此时,成就了名噪一时的3721,3721等插件如何判断弹窗的?我不知道。

 

在这个年代,似乎没有很好的办法。我们想象一下,什么样的弹窗是用户点击之后所期望的弹窗?应该是用户用鼠标点了一下链接,或者是在链接上右键,再选择“在新窗口打开”,或此时回车。总是就是在鼠标或键盘操作后发生的弹窗我们无奈的是为正常弹窗。

 

有鉴于此,我们可以安装钩子来捕捉这些操作(比如左键单击或回车等),配合时间判断,比如操作0.3秒之后算正常的?但很多网页就检测脚本,就在你鼠标点击的时候就势弹出几个窗口,这就无能为力了。

 

而WIN XP SP2出来的时候,就提供了一个新鲜的功能:弹窗阻止。我想,3721的最终灭亡,与此不无关系吧。因为其最重要的功能已经集成在IE中了,谁还愿意多此一举而安装3721这类的辅助插件呢?

 

IE所提供的这个功能,就是INewWindowManager接口。该接口事件在NewWindow2事件之前发生,可以捕获大部分弹出窗口和网页对话框的创建(有点拗口,应该说在弹出的时候得到通知,并允许阻止)。这在很多时候非常有用,尤其是模式的网页对话框,你不做出响应就无法操作网页了。这里为什么说大部分而不是全部呢?因为笔者在实际使用过程中发现,某些网页使用了某种技术,模拟了一种类似外部调用的方法弹出。

 

该接口大致如下:

Private Sub INewWindowManager_EvaluateNewWindow(ByVal pszUrl As String, ByVal pszName As String, ByVal pszUrlContext As String, ByVal pszFeatures As String, ByVal fReplace As olelib.BOOL, ByVal dwFlags As Long, ByVal dwUserActionTime As Long)

 

End Sub

 

各个参数的具体描述可以参看MSDN,再次不再赘述。

用dwFlags参数来判断弹出窗口的类型,判断后,若想阻止,直接返回S_FALSE即可。不过前述(前面几篇文章)已经说过,看上面的代码描述是Sub而不是Function,所以没法做到真正的类似return的返回的,必须做一点处理。总之,返回S_FALSE的话,NewWindow2事件就没机会执行了。

 

还有个办法直接让系统来掌管弹出窗口(前提是至少WIN XP SP2),似乎更好,但却没法向我们自己实现该接口这样方便和详细,可以得到URL等详细信息,控制起来是不是更灵活呢?

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值