الملخص: تتناول هذه المقالة كيفية تنفيذ النوافذ المنبثقة المختلفة باستخدام 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 لعرض رسالة تحذير.
Private Sub btAlert_Click(ByVal sender 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 كسلسلة _
)
حيث: يمثل المفتاح المعرف الفريد لهذا البرنامج النصي، والبرنامج النصي عبارة عن سلسلة تمثل البرنامج النصي.
النموذج الأولي لـ RegisterClientScriptBlock هو نفس RegisterStartupScript. الفرق بين الوظيفتين هو أن كود البرنامج النصي الذي تحتويان عليه مكتوب في مواقع مختلفة في ملف HTML. يقوم RegisterClientScriptBlock بإصدار البرنامج النصي للعميل مباشرة بعد علامة الفتح لعنصر كائن الصفحة، ويقوم RegisterStartupScript بإصدار البرنامج النصي قبل علامة الإغلاق لعنصر كائن الصفحة. إذا كان البرنامج النصي الخاص بك يحتوي على عبارات تتفاعل مع كائن الصفحة (كائن المستند) (سيظهر ذلك في الأمثلة اللاحقة)، فمن المستحسن استخدام RegisterStartupScript. ومن ناحية أخرى، إذا كنت تريد تنفيذ البرنامج النصي للعميل في وقت مبكر ممكن، يمكنك استخدام RegisterClientScriptBlock أو Response.Write.
من أجل منع الإضافة المتكررة للبرامج النصية إلى الصفحة، يستخدم ReisterStartupScript/RegisterClientScriptBlock المفتاح كمفتاح التسجيل عند تسجيل البرنامج النصي، ومن ثم يمكن استخدام IsClientScriptBlockRegistered لإصدار الأحكام في البرنامج.
سيستخدم المثال التالي RegisterClientScriptBlock لتوضيح استخدام التأكيد.
Private Sub btConfirm_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) يعالج btConfirm.انقر فوق
"إظهار طريقة RegisterClientScriptBlock وتأكيد windowIf
(Not IsClientScriptBlockRegistered("clientScript")) ثم
'حدد ما إذا كان البرنامج النصي قد تمت إضافته، وإذا لم يكن الأمر كذلك، قم بإضافته.
خافت strScript كسلسلة
سترسكريبت = " "
'تسجيل البرنامج النصيRegisterClientScriptBlock("clientScript"، strScript)
'إذا قمت بتحديد "لا"، تابع التنفيذ.
End If
End Sub
2.
إن مجرد وجود نافذة مطالبة لا يلبي متطلباتنا في البرنامج، فغالبًا ما نحتاج إلى ظهور الصفحة المحددة. في الوقت الحالي، يمكنك استخدام طريقة window.open الخاصة بجافا سكريبت. باستخدام طريقة RegisterClientSciptBlock السابقة، يمكننا ظهور الصفحة المحددة.
يوضح التعليمة البرمجية التالية كيفية ظهور الصفحة المحددة:
Private Sub btWinOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) يعالج btWinOpen.انقر فوق
'استخدم window.open وتسجيلStartupScript لعرض توضيحي بسيط.
إذا (ليس IsClientScriptBlockRegistered("OpenScript")) إذن
'حدد ما إذا كان البرنامج النصي قد تمت إضافته، وإذا لم يكن الأمر كذلك، قم بإضافته.
خافت strScript كسلسلة = " "
تسجيلStartupScript("OpenScript"، strScript)
نهاية إذا
End Sub
طريقة Window.open لإظهار صفحة جديدة، والتي تحتوي على معلمة واحدة فقط: عنوان URL للنافذة المنبثقة الجديدة. اتضح أن الأسلوب window.open يحتوي على معلمات متعددة، ولكن هذه مسألة بسيطة تتعلق بـ javascipt ولن ندخل في التفاصيل هنا. إذا كانت لديك أسئلة ذات صلة، يرجى مراجعة MSDN.
يعمل هذا البرنامج بشكل جيد عند استخدامه مباشرة في IE. ولكن إذا كنت تستخدم متصفحات مثل GoSurf، وMyIE2، وNetCapter، وما إلى ذلك، فللأسف! لن ترى النوافذ المنبثقة. هذا ما سنناقشه حول تصفية النوافذ المنبثقة.
3. ناقش سلوك تصفية النوافذ المنبثقة لمتصفحات IE غير القياسية:
أدى انتشار النوافذ الإعلانية إلى جعل العديد من مستخدمي الإنترنت لا يتحملون مضايقات الإعلانات، وقد تخلوا عن متصفحات IE القياسية واستخدموا المتصفحات مثل GoSurf وMyIE2. وNetCapter التي تستخدم IE kernel لدعم صفحات متعددة وبرامج تحظر الإعلانات تلقائيًا. ويقال أنه في IE6 sp2 القادم، ستضيف Microsoft أيضًا وظيفة حظر النوافذ الإعلانية. وهذا بالطبع أمر جيد بالنسبة لمعظم مستخدمي الإنترنت، ولكن بالنسبة للمبرمجين، فإن الطريقة التي نستخدم بها النوافذ المنبثقة لا تختلف جوهريًا عن الإعلانات العادية. سيتم أيضًا حظر مثل هذه النوافذ بشكل عشوائي بواسطة مدير النوافذ المنبثقة بالطبع لا نريد رؤيته هل هناك طريقة قياسية لجعل النافذة تنبثق بشكل طبيعي؟ وهذا يتطلب منا أن نفهم مبدأ حظر المتصفح للإعلانات. تستخدم أدوات حظر الإعلانات الشائعة الطرق الثلاث التالية لتصفية الإعلانات:
(1) طريقة المنع المستندة إلى عنوان النافذة
يتمثل مبدأ طريقة المنع هذه في التحقق بانتظام من جميع عناوين نوافذ IE، ثم تصفيتها بناءً على القائمة الحالية (التي يحتفظ بها. برنامج). قائمة المصفوفات) للمقارنة، إذا كان هناك نفس الشيء، نغلق هذه النافذة. من الواضح أن هذه الطريقة بها العديد من العيوب، فهي تحظر جميع النوافذ المنبثقة ونادرا ما يتم استخدامها في البرنامج. ومع ذلك، فإن طريقة التشوه المبنية عليها شائعة جدًا. وهذا يعني أن تقنية التصفية الذكية المستندة إلى اسم عنوان النافذة تحظر النوافذ المنبثقة بناءً على ما إذا كان العنوان يحتوي على كلمات رئيسية مرتبطة بالإعلان. يعد هذا استكشافًا جيدًا لتحسين تأثير التصفية.
(2) تعتمد طريقة الحجب على فئة النافذة وموقعها
بعد التحليل، وقد وجد أن أسماء فئات نوافذ التصفح العادية هي IEFRAME وCabinetWClass، في حين أن اسم فئة نوافذ الإعلانات هو CabinetWClass. وجد المزيد من التحليل أن: قيم rect.top لفئة WorkerA لنافذة الإعلان وفئة Shell DocObject View هي نفسها، ولكن قيم rect.top لفئة WorkerA لنافذة IE العادية و تختلف فئة عرض Shell DocObject. بناءً على النقطتين السابقتين، يمكنك كتابة برنامج قاتل الإعلانات. في الواقع، أنا متشكك بشأن تعميم هذا البرنامج. لأن المؤلف استخدم 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 kernel. يقوم بحظر النوافذ المنبثقة قبل فتحها. المبدأ هو: عندما يفتح IE نافذة جديدة، سيتم تشغيل حدث NewWindow وسيتم تنفيذ الأسلوب OnNewWindow2([out] IDispatch*, [out] BOOL *bCancel). قم بتحميل هذه الطريقة بشكل زائد لتحديد ما إذا كان حدث فتح النافذة الجديدة سيحدث بعد تنزيل صفحة التصفح. إذا كان الأمر كذلك، فهذا يعني أنها نافذة منبثقة عادية، وإلا فسيتم اعتراضها.
نظرًا لأن المتصفحات مثل Gosurf تفرط في تحميل مكون Shocvm.dll، فمن الطبيعي استخدام الطريقة الثالثة. ومع ذلك، أثناء الاستخدام، نجد أحيانًا أن تصفية الإعلانات ليست مثالية، ولكن المبدأ هو نفسه في الأساس.