개요: 이 문서에서는 ASP.NET에서 CodeBehind를 사용하여 다양한 팝업 창을 구현하고 팝업 창과 상호 작용하는 방법을 설명합니다. 또한 팝업 창 사용을 위한 보편적이고 더 나은 솔루션을 제공하기 위해 일반적으로 사용되는 팝업 창에 대해 일반적으로 사용되는 비표준 IE 브라우저의 다양한 필터링 동작과 팝업 창 사용에 대한 해당 대책에 대해 논의합니다.
키워드: ASP.NET, CodeBehind, 필터링, COM 인터페이스, JavaScript, 바인딩
동적 웹 사이트를 구축하기 위한 Microsoft의 최신 도구인 ASP.NET은 ASP 및 JSP에 비해 원래의 웹 프로그래밍 방법을 변경하는 데 큰 진전을 이루었습니다. 코드 및 페이지 분리 기술(CodeBehind)과 완전한 웹 서버 제어는 프로그래머에게 기존 프로그래밍에 더 가까운 웹 서버 측 개발 방법을 제공합니다. 그러나 웹 프로그래밍에는 여전히 기존 프로그래밍과 다른 특성이 있습니다. 이러한 특성으로 인해 ASP.NET 프로그래밍에서는 프로그램 요구 사항을 완료하기 위해 몇 가지 특별한 기술을 사용해야 합니다. 상당수의 프로그래밍 서적에서는 팝업 창에 대해 언급하지 않거나 한 마디로 언급하고 있어 팝업 창 사용의 거대한 세계를 이해하지 못하는 것 같습니다. 이 문서에서는 팝업 창을 사용할 때 발생하는 대부분의 문제를 해결합니다.
웹 사이트 액세스의 동시성과 처리량을 향상시키기 위해 ASP.NET은 다른 서버 스크립트와 마찬가지로 클라이언트 측 스크립트를 사용하여 서버에 대한 부담을 줄입니다. ASP.NET은 현재까지(버전 1.1) 팝업 창을 직접 지원하지 않으며 클라이언트 측 팝업 창은 JavaScript(또는 VBScript)를 통해 사용해야 합니다.
1. CodeBehind에서 경고 창 및 클라이언트측 스크립트를 사용하는 방법
브라우저에서 가장 간단한 경고 창을 표시하려면 다음 JavaScript 문을 사용할 수 있습니다.
window.alert([sMessage])
여기서 sMessage는 프롬프트 메시지입니다. 불행하게도 이러한 팝업 창에는 "확인" 버튼만 있고 프롬프트로만 사용할 수 있습니다. 레코드를 삭제할 때 쿼리 팝업 창을 표시하려면 다음을 사용해야 합니다.
bConfirmed = window.confirm([sMessage])
여기서: bConfirmed는 반환 값이고 sMessage는 프롬프트 메시지입니다. 이 팝업 창에는 "OK" 또는 "Give Up"이라는 두 가지 옵션이 있으며, 선택한 반환 값은 코드가 판단할 수 있도록 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) btAlert.Click을 처리합니다.
' Response.Write 메서드 및 경고 창을 보여줍니다.
응답.쓰기(" ")
End Sub
(2) RegisterXXX 메서드를 사용합니다.
Response.Write로 생성된 HTML 코드를 보면 Response.Write 메서드로 생성된 코드가 HTML 코드의 맨 처음, 즉 태그. 현재 HTML 개체가 아직 모두 생성되지 않았습니다. HTML에서 개체를 사용하고 상호 작용하려는 경우 "개체를 찾을 수 없습니다" 오류가 발생합니다. 따라서 저자는 RegisterXXX 메서드를 사용하여 CodeBehind 메서드에 더 가까운 방법을 권장합니다. RegisterXXX에는 RegisterClientScriptBlock, RegisterStartupScript 및 판단을 위한 IsStartupScriptRegistered 함수가 포함되어 있습니다.
RegisterStartupScript의 프로토타입은 다음과 같습니다:
재정의 가능한 Public Sub RegisterStartupScript( _
ByVal 키를 문자열로, _
ByVal 스크립트를 문자열로_
)
여기서, key는 이 스크립트의 고유 식별자를 나타내고 script는 스크립트를 나타내는 문자열입니다.
RegisterClientScriptBlock의 프로토타입은 RegisterStartupScript와 동일합니다. 두 함수의 차이점은 포함된 스크립트 코드가 HTML 파일의 다른 위치에 기록된다는 것입니다. RegisterClientScriptBlock은 Page 개체 요소의 여는 태그 바로 뒤에 클라이언트 스크립트를 내보내고, RegisterStartupScript는 Page 개체 요소의 닫는 태그 앞에 스크립트를 내보냅니다. 스크립트에 페이지 개체(문서 개체)와 상호 작용하는 명령문이 있는 경우(이는 이후 예제에서 볼 수 있음), 반면에 클라이언트 스크립트를 최대한 빨리 실행하려면 RegisterStartupScript를 사용하는 것이 좋습니다. 가능하다면 RegisterClientScriptBlock을 사용하거나 Response.Write를 사용할 수 있습니다.
페이지에 스크립트가 반복적으로 추가되는 것을 방지하기 위해 ReisterStartupScript/RegisterClientScriptBlock은 스크립트 등록 시 키를 등록 키로 사용하며, 이후 IsClientScriptBlockRegistered를 사용하여 프로그램에서 판단을 내릴 수 있습니다.
다음 예에서는 RegisterClientScriptBlock을 사용하여 확인 사용법을 보여줍니다.
Private Sub btConfirm_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) btConfirm.Click
'RegisterClientScriptBlock 메서드 시연 및 windowIf 확인
(Not IsClientScriptBlockRegistered("clientScript")) Then 처리
'스크립트가 추가되었는지 확인하고, 없으면 추가하세요.
strScript를 문자열로 희미하게 만들기
strScript = " "
'스크립트 등록RegisterClientScriptBlock("clientScript", strScript)
'아니요'를 선택하면 계속 실행됩니다.
End If
End Sub
2. 지정된 페이지를 팝업하는
것만으로는 우리의 요구 사항을 충족하지 못합니다. 프로그램에서 지정된 페이지를 팝업해야 하는 경우가 많습니다. 이때 JavaScript의 window.open 메소드를 사용할 수 있습니다. 이전 RegisterClientSciptBlock 메서드를 사용하면 지정된 페이지를 팝업할 수 있습니다.
다음 코드는 지정된 페이지를 팝업하는 방법을 보여줍니다.
Private Sub btWinOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) btWinOpen.Click을 처리합니다.
'간단한 데모를 위해 window.open 및 RegisterStartupScript를 사용합니다.
If (IsClientScriptBlockRegistered("OpenScript")가 아님) Then
'스크립트가 추가되었는지 확인하고, 없으면 추가하세요.
Dim strScript As String = " "
RegisterStartupScript("OpenScript", strScript)
종료 조건
End Sub
프로그램은 Window.open 메서드를 사용하여 새 페이지를 팝업합니다. 여기에는 새 팝업 창의 URL 주소라는 매개 변수가 하나만 있습니다. window.open 메소드에는 여러 매개변수가 있는 것으로 밝혀졌지만 이는 javascipt의 단순한 문제이므로 여기서 자세히 설명하지 않겠습니다. 관련 질문이 있는 경우 MSDN을 확인하세요.
이 프로그램은 IE에서 직접 사용할 때 잘 작동합니다. 하지만 GoSurf, MyIE2, NetCapter 등과 같은 브라우저를 사용하고 있다면 불행하게도! 팝업이 표시되지 않습니다. 이것이 팝업 필터링에 대해 논의할 내용입니다.
3. 비표준 IE 브라우저의 팝업 창 필터링 동작에 대해 논의합니다.
광고 창의 확산으로 인해 많은 네티즌들은 견딜 수 없이 표준 IE 브라우저를 포기하고 GoSurf, MyIE2, IE 커널을 사용하여 여러 페이지를 지원하는 NetCapter와 자동으로 광고를 차단하는 소프트웨어입니다. 마이크로소프트는 곧 출시될 IE6 sp2에도 광고창 차단 기능을 추가할 예정이라고 한다. 이는 물론 대부분의 인터넷 사용자에게는 좋은 일이지만, 프로그래머들에게는 팝업창을 사용하는 방식이 일반 광고와 근본적으로 다르지 않습니다. 이러한 창 역시 팝업창 관리자에 의해 무차별적으로 차단됩니다. 물론 우리는 그것을 보고 싶지 않습니다. 창이 정상적으로 팝업되도록 하는 표준 방법이 있습니까? 이를 위해서는 브라우저 차단 광고의 원리를 이해해야 합니다. 일반적인 광고 차단기는 광고를 필터링하기 위해 다음 세 가지 방법을 사용합니다
. (1) 창 제목 기반 차단 방법
이 차단 방법의 원리는 모든 IE 창 제목을 정기적으로 확인한 후 기존 목록(에서 관리하는 목록)을 기준으로 필터링하는 것입니다. 프로그램). 배열 목록)을 비교하여 동일한 경우 이 창을 닫습니다. 분명히 이 방법에는 많은 결함이 있습니다. 모든 팝업 창을 차단하고 프로그램에서 거의 사용되지 않습니다. 그러나 이를 기반으로 한 변형 방법은 꽤 일반적이다. 즉, 창 제목 이름을 기반으로 한 지능형 필터링 기술은 제목에 광고와 관련된 키워드가 포함되어 있는지 여부에 따라 팝업 창을 차단하는 기술로 필터링 효과를 향상시키는 좋은 방법입니다.
(2) 창 클래스 및 위치에 따른 차단 방법
분석 결과 일반 브라우징 창의 클래스 이름은 IEFRAME과 CabinetWClass, 광고 창의 클래스 이름은 CabinetWClass인 것으로 나타났다. 추가 분석 결과 광고 창의 WorkerA 클래스와 Shell DocObject View 클래스의 ret.top 값은 동일하지만 일반 IE 창의 WorkerA 클래스와 Shell DocObject View 클래스는 다릅니다. 위의 두 가지 점을 바탕으로 광고 킬러 프로그램을 작성할 수 있습니다. 사실 저는 이 프로그램의 일반화 가능성에 회의적입니다. 저자가 Spy++를 사용하여 분석한 결과 Windows2000(저자가 사용하는 운영체제)에서는 IE 윈도우의 클래스가 모두 IEFrame이라는 사실을 알아냈기 때문이다. 동시에, Win2000은 유니코드 코드 기반의 운영 체제이므로 WorkerA 클래스가 없고 WorkerW 클래스로 대체됩니다. 동시에 ret.top이 다른 상황은 없습니다. 작성자가 WindowsXP 운영 체제를 가지고 있지 않기 때문에 WindowsXP에서 더 이상의 실험을 수행할 수는 없습니다.
(3) IE COM 구성 요소를 기반으로 한 차단 방법
위의 두 가지 방법은 IE 창을 일반 Windows 창으로 간주하여 판단합니다. 실제로 IE는 COM 구성 요소를 기반으로 하는 일반적인 브라우저입니다. IE 핵심 패키지를 기반으로 하는 모든 브라우저는 shdocvw.dll 파일에 해당하는 BHO 코드를 작성합니다. 이런 방식으로만 우리는 방법 1과 2처럼 겉만 긁는 대신 IE 브라우저를 진정으로 제어할 수 있습니다.
IE 커널을 기반으로 한 팝업창 차단 방법도 있습니다. 팝업이 열리기 전에 차단합니다. 원칙은 다음과 같습니다. IE가 새 창을 열 때마다 NewWindow 이벤트가 트리거되고 OnNewWindow2([out] IDispatch*, [out] BOOL *bCancel) 메서드가 실행됩니다. 검색 페이지가 다운로드된 후 새 창 열기 이벤트가 발생하는지 여부를 확인하려면 이 메서드를 오버로드하세요. 그렇다면 정상적인 팝업 창임을 의미하고, 그렇지 않으면 가로채게 됩니다.
Gosurf와 같은 브라우저는 Shocvm.dll 구성 요소를 오버로드하므로 세 번째 방법을 사용하는 것이 당연합니다. 그러나 사용 중에 광고 필터링이 완벽하지 않은 경우가 있지만 원칙은 기본적으로 동일합니다.