منذ نشر مقالة [JavaScript] تخصيص messageBox، كتب العديد من مستخدمي الإنترنت للسؤال عن كيفية استدعاء طريقة ShowInfo من جانب الخادم، وفكرت في طريقة تسوية لتحقيق ذلك خلال عطلة نهاية الأسبوع.
بادئ ذي بدء، يجب أن نكون قادرين على توضيح سبب استخدامنا Page.Write لإخراج طريقة JS المخصصة إلى الصفحة ولماذا لا يستطيع IE التعرف عليها وسيظهر الخطأ "لم يتم تعريف XXX". السبب بسيط، لأن البرنامج النصي الذي نخرجه باستخدام Page.Write يظهر في أعلى الصفحة. عندما يقرأ IE أنها وظيفة جافا سكريبت، فإنه يبدأ في تنفيذها. ومع ذلك، لا تتم قراءة ملف js الذي ربطناه بواسطة IE في الوقت الحالي، لذلك لا يمكن لـ IE التعرف على الطريقة التي حددناها في ملف js. إذن لماذا يعد تنبيه الكتابة ممكنًا؟ نظرًا لأن التنبيه عبارة عن وظيفة برنامج نصي مضمنة في IE، فسوف يتعرف عليها IE بغض النظر عما إذا كانت هناك صفحة أم لا.
بمجرد العثور على المشكلة، سيتم حلها بشكل طبيعي:
1. قم بتضمين طريقتنا المخصصة في IE. ---> يبدو الأمر غريبًا بعض الشيء، هاها
2. انتظر حتى يتم تحميل الصفحة قبل بدء الحدث. --->الحدث المحفز، نعم.
كيف يمكنك معرفة ما إذا كانت الصفحة قد انتهت من التحميل؟
1. من خلال حالة المستند
2. يتم تشغيله بواسطة الحدث (windows.onload)
يبدو أن الأول أقل أمانًا، وفي بعض الأحيان يظهر أنه ينقل البيانات على الرغم من تحميلها بالكامل (FF هو الموقف الأكثر وضوحًا)، لذا فإن استخدام الأحداث أكثر أمانًا.
حدد طريقة بسيطة، وقم بتثبيتها في windows.onload، وقم بوضع علامة عند التنفيذ
varloadComplete = false;
اكتمل تحميل الدالة()
{
LoadComplete= true;
}
window.attachEvent("onload",LoadCompleted
هاها، بهذه الطريقة نحتاج فقط إلى الحكم على ما إذا كانت الصفحة قد تم تحميلها من خلال الحكم على LoadComplete.
var mImgdir = "";
var mCaption = "caption";
var mMsg = "رسالة";
var mOkClick= null;
وظيفة ShowMessage(imgdir,caption,msg,OkClick)
{
إذا (اكتمل التحميل)
{
KMessageBox.ShowInfo(mImgdir,mCaption,mMsg,mOkClick);
}
}
بهذه الطريقة، عندما لا يكون LoadComplete خطأ، لن نقوم بتنفيذ طريقة KMessageBox.ShowInfo()، ولكن لن يكون هناك أي مطالبة بأخطاء JS.
هذا وحده لا يكفي، لأنه يتم تنفيذ البرنامج النصي للإخراج مرة واحدة فقط بواسطة IE عند إخراج الصفحة، ولكن LoadComplete=false في هذا الوقت، لذلك نحتاج إلى اكتشاف ما إذا كان قد تم تحميل الصفحة بانتظام. عندما يتعلق الأمر بالتوقيت، نستخدم فقط setTimeout وsetInterval. نحتاج إلى اكتشاف مستمر هنا، لذلك نستخدم طريقة setInterval. الكود النهائي هو كما يلي:
varloadComplete = false;
var mImgdir = "";
var mCaption = "caption";
var mMsg = "رسالة";
var mOkClick= null;
فار timerID;
وظيفة ShowMessage(imgdir,caption,msg,OkClick)
{
إذا (اكتمل التحميل)
{
KMessageBox.ShowInfo(mImgdir,mCaption,mMsg,mOkClick);
// إلغاء تحميل هذا الحدث window.detachEvent("onload",function(){LoadCompleted;}); // إيقاف تشغيل التوقيت
window.clearInterval(timerID);
}
}
الدالة LoadCompleted() { LoadComplete=true }
window.attachEvent("onload",LoadCompleted);
//ضبط آلية الكشف عن التوقيت
timerID = window.setInterval(ShowMessage,1);
بالطبع، الكود أعلاه متوافق فقط مع IE لأنه يستخدم AttachEvent وdetachEvent أما بالنسبة لجعله متوافقًا مع المتصفحات الأخرى، فيرجى الرجوع إلى [JavaScript] تخصيص طريقة عرض العنوان لطريقة المعالجة:
if(!document.attachEvent)//ليس IE
{
document.attachEvent = function(){document.addEventListener(arguments[0].substr(2),arguments[1],arguments[2])}
}
if(!window.attachEvent)//ليس IE
{
window.attachEvent = function(){window.addEventListener(arguments[0].substr(2),arguments[1],arguments[2])}
}
من جانب الخادم، طالما أن StringBuilder ينتج البرنامج النصي أعلاه ثم يكتبه، فهذا يكفي. ما ورد أعلاه يقدم فكرة فقط. بالطبع، هناك طرق أخرى، على سبيل المثال، لا أستخدم الكشف المجدول، بل أقوم بتثبيته مباشرة في windows.onload وأترك الصفحة تراقب وتنفذ تلقائيًا :)، كما يقول المثل كل الطرق تؤدي إلى روما
الأفكار المذكورة أعلاه تأتي من yui، وتطبق yui صندوق رسائل مخصص أكثر جمالا ويمكن للأصدقاء المهتمين دراسته معًا.
http://www.cnblogs.com/walkboy/archive/2006/08/28/autorun_customerfunction.html