怎么用asp写一个自动弹出页面

[复制链接]
查看11 | 回复1 | 2011-8-24 09:02:58 | 显示全部楼层 |阅读模式
回复

使用道具 举报

千问 | 2011-8-24 09:02:58 | 显示全部楼层
要在浏览器中弹出一个最简单的警告窗口,可以使用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)‘如果选择”否”,则继续向下执行。EndIfEndSub一、弹出指定页面光有提示窗口还远远不能满足我们的要求,在程序中,我们常常需要弹出指定页面。此时可以使用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)、基于窗口标题的封杀方式在参考文献[1]中给出了一种基于窗口标题过滤的封杀方式。它的原理是定时检查所有的IE窗口标题,然后于已经有的列表(由程序维护的一个数组列表)来比较,如果有相同的,我们就关闭这个窗口。显然,这种方式有着诸多缺陷,它封杀了所有的弹出的窗口,管得太死,在程序真正使用的很少。不过,依据它进行的变形方式倒使用得相当的普遍。那就是,基于窗口标题名称的智能过滤技术,它根据弹出窗口的标题是否含有关于广告的关键字进行封杀,这为提高过滤效果作出了很好的探索。(2)、基于窗口类和位置的封杀方式参考文献[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浏览器,而不是方法一、二这样的隔靴搔痒。参考文献[3]给出了一种基于IE内核的弹出窗口封杀方法。它可以在弹出窗口打开之前加以拦截。其原理是:每当IE打开一个新的窗口时候都会触发NewWindow事件,执行OnNewWindow2([out]IDispatch*,[out]BOOL*bCancel)方法。重载此方法,判断打开新窗口事件是否发生在浏览页面已经下载完毕之后。如果是,说明是正常的弹出窗口,反之加以拦截。由于Gosurf这样的浏览器本身就重载了Shocvm.dll组件,所以使用第三种方法就自然成了顺理成章的事。然而在使用过程中有时也会发现,广告过滤不很完美,但原理基本如此。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行