บทคัดย่อ: บทความนี้อธิบายวิธีการใช้หน้าต่างป๊อปอัปต่างๆ โดยใช้ CodeBehind ใน ASP.NET และโต้ตอบกับหน้าต่างป๊อปอัป นอกจากนี้ยังกล่าวถึงพฤติกรรมการกรองต่างๆ ของเบราว์เซอร์ 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 เป็นข้อความแจ้ง หน้าต่างป๊อปอัปนี้มีสองตัวเลือก: "ตกลง" หรือ "ยอมแพ้" และค่าที่ส่งคืนของตัวเลือกนั้นจะถูกวางไว้ใน bConfirmed เพื่อให้โค้ดใช้ในการตัดสิน
เพื่อปรับปรุงความสามารถในการใช้ซ้ำและความสามารถในการอ่านโค้ด ควรรวม JavaScript และ Codehind เข้าด้วยกัน โดยปกติมีสองวิธีในการบรรลุผลนี้
(1) ใช้วิธี Response.Write:
การใช้วิธี Response.Write ได้รับการสนับสนุนตั้งแต่ยุค ASP สามารถเขียนโค้ดไปยังไคลเอนต์ได้ ซึ่งเป็นวิธีที่สะดวกและใช้งานง่ายมาก รหัสต่อไปนี้สาธิตวิธีการใช้เมธอด Response.Write เพื่อแสดงข้อความเตือน
ส่วนตัวย่อย btAlert_Click (ผู้ส่ง ByVal As System.Object, ByVal e As System.EventArgs) จัดการ btAlert.Click
' สาธิตวิธีการ Response.Write และหน้าต่างการแจ้งเตือน
ตอบกลับเขียน(" ")
End Sub
(2) ใช้เมธอด RegisterXXX
หากคุณสังเกตโค้ด HTML ที่สร้างโดย Response.Write คุณจะพบว่าโค้ดที่สร้างโดยเมธอด Response.Write จะถูกเขียนไว้ที่ตอนต้นของโค้ด HTML นั่นคือ ก่อน แท็ก ในขณะนี้ ยังไม่ได้สร้างออบเจ็กต์ HTML ทั้งหมด หากคุณต้องการใช้และโต้ตอบกับออบเจ็กต์ใน HTML ข้อผิดพลาด "ไม่พบออบเจ็กต์" จะเกิดขึ้น ดังนั้นผู้เขียนแนะนำวิธีที่สอดคล้องกับวิธี CodeBehind มากกว่าโดยใช้วิธี RegisterXXX RegisterXXX ประกอบด้วย: RegisterClientScriptBlock, RegisterStartupScript และฟังก์ชัน IsStartupScriptRegistered เพื่อการตัดสิน
ต้นแบบของ RegisterStartupScript คือ:
Overridable Public Sub RegisterStartupScript( _
คีย์ ByVal เป็นสตริง _
สคริปต์ ByVal เป็นสตริง _
)
โดยที่: key แสดงถึงตัวระบุเฉพาะของสคริปต์นี้ และ script คือสตริงที่แสดงถึงสคริปต์
ต้นแบบของ RegisterClientScriptBlock นั้นเหมือนกับ RegisterStartupScript ความแตกต่างระหว่างทั้งสองฟังก์ชันคือโค้ดสคริปต์ที่มีอยู่นั้นถูกเขียนไปยังตำแหน่งที่แตกต่างกันในไฟล์ HTML RegisterClientScriptBlock จะปล่อยสคริปต์ไคลเอ็นต์ทันทีหลังจากแท็กเปิดขององค์ประกอบของวัตถุ Page และ RegisterStartupScript จะปล่อยสคริปต์ก่อนแท็กปิดขององค์ประกอบของวัตถุ Page หากสคริปต์ของคุณมีคำสั่งที่โต้ตอบกับออบเจ็กต์เพจ (ออบเจ็กต์เอกสาร) (ซึ่งจะเห็นได้ในตัวอย่างต่อๆ ไป) ขอแนะนำให้ใช้ RegisterStartupScript ในทางกลับกัน หากคุณต้องการให้สคริปต์ไคลเอ็นต์ถูกดำเนินการโดยเร็วที่สุด เป็นไปได้ คุณสามารถใช้ RegisterClientScriptBlock หรือ Response.Write
เพื่อป้องกันการเพิ่มสคริปต์ซ้ำไปยังเพจ ReisterStartupScript/RegisterClientScriptBlock จะใช้คีย์เป็นคีย์การลงทะเบียนเมื่อลงทะเบียนสคริปต์ จากนั้น IsClientScriptBlockRegistered จะสามารถใช้เพื่อตัดสินในโปรแกรมได้
ตัวอย่างต่อไปนี้จะใช้ RegisterClientScriptBlock เพื่อสาธิตการใช้การยืนยัน
ย่อยส่วนตัว btConfirm_Click (ผู้ส่ง ByVal As System.Object, ByVal e As System.EventArgs) จัดการ btConfirm. คลิก
'สาธิตวิธี RegisterClientScriptBlock และยืนยัน windowIf
(ไม่ใช่ IsClientScriptBlockRegistered ("clientScript")) จากนั้น
'ตรวจสอบว่ามีการเพิ่มสคริปต์หรือไม่ ถ้าไม่ใช่ ให้เพิ่มเข้าไป'
Dim strScript เป็นสตริง
strScript = " "
'ลงทะเบียน scriptRegisterClientScriptBlock("clientScript", strScript)
'หากคุณเลือก "ไม่" ให้ดำเนินการต่อไป
End If
End Sub
2. ป๊อปอัปหน้าที่ระบุ
เพียงมีหน้าต่างแจ้งก็ไม่ตรงตามข้อกำหนดของเรา ในขณะนี้ คุณสามารถใช้เมธอด window.open ของ JavaScript ได้ ด้วยเมธอด RegisterClientSciptBlock ก่อนหน้านี้ เราสามารถเปิดเพจที่ระบุได้
รหัสต่อไปนี้แสดงวิธีการเปิดเพจที่ระบุ:
Private Sub btWinOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btWinOpen.Click
'Use window.open and registerStartupScript for a simple demos.
ถ้า (ไม่ใช่ IsClientScriptBlockRegistered ("OpenScript")) จากนั้น
'ตรวจสอบว่ามีการเพิ่มสคริปต์หรือไม่ ถ้าไม่ใช่ ให้เพิ่มเข้าไป'
Dim strScript As String = " "
ลงทะเบียนStartupScript("OpenScript", strScript)
สิ้นสุดถ้า
End Sub
ใช้เมธอด Window.open เพื่อแสดงเพจใหม่ซึ่งมีพารามิเตอร์เพียงตัวเดียว: ที่อยู่ URL ของหน้าต่างป๊อปอัปใหม่ ปรากฎว่าเมธอด window.open มีหลายพารามิเตอร์ แต่นี่เป็นเรื่องง่ายๆ ของ javacipt และเราจะไม่ลงรายละเอียดที่นี่ หากคุณมีคำถามที่เกี่ยวข้อง โปรดตรวจสอบ MSDN
โปรแกรมนี้ทำงานได้ดีเมื่อใช้กับ IE โดยตรง แต่ถ้าคุณใช้เบราว์เซอร์เช่น GoSurf, MyIE2, NetCapter ฯลฯ น่าเสียดาย! คุณจะไม่เห็นป๊อปอัป นี่คือสิ่งที่เราจะพูดถึงเกี่ยวกับการกรองป๊อปอัป
3. หารือเกี่ยวกับพฤติกรรมการกรองหน้าต่างป๊อปอัปของเบราว์เซอร์ IE ที่ไม่ได้มาตรฐาน
การแพร่กระจายของหน้าต่างโฆษณาทำให้ชาวเน็ตจำนวนมากทนไม่ไหวที่จะถูกคุกคามจากโฆษณา พวกเขาเลิกใช้เบราว์เซอร์ IE มาตรฐานและเบราว์เซอร์ที่ใช้ เช่น GoSurf, MyIE2, และ NetCapter ที่ใช้เคอร์เนล IE เพื่อรองรับหลายเพจและซอฟต์แวร์ที่บล็อกโฆษณาโดยอัตโนมัติ ว่ากันว่าใน IE6 sp2 ที่กำลังจะมาถึง Microsoft จะเพิ่มฟังก์ชั่นการบล็อกหน้าต่างโฆษณาด้วย แน่นอนว่านี่เป็นสิ่งที่ดีสำหรับผู้ใช้อินเทอร์เน็ตส่วนใหญ่ แต่สำหรับโปรแกรมเมอร์ วิธีที่เราใช้หน้าต่างป๊อปอัปนั้นไม่ได้แตกต่างจากโฆษณาทั่วไปมากนัก แน่นอนว่าเราไม่อยากเห็นมัน มีวิธีมาตรฐานในการทำให้หน้าต่างปรากฏขึ้นตามปกติหรือไม่? สิ่งนี้ทำให้เราต้องเข้าใจหลักการของการบล็อกโฆษณาของเบราว์เซอร์ ตัวบล็อกโฆษณาทั่วไปใช้สามวิธีต่อไปนี้ในการกรองโฆษณา:
(1) วิธีการบล็อกตามชื่อหน้าต่าง
หลักการของวิธีการบล็อกนี้คือการตรวจสอบชื่อหน้าต่าง IE ทั้งหมดเป็นประจำ จากนั้นจึงกรองตามรายการที่มีอยู่ (ดูแลโดย โปรแกรม) รายการอาร์เรย์) เพื่อเปรียบเทียบหากเหมือนกันเราจะปิดหน้าต่างนี้ เห็นได้ชัดว่าวิธีนี้มีข้อบกพร่องมากมาย มันบล็อกหน้าต่างป๊อปอัปทั้งหมดและเข้มงวดเกินไปในโปรแกรม อย่างไรก็ตามวิธีการเปลี่ยนรูปนั้นค่อนข้างเป็นเรื่องปกติ นั่นคือเทคโนโลยีการกรองอัจฉริยะที่อิงตามชื่อหน้าต่างจะบล็อกหน้าต่างป๊อปอัปโดยขึ้นอยู่กับว่าชื่อมีคำหลักที่เกี่ยวข้องกับการโฆษณาหรือไม่ นี่เป็นการสำรวจที่ดีเพื่อปรับปรุงผลการกรอง
(2) วิธีการบล็อกตามคลาสหน้าต่างและตำแหน่ง
หลังจากวิเคราะห์ พบว่าชื่อคลาสของหน้าต่างการเรียกดูปกติคือ IEFRAME และ CabinetWClass ในขณะที่ชื่อคลาสของหน้าต่างโฆษณาคือ CabinetWClass การวิเคราะห์เพิ่มเติมพบว่า: ค่าของ rect.top ของคลาส WorkerA ของหน้าต่างโฆษณาและคลาส Shell DocObject View เหมือนกัน แต่ค่าของ rect.top ของคลาส WorkerA ของหน้าต่าง IE ปกติและ คลาส Shell DocObject View นั้นแตกต่างกัน จากสองประเด็นข้างต้น คุณสามารถเขียนโปรแกรมนักฆ่าโฆษณาได้ อันที่จริง ฉันไม่แน่ใจเกี่ยวกับความสามารถทั่วไปของโปรแกรมนี้ เนื่องจากผู้เขียนใช้ Spy++ ในการวิเคราะห์และพบว่าใน Windows2000 (ระบบปฏิบัติการที่ผู้เขียนใช้) คลาสของหน้าต่าง IE จึงเป็น IEFrame ทั้งหมด ในเวลาเดียวกัน เนื่องจาก Win2000 เป็นระบบปฏิบัติการที่ใช้รหัส Unicode จึงไม่มีคลาส WorkerA และถูกแทนที่ด้วยคลาส WorkerW ในเวลาเดียวกัน ไม่มีสถานการณ์ที่ rect.top แตกต่างออกไป เนื่องจากผู้เขียนไม่มีระบบปฏิบัติการ WindowsXP ฉันจึงไม่สามารถทำการทดลองเพิ่มเติมกับ 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 จึงเป็นเรื่องปกติที่จะใช้วิธีที่สาม อย่างไรก็ตาม ในระหว่างการใช้งาน บางครั้งเราพบว่าการกรองโฆษณาไม่สมบูรณ์ แต่หลักการก็เหมือนกัน