作为Microsoft的最新建立动态Web网站的工具,ASP.NET相对于ASP和JSP在改变原始的Web编程方式方面有了长足的长进。它的代码与页面分离技术(CodeBehind)以及完善的Web服务器控件为程序员提供了一个更加符合传统编程的Web服务器端开发方式。但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方法来显示一个警告信息。

Private Sub btalert_Click(ByVal sender As System.object, ByVal e As System.EventArgs) Handles btalert.Click
  ’演示Response.Write方法和alert窗口。
  Response.Write(" ")
  End Sub

  (2) 使用RegisterXXX方法

  如果你观察Response.Write的生成HTML代码,你会发现Response.Write方法生成的代码是写到了HTML代码的最开始,即标签之前。此时,所有的 HTML对象都还没有生成,如果要想使用HTML内的对象,并与之交互,就会出现“找不到对象”的错误。因此,笔者推荐一个更加符合CodeBehind方式的方式----使用RegisterXXX方法。RegisterXXX包括:RegisterClientScriptBlock、RegisterStartupScript以及用于判断的IsStartupScriptRegistered函数。

  RegisterStartupScript 的原型是:

Overridable Public Sub RegisterStartupScript( _
  ByVal key As String, _
  ByVal script As String _
  )

  其中:key表示这个脚本的唯一标识,script是代表脚本的字符串。

  RegisterClientScriptBlock的原型与RegisterStartupScript相同,两个函数不同在于将其包含的脚本代码写入到HTML文件的不同位置。RegisterClientScriptBlock在 Page 对象的 元素的开始标记后立即发出客户端脚本,RegisterStartupScript则是在Page 对象的 元素的结束标记之前发出该脚本。如果你的脚本有与页面对象(doucument对象)进行交互的语句(这在我们后面的例子中看到),则推荐使用RegisterStartupScript,反之如果要想客户端脚本尽可能早的执行,则可以使用RegisterClientScriptBlock或Response.Write。

  为了防止在页面中反复加入脚本,在注册脚本时ReisterStartupScript/RegisterClientScriptBlock使用了key作为注册的Key,然后在程序中可以使用IsClientScriptBlockRegistered作判断。

  以下例子将使用RegisterClientScriptBlock来演示confirm的使用方法。

Private Sub btConfirm_Click(ByVal sender As System.object, ByVal e As System.EventArgs) Handles btConfirm.Click
  ’演示RegisterClientScriptBlock方法和confirm窗口
  If (Not IsClientScriptBlockRegistered("clientScript")) Then
  ‘判断是否已经加入了该脚本,没有则加入。
  Dim strScript As String
  strScript = " "
  ‘注册脚本
  RegisterClientScriptBlock("clientScript", strScript)
  ‘如果选择”否”,则继续向下执行。
  End If
  End Sub

  二、 弹出指定页面

  光有提示窗口还远远不能满足我们的要求,在程序中,我们常常需要弹出指定页面。此时可以使用JavaScript的window.open方法。配合前面的RegisterClientSciptBlock方法,我们就可以实现指定页面的弹出。

  以下代码展示了如何弹出指定页面:

Private Sub btWinOpen_Click(ByVal sender As System.object, ByVal e As System.EventArgs) Handles btWinOpen.Click
  ’使用window.open与registerStartupScript简单演示。
  If (Not IsClientScriptBlockRegistered("OpenScript")) Then
  ’判断是否已经加入了该脚本,没有则加入。
  Dim strScript As String = " "
  RegisterStartupScript("OpenScript", strScript)
  End If
  End Sub

  程序使用Window.open方法来弹出新的页面,它只一个参数:新的弹出窗口的URL地址。事实在window.open方法有多个参数,但这是javascipt的简单内容,我们将不会在这儿详细分说。如果你有相关的问题,请查询MSDN。

  这段程序在IE中直接使用一切正常。但如果你正在使用类如GoSurf、MyIE2、NetCapter之类的浏览器,那么,很不幸! 你将看不到弹出窗口。这就是我们将要讨论的弹出窗口过滤问题。

  三、 非标准IE浏览器对弹出窗口的过滤行为讨论

  广告窗口的泛滥使得不少网民不堪铺天盖地的广告骚扰纷纷放弃标准IE浏览器而使用诸如GoSurf、MyIE2、NetCapter这样的使用IE内核支持多页面并能自动屏蔽广告的软件。据说在即将发布的IE6 sp2中微软也将加入封杀广告窗口功能。这对大多数网民当然是件好事,可对于程序员而言,我们使用弹出窗口的方式与一般广告并无本质的不同,这样的窗口也会被弹出窗口管理器不分青红皂白的封杀,其结果当然是我们不愿看到的。有没有一个标准的方式能让窗口正常的弹出呢?这就要求我们了解浏览器封杀广告的原理。通常的广告封杀器使用以下三种方式进行广告过滤:

  (1)、基于窗口标题的封杀方式

  这种封杀方式的原理是定时检查所有的IE窗口标题,然后于已经有的列表(由程序维护的一个数组列表)来比较,如果有相同的,我们就关闭这个窗口。显然,这种方式有着诸多缺陷,它封杀了所有的弹出的窗口,管得太死,在程序真正使用的很少。不过,依据它进行的变形方式倒使用得相当的普遍。那就是,基于窗口标题名称的智能过滤技术,它根据弹出窗口的标题是否含有关于广告的关键字进行封杀,这为提高过滤效果作出了很好的探索。

  (2)、基于窗口类和位置的封杀方式

  经过分析发现正常浏览窗口的类名是IEFRAME和CabinetWClass,而广告窗口的类名是CabinetWClass。进一步分析发现:广告窗口的WorkerA类和Shell Docobject View类的rect.top的值是相同的,正常IE窗口的WorkerA类和Shell Docobject View类的rect.top的值是不相同的。根据以上两点就可以书写广告杀手程序了。 事实上,我对此程序的通用性持怀疑态度。因为笔者用Spy++分析发现,在Windows2000( 笔者使用的XX 作系统)中,IE窗口的类都为IEFrame。同时,由于Win2000是一个基于Unicode代码的XX 作系统,所以没有WorkerA类,而以WorkerW类取而代之。同时,也不存在rect.top不相同的情况,由于笔者没有WindowsXPXX 作系统,所以不能针对WindowsXP作进一步的试验。

  (3)、基于IE COM组件的封杀方式

  以上两种方式都是把IE窗口当作一个普通的Windows窗口对待,进行判断的。事实上,IE是一个典型的基于COM组件的浏览器,所有的基于IE内核的浏览器都是包装shdocvw.dll文件,然后书写相应的BHO代码。只有这样才能做到真正的控制IE浏览器,而不是方法一、二这样的隔靴搔痒。

  还有一种基于IE内核的弹出窗口封杀方法。它可以在弹出窗口打开之前加以拦截。其原理是:每当IE打开一个新的窗口时候都会触发NewWindow事件,执行OnNewWindow2([out] IDispatch*, [out] BOOL *bCancel)方法。重载此方法,判断打开新窗口事件是否发生在浏览页面已经下载完毕之后。如果是,说明是正常的弹出窗口,反之加以拦截。

  由于Gosurf这样的浏览器本身就重载了Shocvm.dll组件,所以使用第三种方法就自然成了顺理成章的事。然而在使用过程中有时也会发现,广告过滤不很完美,但原理基本如此。

ASP.NET弹出窗口技术之增加网站流量方法相关推荐

  1. ASP.NET 弹出窗口

    //ASP.NET 弹出窗口 //来源:http://hi.baidu.com/jordan51341/blog/item/1ab4f9ca8bba1243f21fe7da.html // /// & ...

  2. 精通ASP.NET中弹出窗口技术

    本文讨论如何以ASP.NET中的CodeBehind方式实现各种弹出窗口,实现与弹出窗口的交互.并探讨常用非标准IE浏览器对弹出的窗口的各种过滤行为及使用弹出窗口相应对策,以期给出使用弹出窗口的一个通 ...

  3. asp .NET弹出窗口 汇总(精华,麒麟创想)

    注: //关闭,父窗口弹出对话框,子窗口直接关闭 this.Response.Write("<script language=javascript>window.close(); ...

  4. swing退出子窗口事件_如何创建有效的退出弹出窗口?

    如何创建有效的退出弹出窗口? 下面的退出弹出窗口为电子邮件列表增加了4153个订阅者: 这个提供折扣的弹出窗口,帮助Storiarts在60天之内挽回了96个弃单客户,从而额外创造了5000美元的销售 ...

  5. php 弹窗代码大全,PHP_asp.net弹出窗口代码大全,//关闭,父窗口弹出对话框,子窗 - phpStudy...

    asp.net弹出窗口代码大全 //关闭,父窗口弹出对话框,子窗口直接关闭 this.Response.Write(""); //关闭,父窗口和子窗口都不弹出对话框,直接关闭 th ...

  6. vc 只有顶级窗口可以弹出窗口_如何在Mac上允许弹出窗口

    通常,我们尝试避免弹出窗口,但是有时您需要让它们通过.下面这样做的方法. 由于浏览器阻止了弹出窗口,您是否在macOS上遇到网站问题?幸运的是,您可以在计算机上的主要浏览器(例如Safari,Chro ...

  7. 如何控制弹出窗口的大小、尺寸、位置等的样式

    原文地址:http://www.leadto.com.cn/technews/316.html 1.最基本的弹出窗口代码 <SCRIPT LANGUAGE="javascript&qu ...

  8. 自动弹窗被拦截 html,用JavaScript检查弹出窗口是否被阻拦的方法

    JavaScript弹出窗口很讨厌,所有人都不喜欢弹出窗口,但很多网站认为弹出框口很有用,需要弹出窗口.对于开发这样的网站的程序员,他们有个棘手的问题,他们不知道这些弹出窗口是否被浏览器或各种浏览器插 ...

  9. Asp.Net中用javascript实现弹出窗口永远居中

    //Asp.Net中用javascript实现弹出窗口永远居中 function ShowDialog(url)  {    var  iWidth=600; //模态窗口宽度   var  iHei ...

最新文章

  1. docker --restart=always 参数 docker重启容器自动重启
  2. html div中怎么引入另一个html文件
  3. 爱,除了看怎么说,还要看怎么做 !
  4. 初中毕业学计算机在哪学,初中毕业要学计算机要去哪个里学呢
  5. ASP.NET事件顺序
  6. 【D】吴恩达的二八定律:80%的数据+20%的模型=更好的机器学习
  7. 杭电1492 The number of divisors(约数) about Humble Numbers
  8. Spring 初始化2次的问题
  9. intellij 出现“Usage of API documented as @since 1.8+”的解决办法
  10. 绘图工具 Gliffy 使用简介
  11. 飞思卡尔单片机RAM与flash相关问题
  12. 免费从麦田影视下载英文字幕电影方法图解#
  13. 配电网前推后带法求电力系统潮流(PythonMatlab实现)
  14. 计算机vb基础知识,计算机VB基础知识---知识导学.doc
  15. 【web素材】03-24款后台管理系统网站模板
  16. mc服务器音乐文件夹在哪,我的世界 自定义音乐添加方法 MC怎么自定义音乐
  17. ArchieOpenGL教程第11课:使用位图字体 在屏幕上显示字体
  18. moment格式转换成年月日时分秒
  19. 寻求激光雕刻机软件开发合作。有意者请联系
  20. Python 能说话吗?调用Windows系统自带语音合成

热门文章

  1. oracle 统计信息字典表,Oracle数据字典表查询
  2. python备份文件代码_python备份文件以及mysql数据库的脚本代码
  3. python 英文字符频率统计 采用降序方式输出_Python读取英文文件并记录每个单词出现次数后降序输出示例...
  4. python wxpython plt_wxpython和多个面板中的多个plt图
  5. Window10 64位,通过Python读取.mif, shp文件
  6. Linux那些事儿之我是Sysfs(1)sysfs初探
  7. POJ - 1986 Distance Queries 倍增求LCA
  8. 【TensorFlow2.0】(3) 索引与切片操作
  9. 计算机社团部门职责,部门职责
  10. 光耦p621引脚图_开关电源中光耦电路的设计与优点