熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

精通ASP.NET中彈出窗口技術

2013-11-13 10:14:05  來源: .NET編程 
    作為Microsoft的最新建立動態Web網站的工具ASPNET相對於ASP和JSP在改變原始的Web編程方式方面有了長足的長進它的代碼與頁面分離技術(CodeBehind)以及完善的Web服務器控件為程序員提供了一個更加符合傳統編程的Web服務器端開發方式但Web編程還是有著與傳統編程不相同的特點這些特點決定了ASPNET編程中必須以一些特殊的技巧來完成程序要求彈出窗口正是這類編程方式的代表相當多的編程書籍對彈出窗口采取緘默或者一語帶過似乎看不過彈出窗口的巨大使用天地本文將為你解開彈出窗口使用中的大多數問題
    為了提高網站的訪問的並發度和吞吐量與其它服務器腳本一樣ASPNET同樣使用了客戶端腳本來減輕服務器的壓力ASPNET到現在(版)為止並不直接支持彈出窗口必須通過JavaScript(或VBScript)來使用客戶端彈出窗口
    一 警告窗口與在CodeBehind中使用客戶端腳本的方式
    要在浏覽器中彈出一個最簡單的警告窗口可以使用JavaScript語句
    windowalert( [sMessage])
    其中sMessage是提示信息可惜這樣的彈出窗口是只有一個確定按鈕只能起到提示作用如果我們要在刪除記錄時候彈出一個詢問的彈出窗口此時你需要使用
    bConfirmed = nfirm( [sMessage])
    其中bConfirmed是返回值sMessage是提示信息這個彈出窗口有兩種選擇確定放棄其選擇的返回值放在bConfirmed中可供代碼作出判斷
    為了提高代碼的可重用性與可讀性應當使JavaScript與Codehind相互溶合通常有兩種方式可以達到這樣的效果
    () 使用ResponseWrite方法
    使用ResponseWrite方法早在ASP時代就已經被支持了它可以把代碼寫到客戶端是一種相當方便且直觀的方法以下代碼演示了如何使用ResponseWrite方法來顯示一個警告信息
    Private Sub btAlert_Click(ByVal sender As SystemObject ByVal e As SystemEventArgs) Handles btAlertClick
    演示ResponseWrite方法和alert窗口
    ResponseWrite( )
    End Sub
    () 使用RegisterXXX方法
    如果你觀察ResponseWrite的生成HTML代碼你會發現ResponseWrite方法生成的代碼是寫到了HTML代碼的最開始即標簽之前此時所有的 HTML對象都還沒有生成如果要想使用HTML內的對象並與之交互就會出現找不到對象的錯誤因此筆者推薦一個更加符合CodeBehind方式的方式使用RegisterXXX方法RegisterXXX包括RegisterClientScriptBlockRegisterStartupScript以及用於判斷的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或ResponseWrite
    為了防止在頁面中反復加入腳本在注冊腳本時ReisterStartupScript/RegisterClientScriptBlock使用了key作為注冊的Key然後在程序中可以使用IsClientScriptBlockRegistered作判斷
    以下例子將使用RegisterClientScriptBlock來演示confirm的使用方法
    Private Sub btConfirm_Click(ByVal sender As SystemObject ByVal e As SystemEventArgs) Handles btConfirmClick
    演示RegisterClientScriptBlock方法和confirm窗口
    If (Not IsClientScriptBlockRegistered(clientScript)) Then
    判斷是否已經加入了該腳本沒有則加入
    Dim strScript As String
    strScript =
    注冊腳本
    RegisterClientScriptBlock(clientScript strScript)
    如果選擇則繼續向下執行
    End If
    End Sub
    二 彈出指定頁面
    光有提示窗口還遠遠不能滿足我們的要求在程序中我們常常需要彈出指定頁面此時可以使用JavaScript的windowopen方法配合前面的RegisterClientSciptBlock方法我們就可以實現指定頁面的彈出
    以下代碼展示了如何彈出指定頁面:
    Private Sub btWinOpen_Click(ByVal sender As SystemObject ByVal e As SystemEventArgs) Handles btWinOpenClick
    使用windowopen與registerStartupScript簡單演示
    If (Not IsClientScriptBlockRegistered(OpenScript)) Then
    判斷是否已經加入了該腳本沒有則加入
    Dim strScript As String =
    RegisterStartupScript(OpenScript strScript)
    End If
    End Sub
    程序使用Windowopen方法來彈出新的頁面它只一個參數新的彈出窗口的URL地址事實在windowopen方法有多個參數但這是javascipt的簡單內容我們將不會在這兒詳細分說如果你有相關的問題請查詢MSDN
    這段程序在IE中直接使用一切正常但如果你正在使用類如GoSurfMyIENetCapter之類的浏覽器那麼很不幸! 你將看不到彈出窗口這就是我們將要討論的彈出窗口過濾問題
    三 非標准IE浏覽器對彈出窗口的過濾行為討論
    廣告窗口的泛濫使得不少網民不堪鋪天蓋地的廣告騷擾紛紛放棄標准IE浏覽器而使用諸如GoSurfMyIENetCapter這樣的使用IE內核支持多頁面並能自動屏蔽廣告的軟件據說在即將發布的IE sp中微軟也將加入封殺廣告窗口功能這對大多數網民當然是件好事可對於程序員而言我們使用彈出窗口的方式與一般廣告並無本質的不同這樣的窗口也會被彈出窗口管理器不分青紅皂白的封殺其結果當然是我們不願看到的有沒有一個標准的方式能讓窗口正常的彈出呢?這就要求我們了解浏覽器封殺廣告的原理通常的廣告封殺器使用以下三種方式進行廣告過濾
    (基於窗口標題的封殺方式
    這種封殺方式的原理是定時檢查所有的IE窗口標題然後於已經有的列表(由程序維護的一個數組列表)來比較如果有相同的我們就關閉這個窗口顯然這種方式有著諸多缺陷它封殺了所有的彈出的窗口管得太死在程序真正使用的很少不過依據它進行的變形方式倒使用得相當的普遍那就是基於窗口標題名稱的智能過濾技術它根據彈出窗口的標題是否含有關於廣告的關鍵字進行封殺這為提高過濾效果作出了很好的探索
    (基於窗口類和位置的封殺方式
    經過分析發現正常浏覽窗口的類名是IEFRAME和CabinetWClass而廣告窗口的類名是CabinetWClass進一步分析發現廣告窗口的WorkerA類和Shell DocObject View類的recttop的值是相同的正常IE窗口的WorkerA類和Shell DocObject View類的recttop的值是不相同的根據以上兩點就可以書寫廣告殺手程序了 事實上我對此程序的通用性持懷疑態度因為筆者用Spy++分析發現在Windows( 筆者使用的操作系統)中IE窗口的類都為IEFrame同時由於Win是一個基於Unicode代碼的操作系統所以沒有WorkerA類而以WorkerW類取而代之同時也不存在recttop不相同的情況由於筆者沒有WindowsXP操作系統所以不能針對WindowsXP作進一步的試驗
    (基於IE COM組件的封殺方式
    以上兩種方式都是把IE窗口當作一個普通的Windows窗口對待進行判斷的事實上IE是一個典型的基於COM組件的浏覽器所有的基於IE內核的浏覽器都是包裝shdocvwdll文件然後書寫相應的BHO代碼只有這樣才能做到真正的控制IE浏覽器而不是方法一二這樣的隔靴搔癢
    還有一種基於IE內核的彈出窗口封殺方法它可以在彈出窗口打開之前加以攔截其原理是每當IE打開一個新的窗口時候都會觸發NewWindow事件執行OnNewWindow([out] IDispatch* [out] BOOL *bCancel)方法重載此方法判斷打開新窗口事件是否發生在浏覽頁面已經下載完畢之後如果是說明是正常的彈出窗口反之加以攔截
    由於Gosurf這樣的浏覽器本身就重載了Shocvmdll組件所以使用第三種方法就自然成了順理成章的事然而在使用過程中有時也會發現廣告過濾不很完美但原理基本如此
From:http://tw.wingwit.com/Article/program/net/201311/12987.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.