作為Microsoft的最新建立動態Web網站的工具
ASP
NET相對於ASP和JSP在改變原始的Web編程方式方面有了長足的長進
它的代碼與頁面分離技術(CodeBehind)以及完善的Web服務器控件為程序員提供了一個更加符合傳統編程的Web服務器端開發方式
但Web編程還是有著與傳統編程不相同的特點
這些特點決定了ASP
NET編程中必須以一些特殊的技巧來完成程序要求
彈出窗口正是這類編程方式的代表
相當多的編程書籍對彈出窗口采取緘默或者一語帶過
似乎看不過彈出窗口的巨大使用天地
本文將為你解開彈出窗口使用中的大多數問題
為了提高網站的訪問的並發度和吞吐量
與其它服務器腳本一樣
ASP
NET同樣使用了客戶端腳本來減輕服務器的壓力
ASP
NET到現在(
版)為止並不直接支持彈出窗口
必須通過JavaScript(或VBScript)來使用客戶端彈出窗口
一
警告窗口與在CodeBehind中使用客戶端腳本的方式
要在浏覽器中彈出一個最簡單的警告窗口
可以使用JavaScript語句
window
alert( [sMessage])
其中
sMessage是提示信息
可惜
這樣的彈出窗口是只有一個
確定
按鈕
只能起到提示作用
如果我們要在刪除記錄時候彈出一個詢問的彈出窗口
此時你需要使用
bConfirmed = nfirm( [sMessage])
其中
bConfirmed是返回值
sMessage是提示信息
這個彈出窗口有兩種選擇
確定
或
放棄
其選擇的返回值放在bConfirmed中
可供代碼作出判斷
為了提高代碼的可重用性與可讀性
應當使JavaScript與Codehind相互溶合
通常有兩種方式可以達到這樣的效果
(
) 使用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
(
) 使用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
MyIE
NetCapter之類的浏覽器
那麼
很不幸! 你將看不到彈出窗口
這就是我們將要討論的彈出窗口過濾問題
三
非標准IE浏覽器對彈出窗口的過濾行為討論
廣告窗口的泛濫使得不少網民不堪鋪天蓋地的廣告騷擾紛紛放棄標准IE浏覽器而使用諸如GoSurf
MyIE
NetCapter這樣的使用IE內核支持多頁面並能自動屏蔽廣告的軟件
據說在即將發布的IE
sp
中微軟也將加入封殺廣告窗口功能
這對大多數網民當然是件好事
可對於程序員而言
我們使用彈出窗口的方式與一般廣告並無本質的不同
這樣的窗口也會被彈出窗口管理器不分青紅皂白的封殺
其結果當然是我們不願看到的
有沒有一個標准的方式能讓窗口正常的彈出呢?這就要求我們了解浏覽器封殺廣告的原理
通常的廣告封殺器使用以下三種方式進行廣告過濾
(
)
基於窗口標題的封殺方式
這種封殺方式的原理是定時檢查所有的IE窗口標題
然後於已經有的列表(由程序維護的一個數組列表)來比較
如果有相同的
我們就關閉這個窗口
顯然
這種方式有著諸多缺陷
它封殺了所有的彈出的窗口
管得太死
在程序真正使用的很少
不過
依據它進行的變形方式倒使用得相當的普遍
那就是
基於窗口標題名稱的智能過濾技術
它根據彈出窗口的標題是否含有關於廣告的關鍵字進行封殺
這為提高過濾效果作出了很好的探索
(
)
基於窗口類和位置的封殺方式
經過分析發現正常浏覽窗口的類名是IEFRAME和CabinetWClass
而廣告窗口的類名是CabinetWClass
進一步分析發現
廣告窗口的WorkerA類和Shell DocObject View類的rect
top的值是相同的
正常IE窗口的WorkerA類和Shell DocObject View類的rect
top的值是不相同的
根據以上兩點就可以書寫廣告殺手程序了
事實上
我對此程序的通用性持懷疑態度
因為筆者用Spy++分析發現
在Windows
( 筆者使用的操作系統)中
IE窗口的類都為IEFrame
同時
由於Win
是一個基於Unicode代碼的操作系統
所以沒有WorkerA類
而以WorkerW類取而代之
同時
也不存在rect
top不相同的情況
由於筆者沒有WindowsXP操作系統
所以不能針對WindowsXP作進一步的試驗
(
)
基於IE COM組件的封殺方式
以上兩種方式都是把IE窗口當作一個普通的Windows窗口對待
進行判斷的
事實上
IE是一個典型的基於COM組件的浏覽器
所有的基於IE內核的浏覽器都是包裝shdocvw
dll文件
然後書寫相應的BHO代碼
只有這樣才能做到真正的控制IE浏覽器
而不是方法一
二這樣的隔靴搔癢
還有一種基於IE內核的彈出窗口封殺方法
它可以在彈出窗口打開之前加以攔截
其原理是
每當IE打開一個新的窗口時候都會觸發NewWindow事件
執行OnNewWindow
([out] IDispatch*
[out] BOOL *bCancel)方法
重載此方法
判斷打開新窗口事件是否發生在浏覽頁面已經下載完畢之後
如果是
說明是正常的彈出窗口
反之加以攔截
由於Gosurf這樣的浏覽器本身就重載了Shocvm
dll組件
所以使用第三種方法就自然成了順理成章的事
然而在使用過程中有時也會發現
廣告過濾不很完美
但原理基本如此
From:http://tw.wingwit.com/Article/program/net/201311/12987.html