但Web编程还是有着与传统编程不相同的特点,这些特点决定了ASP.NET编程中必须以一些特殊的技巧来完成程序要求,弹出窗口正是这类编程方式的代表。
相当多的编程书籍对弹出窗口采取缄默或者一语带过,似乎看不过弹出窗口的巨大使用天地。
本文将为你解开弹出窗口使用中的大多数问题。
为了提高网站的访问的并发度和吞吐量,与其它服务器脚本一样,ASP.NET同样使用了客户端脚本来减轻服务器的压力。
ASP.NET到现在(1.1版>为止并不直接支持弹出窗口,必须通过JavaScript<或VBScript)来使用客户端弹出窗口。
一、警告窗口与在CodeBehind中使用客户端脚本的方式
要在浏览器中弹出一个最简单的警告窗口,可以使用JavaScript语句:
window.alert([sMessage]>
其中,sMessage是提示信息。
可惜,这样的弹出窗口是只有一个“确定”按钮,只能起到提示作用。
如果我们要在删除记录时候弹出一个询问的弹出窗口,此时你需要使用:
bConfirmed=window.confirm([sMessage]>
其中:
bConfirmed是返回值,sMessage是提示信息。
这个弹出窗口有两种选择:
“确定”或“放弃”,其选择的返回值放在bConfirmed中,可供代码作出判断。
为了提高代码的可重用性与可读性,应当使JavaScript与Codehind相互溶合。
通常有两种方式可以达到这样的效果。
<1)使用Response.Write方法:
使用Response.Write方法早在ASP时代就已经被支持了。
它可以把代码写到客户端,是一种相当方便且直观的方法。
以下代码演示了如何使用Response.Write方法来显示一个警告信息。
PrivateSubbtAlert_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs>HandlesbtAlert.Click’演示Response.Write方法和alert窗口。
Response.Write("">EndSub
<2)使用RegisterXXX方法
如果你观察Response.Write的生成HTML代码,你会发现Response.Write方法生成的代码是写到了HTML代码的最开始,即标签之前。
此时,所有的HTML对象都还没有生成,如果要想使用HTML内的对象,并与之交互,就会出现“找不到对象”的错误。
因此,笔者推荐一个更加符合CodeBehind方式的方式----使用RegisterXXX方法。
RegisterXXX包括:
RegisterClientScriptBlock、RegisterStartupScript以及用于判断的IsStartupScriptRegistered函数。
RegisterStartupScript的原型是:
OverridablePublicSubRegisterStartupScript(_ByValkeyAsString,_ByValscriptAsString_>
其中:
key表示这个脚本的唯一标识,script是代表脚本的字符串。
RegisterClientScriptBlock的原型与RegisterStartupScript相同,两个函数不同在于将其包含的脚本代码写入到HTML文件的不同位置。
RegisterClientScriptBlock在Page对象的元素的开始标记后立即发出客户端脚本,RegisterStartupScript则是在Page对象的元素的结束标记之前发出该脚本。
如果你的脚本有与页面对象(doucument对象>进行交互的语句<这在我们后面的例子中看到),则推荐使用RegisterStartupScript,反之如果要想客户端脚本尽可能早的执行,则可以使用RegisterClientScriptBlock或Response.Write。
为了防止在页面中反复加入脚本,在注册脚本时ReisterStartupScript/RegisterClientScriptBlock使用了key作为注册的Key,然后在程序中可以使用IsClientScriptBlockRegistered作判断。
以下例子将使用RegisterClientScriptBlock来演示confirm的使用方法。
PrivateSubbtConfirm_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs>HandlesbtConfirm.Click
’演示RegisterClientScriptBlock方法和confirm窗口
If(NotIsClientScriptBlockRegistered("clientScript">>Then‘判断是否已经加入了该脚本,没有则加入。
DimstrScriptAsStringstrScript=""‘注册脚本RegisterClientScriptBlock("clientScript",strScript>‘如果选择”否”,则继续向下执行。
EndIf
EndSub
二、弹出指定页面
光有提示窗口还远远不能满足我们的要求,在程序中,我们常常需要弹出指定页面。
此时可以使用JavaScript的window.open方法。
配合前面的RegisterClientSciptBlock方法,我们就可以实现指定页面的弹出。
以下代码展示了如何弹出指定页面:
PrivateSubbtWinOpen_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs>HandlesbtWinOpen.Click
’使用window.open与registerStartupScript简单演示。
If(NotIsClientScriptBlockRegistered("OpenScript">>Then’判断是否已经加入了该脚本,没有则加入。
DimstrScriptAsString=""RegisterStartupScript("OpenScript",strScript>EndIfEndSub
程序使用Window.open方法来弹出新的页面,它只一个参数:
新的弹出窗口的URL地址。
事实在window.open方法有多个参数,但这是javascipt的简单内容,我们将不会在这儿详细分说。
如果你有相关的问题,请查询MSDN。
这段程序在IE中直接使用一切正常。
但如果你正在使用类如GoSurf、MyIE2、NetCapter之类的浏览器,那么,很不幸!
你将看不到弹出窗口。
这就是我们将要讨论的弹出窗口过滤问题。
三、非标准IE浏览器对弹出窗口的过滤行为讨论
广告窗口的泛滥使得不少网民不堪铺天盖地的广告骚扰纷纷放弃标准IE浏览器而使用诸如GoSurf、MyIE2、NetCapter这样的使用IE内核支持多页面并能自动屏蔽广告的软件。
据说在即将发布的IE6sp2中微软也将加入封杀广告窗口功能。
这对大多数网民当然是件好事,可对于程序员而言,我们使用弹出窗口的方式与一般广告并无本质的不同,这样的窗口也会被弹出窗口管理器不分青红皂白的封杀,其结果当然是我们不愿看到的。
有没有一个标准的方式能让窗口正常的弹出呢?
这就要求我们了解浏览器封杀广告的原理。
通常的广告封杀器使用以下三种方式进行广告过滤:
<1)、基于窗口标题的封杀方式
这种封杀方式的原理是定时检查所有的IE窗口标题,然后于已经有的列表<由程序维护的一个数组列表)来比较,如果有相同的,我们就关闭这个窗口。
显然,这种方式有着诸多缺陷,它封杀了所有的弹出的窗口,管得太死,在程序真正使用的很少。
不过,依据它进行的变形方式倒使用得相当的普遍。
那就是,基于窗口标题名称的智能过滤技术,它根据弹出窗口的标题是否含有关于广告的关键字进行封杀,这为提高过滤效果作出了很好的探索。
<2)、基于窗口类和位置的封杀方式
经过分析发现正常浏览窗口的类名是IEFRAME和CabinetWClass,而广告窗口的类名是CabinetWClass。
进一步分析发现:
广告窗口的WorkerA类和ShellDocObjectView类的rect.top的值是相同的,正常IE窗口的WorkerA类和ShellDocObjectView类的rect.top的值是不相同的。
根据以上两点就可以书写广告杀手程序了。
事实上,我对此程序的通用性持怀疑态度。
因为笔者用Spy++分析发现,在Windows2000(笔者使用的操作系统>中,IE窗口的类都为IEFrame。
同时,由于Win2000是一个基于Unicode代码的操作系统,所以没有WorkerA类,而以WorkerW类取而代之。
同时,也不存在rect.top不相同的情况,由于笔者没有WindowsXP操作系统,所以不能针对WindowsXP作进一步的实验。
<3)、基于IECOM组件的封杀方式
以上两种方式都是把IE窗口当作一个普通的Windows窗口对待,进行判断的。
事实上,IE是一个典型的基于COM组件的浏览器,所有的基于IE内核的浏览器都是包装shdocvw.dll文件,然后书写相应的BHO代码。
只有这样才能做到真正的控制IE浏览器,而不是方法一、二这样的隔靴搔痒。
还有一种基于IE内核的弹出窗口封杀方法。
它可以在弹出窗口打开之前加以拦截。
其原理是:
每当IE打开一个新的窗口时候都会触发NewWindow事件,执行OnNewWindow2([out]IDispatch*,[out]BOOL*bCancel>方法。
重载此方法,判断打开新窗口事件是否发生在浏览页面已经下载完毕之后。
如果是,说明是正常的弹出窗口,反之加以拦截。
由于Gosurf这样的浏览器本身就重载了Shocvm.dll组件,所以使用第三种方法就自然成了顺理成章的事。
然而在使用过程中有时也会发现,广告过滤不很完美,但原理基本如此。
桌子上放着一杯热茶,双耳聆听着优美的音乐,手握鼠标正畅游于“‘网’洋大海”,突然在你的面前蹦出一个广告窗口,或者是在打开网页时连续弹出很多窗口……本来和谐的环境却被这个“弹出风波”搞得很尴尬,今天我们就来个重拳出击,彻底摆脱“弹出”的烦恼。
窗口的原理和危害 所谓弹出式广告,是指访问Web网页时跳出来的广告窗口。
这是在线媒体使用率极高的一种广告方式。
据有关人士透露,因特网上的这种弹出式广告,从广告面积、点击率而言,它是现有的网络广告模式中收效最好的一种。
弹出式广告业务在网站广告业务中占有相当大的比重,对于一些企业来说,弹出式广告是其打开市场的一把金钥匙,但是对于我们这些网民来说,时不时地弹出一个广告窗口,或是在打开一个网站时连续弹出一系列广告窗口,无疑是一种伤害,是一种造成听觉和视觉双重“污染”的伤害。
那么弹出式窗口或是弹出式广告窗口的工作原理是什么呢?
下面我们就来粗略地看看:
1.信使服务弹出窗口 症状:
有时,在使用计算机过程中,忽然在屏幕中央弹出一个窗口,窗口中的内容就是一些广告信息,如图1所示:
图1信使服务窗口
原理:
这些广告是通过用户的系统中的“信使服务”来成功发送的,“信使服务”在服务列表中名称为“Messenger”,该服务用来传输客户端和服务器之间的NetSend和Alerter(报警器>服务消息。
默认情况下,“信使服务”是打开的,所以当你的电脑连接到Internet上时,一些网站(包括厂商网站>可以通过该服务发送一些信息,在目标用户的计算机上会弹出一个名为“信使服务”的对话框。
现在有专门的信使发送软件可以批量的向某个IP段的电脑用户发送广告消息。
2.弹出式广告 症状:
弹出式广告的普遍率是最大的,现在几乎每个网站都有弹出式广告,包括一些知名的大型网站,如搜狐、新浪、网易等,在你打开其主页时,随即弹出很多窗口,如图2所示:
图2易趣弹出广告
这些窗口一般也没有什么地址栏、工具栏等,就是单独一窗口,如果网速较慢的情况下,你还得等它们全部弹出来后才能正常浏览你的目的页面,当然你还得一个一个地将它们关闭掉。
原理:
通常弹出式广告窗口基本上都是利用嵌套在主页面中的JavaScript语言来实现的,当打开网页时,这些代码就会自动被执行,而这些代码就是负责弹出这些小窗口的。
3.弹出的ActiveX签证信息窗口 症状:
有时,我们在打开一个网站时,会自动弹出一个“安全设置警告”窗口,提示我们是否安装由某某签名的控件窗口,如图3所示:
图3ActiveX控件安装提示
原理:
一些网站的功能需要一些程序来支持,而为了避免用户下载独立的程序来完成这项功能的麻烦,采取了一种“即用即下”的策略,也就是在你使用网站的这些功能时,你不用下载独立的程序来达到目的,只要下载支持相应功能的插件即可,典型的如在线杀毒网站的在线杀毒服务。
其实,这些下载的插件就是一些ActiveX控件,而ActiveX是微软集成本身操作系统及网络的技术结构,它包含动画,虚拟现实交互多媒体、信息等功能,它是微软的一个重要的网络技术,它可以让我们在线安装或运行网站中的程序。
危害:
针对以上的这些弹出式窗口、弹出式广告窗口、签证窗口,它们一般不像那些病毒程序,可能会破坏你的系统,但是它们也有一定的危害,归纳起来有以下几点:
1.干扰注意力,妨碍网络浏览,影响心情。
2.影响计算机操作,窗口弹出没完没了,有时不得不重新启动计算机。
3.降低机器运行速度,耽误用户时间。
4.导致系统不稳定,在低配置计算机上甚至导致死机。
5.降低网络浏览速度,并导致拨号用户频繁掉线。
6.造成听觉和视觉的双重污染。
7.弹出式窗口成为黑客攻击的重要渠道。
与信使窗口说再见 针对信使窗口,我们应该如何将其禁止呢?
一般可以通过以下两种方案来达到目的:
1.禁止系统的信使服务,2.使用工具。
下面我们就分别来看看:
1.禁止系统的信使服务 下面我们以流行的操作系统WindowsXP为例来介绍如何禁止信使服务,Windows2000、Windows2003的操作方法类似:
单击“开始→控制面板→管理”,在打开的“管理”窗口中双击“服务”打开“服务”窗口并双击“服务”图标,然后在打开的“服务”窗口中找到“Messenger”项,双击之,打开如图4所示的窗口:
图4Messenger设置窗口
在图4所示的窗口中的“启动类型”后面的下拉列表框中选择“已禁用”,然后再单击“停止”按钮,最后“确定”即可将系统默认打开的信使服务禁止了,这样那些企图通过信使服务在因特网上做广告的怪招将再也奈何不了你了。
小技巧:
我们可以在命令行中使用“netstopmessenger”命令来快速的停止信使服务。
2.使用工具取消信使服务 如果大家希望能方便的禁止信使服务,笔者向大家推荐一款小工具专门可以方便的对付信使广告服务的,这就是“信使服务终结者1.0”。
信使服务终结者 软件大小:
89KB 软件性质:
免费软件 运行环境:
Windows9x/Me/NT/2000/XP 下载地址:
将软件下载并安装到系统中后,运行时只有一个小窗口,如图5所示:
图5信使服务终结者运行窗口
当窗口空白处显示为“服务运行中”时,我们则可以接收到信使服务,如果想禁止信使服务窗口,单击“开始/停止”窗口则可,反之,要想接收广告窗口,再单击“开始/停止”按钮即可。
攻克IE的弹出式窗口 弹出的信使窗口已经被我们征服了,那IE中的弹出各类广告窗口我们应该如何对付它呢?
下面我们就来看看这些方案:
1.3721领兵助阵 第一步:
聘请3721上网助手 聘请3721上网助手方法很简单,直接在IE浏览器地址栏中输入“”地址,即可打开上网助手页面,如果是第一次打开该页面,首先将会弹出如图6所示的窗口。
图63721上网助手安装提示翱
单击“是”按钮将会下载助手程序,下载完毕后将其安装到系统中,这样我们就完成了3721上网助手的安装过程。
第二步:
助手的设置 助手安装到系统中后,重新启动系统并打开IE窗口,我们将看到助手图标,单击此图标右侧的下拉按钮,选择“启用广告窗口拦截”,然后将后面的“拦截弹出式窗口、拦截浮动窗口、拦截Flash窗口”三项全部选中,这样设置之后,当我们打开网页时,3721助手将会自动监测网页,如果有弹出式窗口的话,3721助手自动将其封杀于襁褓中,从此我们将会获取一个宁静的网络空间。
图7助手功能导航安装提示翱
另外,我们还可以打开“”页面,在此页面中的“助手功能导航”区中的“广告拦截”项,我们可以通过单击“弹出式窗口拦截、弹出插件拦截、浮动广告拦截、Flash广告拦截、信使拦截”来享受更加强劲的弹出式窗口拦截服务,如图7所示。
要想对哪种弹出式窗口进行拦截,直接点击相应的链接即可,例如以“浮动广告拦截”为例:
点击此链接之后,在打开的页面中选择“拦截页面浮动窗口”选项,然后单击“设置”按钮即开启了浮动窗口的拦截功能。
小提示:
如果需要恢复弹出式窗口,在IE浏览器中登录这个网站之后,只要点击广告拦截按钮即可让程序不再对该网站中的弹出式窗口进行拦截,如果仅仅需要暂时不拦截这个弹出式窗口,也只需先按下“Ctrl”按钮之后点击广告拦截按钮,这样只是当前取消对网站的弹出式窗口拦截,以后访问的时候仍然会屏蔽这些弹出式广告窗口。
2.雇佣强兵悍将 PopupControl 软件版本:
1.2 软件大小:
479KB 软件性质:
共享软件 运行环境:
Windowx9x/Me/NT/2000/XP 下载地址:
PopupControl作为一个浏览器插件,它是为Windows9x/2000/Me/ NT/XP中的IE4.x以上的浏览器设计的,它能够自动随浏览器一块启动,占用系统资源少。
它是小巧、高效、智能的反弹出软件产品,它借助于人工智能识别技术,能够关闭那些让人烦恼的弹出式窗口,而无需人的干预。
我们只要将其下载并安装到系统中,然后在IE中打开网页时,它将会自动在后台阻止弹出式窗口的出现,是一款非常体贴的小助手。
IE佳佳 软件版本:
1.01 软件大小:
1038KB 软件语言:
简体中文 软件性质:
共享软件 应用平台:
Windows9x/Me/NT/2000/XP 下载地址:
IE加加是一款IE增强软件,它集屏蔽IE广告窗口、IE修复、快速访问、页面搜索、快速设置代理等功能于一身,可以最大限度地增加IE的功能。
IE加加与其他IE增强工具不同,它不是一个独立的应用程序,而是与IE紧密结合,成为IE的一部分。
屏蔽弹出式广告:
将IE加加下载并安装到系统后,重启IE并在IE主窗口中单击“查找→工具→IE加加”,并将其选择,这样IE加加即开始工作了,IE加加与其它屏蔽广告窗口有所不同,它直接在广告窗口还没来得及显示之前就已经将其禁用了。
弹出广告终极杀手 软件版本:
V1.0 软件大小:
249KB 软件类别:
共享软件 应用平台:
Windows9x/Me/NT/2000/XP 下载地址:
弹出广告终极杀手用于自动关闭上网冲浪时IE浏览器弹出的各类广告窗口。
与一般的广告清除软件相比,本程序有以下特点:
<1)与IE独立运行,不影响网页浏览速度,也不影响IE的稳定性。
<2)特有的白名单功能,使得在关闭广告窗口时,不会关闭有用的弹出式窗口,从而做到既不漏杀,也不错杀。
<3)运行速度快,占用系统资源少。
从上面的地址将其下载并安装到系统中后,其将呆在系统托盘区中,在打开网页时,其将会一直监控着网页,一旦网友中有弹出式窗口,其将会直接将弹出式窗口禁止。
我们可以通过右击鼠标,在弹出的快捷菜单中选择“设置”,打开如图8所示的窗口。
图8弹出广告终极杀手设置窗口
在图8所示的窗口中,选择“白名单设置”,然后将那些需要弹出式窗口的网页添加进来,这样,这些网址中的弹出式窗口将会受到保护不被禁止了。
当然,可以对付弹出式广告的软件还有很多,例如:
1、广告窗口终结者2、AtGuard<守护者)3、ADfilter<广告过滤器)4、AdMuncher<广告杀手)5、AdSubtract 6、NoAds7、PopUpKiller,虽然名称不一样,它们的目的只有一个,不言而喻就是弹出式广告窗口。
取消ActiveX签证信息窗口 要取消ActiveX控制窗口的弹出,我们可以在图7所示的页面中,单击“弹出插件拦截”链接,在打开的页面中选择“拦截所有插件的弹出”,然后单击“设置”按钮即可,这样,我们以后就不会看到那些弹出的需要我们单击“是”或“否”的提示窗口了。
其它浏览器的应对 当然,现在浏览器产品也如同一些端口一样,琳琅满目,有些朋友可能就正在使用其它的一些浏览器产品,例如腾迅的TencentExplorer,MyIE、Opera等,那使用这些浏览器时,应该如何对付这些弹出的广告窗口呢?
1.TencentExplorer 如果你正使用TencentExplorer浏览器的话,可以按下面的方法来设置禁止弹出式窗口:
单击浏览器主窗口中的“工具→TE选项”,打开“选项”窗口,如图9所示:
图9TencentExplorer选项
在图9所示的窗口中,选择“不显示弹出式窗口”,再单击“确定”即可,这样就可以拦截一些广告窗口了,不过经笔者的测试,其拦截效果不如3721助手在IE中的拦截效果理想。
2.MyIEMyIE与TencentExplorer一样,也是一款多窗口的浏览器,故较受用户的青睐,如果在MyIE中遇到弹出式广告,你只需按下“Ctrl+Q”,就可以直接把它加入过滤器,此后,将再也不会受它骚扰了。
3.Opera Opera是一款内核脱离IE的小巧的浏览器,其自身具备了禁止弹出式窗口的功能,不过其默认是接收弹出式广告窗口的,我们只要按以下方法进行一下简单的设置即可:
单击“文件→快速参数→拒绝弹出式窗口”,选择“拒绝弹出式窗口”选项则可,这样设置后,一些弹出式窗口将会自动被Opera浏览器屏蔽掉。
看了上面笔者给出的与弹出式窗口、弹出式广告等作战方案,你是不是也想将自己的电脑中的弹出式窗口从屏幕上永远的拭去呢?
其实很简单,只要稍花一点时间即可,何乐而不为?
流氓网站IE恶意弹窗原理及解决办法
详细剖析流氓网站恶意弹窗发表于2007-10-3114:
03 转自360
相信有不少朋友都遇到过类似情况:
启动浏览器后即会自动弹出不相关的广告