خاصية تعدد في جافا سكريبتمحاكاة خاصية تعدد في جافا سكريبت وثمة حدث استباقية يحركها العمارة هو مثل الكلب يسأل (إذا أمكن) ، وقال "عندما أنت ذاهب لرمي الكرة ، وعندما ، هوه ، ومتى؟" المزيفة الخيط العمارة ينفذ باستخدام مهلات. التضليليه ترابط هو نتيجة لاستدعاء الدالة الدورية أو الكائن ، والتنفيذ الكامل هو موضح في التعليمات البرمجية المصدر التالية. المصدر : / العميل / مخطوطات / jaxson / Common.js ThreadObject الدالة () (this.obj = فارغة ؛ this.data = فارغة ؛ this.intervalId = فارغة ؛ this.isUsed = كاذبة ؛) ThreadObject.prototype.makeCall = الدالة () ( إذا كان (typeof (this.obj) == "وظيفة") (this.obj (this.data) ؛) والا اذا (typeof (this.obj) == "كائن") (this.obj.run (this.data ) ؛)) الموضوع فار = (threadObjects : صفيف الجديد () ، startThread : وظيفة (الكائنات ، والبيانات والوقت) (ل (فار c1 = 0 ؛ c1 <this.threadObjects.length ؛ c1 + +) (إذا (! هذا . threadObjects [c1]. isUsed) (this.threadObjects [c1]. isUsed = صحيح ؛ this.threadObjects [c1]. البيانات = البيانات ؛ this.threadObjects [c1]. الكائنات = الكائنات ؛ this.threadObjects [c1]. intervalId = window.setInterval ( "Thread.threadObjects [" + + c1 "]. makeCall ()" ، مرة) ؛ this.threadObjects العودة [c1]. intervalId ؛)) رمي خطأ جديدا ( "تعذر بدء تشغيل مؤشر ترابط") ؛ ) ، endThread : وظيفة (intervalId) (ل (فار c1 = 0 ؛ c1 <this.threadObjects.length ؛ c1 + +) (اذا (this.threadObjects [c1]. intervalId == intervalId) (window.clearInterval (intervalId) ؛ this.threadObjects [c1]. isUsed = كاذبة ؛)))) InitializeThreads ظيفة (maxThreads) (ل (فار c1 = 0 ؛ c1 <maxThreads ؛ c1 + +) (Thread.threadObjects.push (ThreadObject جديدة ()) ؛ InitializeThreads)) (30) ؛ في المصدر ، واثنين من أنواع الكائنات يتم تعريفها : ThreadObject والموضوع. نوع ThreadObject وتستخدم لإدارة الخيط وهمية ، والموضوع تدير خيوط وهمية. وظيفة InitializeThreads يستخدم لانشاء الزائفة الترابط البيئة. لتفسير هذا شفرة المصدر ، من أعلى إلى أسفل النهج يستخدم. عندما يكون الملف الذي يحتوي على جافا سكريبت الزائفة العمارة الخيط يتم تحميلها ، وظيفة InitializeThreads يسمى مع قيمة معلمة من 30. InitializeThreads يستخدم لتهيئة مجموعة من المواضيع الزائفة التي سيتم استدعاؤها. الثابت الترميز إلى حد 30 مواضيع قد تبدو وكأنها ممارسة سيئة للبرمجة ، ولكن هناك سبب لذلك. لإنشاء الزائفة الخيط ، يمكنك إنشاء الحدث الدوري ، مما يعني أنك تحتاج إلى استخدام إما window.setInterval أو الأسلوب window.setTimeout. يدعو أيا من هذه الأساليب يتطلب إشارة دالة أو قطعة من شفرة جافا سكريبت. المشكلة مع كلا النهجين هو أن تحتاج إلى تسلسل شفرة المصدر. على سبيل المثال ، تخيل أنك تريد أن يدعو أحد الأساليب الحدث الدوري المحلي مع مرجع كائن معاهد ، كما يتضح من التعليمات البرمجية المصدر التالية : window.setInterval ( "CallFunction (معاهد)" ، 300) ؛
في إشارة إلى معاهد في سلسلة العازلة لن يكون لها أي معنى ، لأنه عندما الموقت الدوري ينفذ ، والمتغيرات المحلية ليست في السياق. إعدام سوف ينتج خطأ. وهناك طريقة أخرى لاستدعاء الدالة هو تسلسل معاهد إلى المخزن ، ولكن لديها عيب أن الدولة التي يجري استخدامها في حالة الدوري لن تكون هي نفسها مثيل الكائن ، وبالتالي إذا تم إجراء أية تغييرات بين الدعوة للsetInterval ظيفة وانتهاء الموقت ، فإنها لن تكون موجودة ، والمرة الوحيدة عندما معاهد صحيحا هو إذا معاهد هو عالمي متغير. وكقاعدة عامة من الإبهام ، والطريق الأسلم لجعل طريقة محددة للسياق مكالمة باستخدام أساليب setInterval أو setTimeout هو استخدام مرجعية عالمية. مرجع عالمي يمكن ان تنشأ من جراء حيوي instantiating المتغيرات العشوائية أو باستخدام إشارة فهرس الصفيف. النهج الذي اختاره الموضوع هو فهرس الصفيف. الدالة InitializeThreads سوف تهيئة 30 مراجع عالمية من ThreadObject. كل البيانات ThreadObject أربعة أعضاء : • الكائنات : مراجع وجوه لتنفيذه. الأسلوب ThreadObject.makeCall يمكن التمييز بين وظيفة والكائن. إذا كانت الكائنات هي وظيفة ، ثم الكائنات سوف يتم استدعاء باستخدام الرموز الدالة. إذا كانت الكائنات هو مثيل كائن ، ثم الأسلوب obj.run يسمى. • بيانات : المراجع والبيانات المستخدمة في سياق الكائنات عندما يتم تنفيذه. • intervalId : المراجع القيمة التي يتم إرجاعها بواسطة الأسلوب window.setInterval. يتم استخدام هذه القيمة لوقف هذا الحدث الدوري. • isUsed : مستعملة من الموضوع لتحديد ما إذا كان مؤشر صفيف المستخدمة حاليا. عندما موضوع جديد يريد أن يبدأ ، وstartThread يبحث طريقة لفهرس فارغة ، حيث isUsed يساوي قيمة زائفة. مرة واحدة في خيط قد بدأت ، وisUsed البيانات يتم تعيين العضو قيمة حقيقية. وعند الانتهاء من تنفيذ الخيط ، وisUsed البيانات يتم تعيين العضو قيمة زائفة أخرى. المزيفة الخيط العمارة يستخدم في إعلان DynamicIterator المشار إليه بواسطة onmouseover الملاحية الفوقية والأحداث onmouseout. عند تحريك الماوس من منطقة واحدة من صفحة الى اخرى أتش تي أم أل ، والمنطقة الأخرى تم الحدث onmouseover تنفيذها ، ويتم تشغيل الحدث. الحدث onmouseover يتم تشغيلها فقط في المرة الأولى يتحرك الماوس فوق الحدث ، والذي يتسبب في الأسلوب startIteration ليتم استدعاؤها ، داعيا Thread.startThread. عندما يتحرك الماوس خارج المنطقة الفوقية الملاحة ، والأسلوب stopIteration يسمى ، داعيا Thread.endThread. تنفيذ startIteration وstopIteration يتم تعريفها على النحو التالي. المصدر : / العميل / مخطوطات / jaxson / uimorphing.js (DynamicIterator)intervalId : 0 ، startIteration : وظيفة (اتجاه) (this.intervalId = Thread.startThread (وظيفة) direc) (DynamicIterator.shiftArrayElements (direc) ؛) ، والتوجيه ، 500) ؛) ، stopIteration : الدالة () (Thread.endThread ( this.intervalId) ؛) ، وضع القطع المتبقية من عميل معا مرات عدة وأنا على تنفيذ DynamicIterator المشار إليها ، والتي تستخدم للتنقل في الفوقية من مجموعة النتائج. الدور الرئيسي للDynamicIterator هو لتحميل العناصر الوصفية الملاحية ، وعندما يتم الرجوع إليها العناصر الفردية ، ويتم تحميل البيانات الرئيسية. أشرح تنفيذ DynamicIterator في القطع ، مع تمثيل التالية من التهيئة للعناصر التصفح. المصدر : / العميل / مخطوطات / jaxson / uimorphing.js فار DynamicIterator = (lastElem : اغية ، floatingIframe : اغية ، parentRow : اغية ، تهيئة : وظيفة (floatingIframeID ، parentRowID) (this.floatingIframe = document.getElementById (floatingIframeID) ؛ this.parentRow = document.getElementById (parentRowID) ؛ this.doLayout () ؛ this.getMoreRootElements (0) ؛) ، doLayout : الدالة () (this.floatingIframe.style.width = document.body.clientWidth -- 4 ؛ this.floatingIframe.style. الارتفاع = document.body.clientHeight -- 104 ؛) ، / / إعلانات أخرى...) ؛
العودة إلى بداية "تنفيذ أتش تي أم أل عميل" الباب ، نذكر قطعة أتش تي أم أل البرمجية التي تنفذ body.onload هذا الحدث ، الذي دعا إلى تهيئة وظيفة محلية. في تنفيذ تهيئة ، وطريقة DynamicIterator.initialize يسمى. وسوف يدعو DynamicIterator.initialize ترافقي أتش تي أم أل عناصر واجهة المستخدم مع المثيل DynamicIterator. أتش تي أم أل DynamicIterator.initialize تتوقع اثنين من عناصر واجهة المستخدم : لiframe العائمة (this.floatingIframe) وصف الجدول (this.parentRow) الذي يحتوي على عناصر الملاحية. DynamicIterator احتياجات هذين عناصر واجهة المستخدم لأنه يقوم بتحميل البيانات سلط عليها الضوء في مجال الملاحة البحرية. بعد عناصر واجهة المستخدم قد تم تعيين أعضاء البيانات ، وطريقة doLayout يسمى. الغرض من doLayout هو لتغيير حجم iframe بحيث يغطي منطقة العميل المناسب. واستدعاء الأسلوب الأخير في DynamicIterator.initialize هو استدعاء للأسلوب getMoreRootElements ، وهو المسؤول عن تحميل العناصر الوصفية الملاحية. وفي سياق DynamicIterator ، الأسلوب هو getMoreRootElements المعلنة باعتبارها وظيفة فارغة مشابهة لما يلي : getMoreRootElements : وظيفة (اتجاه) () الدالة الفارغة عنصرا نائبا ، وأنه من المتوقع أن الكود سوف تعلن عن تنفيذها. في حالة الكود ، getMoreRootElements يتم تعريفها على النحو التالي. المصدر : / / العميل المواد ajaxrest / العمارة / DynamicIterator.getMoreRootElements dynamiclist.html = وظيفة (اتجاه) (اذا (الاتجاه == 0) (فار متزامنة = FactoryHttp.getCachedAsynchronous () ؛ asynchronous.settings = (onComplete : وظيفة (xmlhttp) (فار arrTickers = صفيف الجديدة () ؛ آلة لفار = JSON.parse (xmlhttp.responseText) ؛ ل (فار c1 = 0 ؛ c1 <tickers.length ؛ c1 + +) (arrTickers.push ((النص : آلة ل[c1] ، رابط : "/ pyservices / تاجر / التاريخية / آلة ل/" + آلة ل[c1])) ؛) DynamicIterator.associateElements (arrTickers) ؛)) asynchronous.get ( "/ pyservices / تاجر / التاريخية / آلة ل") ؛)) في حالة الكود ، وآلة لالفوقية التي تمثل تستخدم للتنقل من خلال التطبيق يتم تحميلها مرة واحدة. التعريف قد يكون غير محدود ، ولكن غالبا ما لا يمكن أن يقتصر على حجم ثابت تعيين ، حتى لو أن حجم مجموعة كبيرة جدا. يبحث على سبيل المثال ، كل قطعة من البيانات الوصفية هو مؤشر واحد يمكن أن إلى أربعة أحرف (في المتوسط). إذا ضربنا هذا العدد بمقدار 1،000 آلة ل، ثم لديك لتنزيل حول 4KB - 5KB للبيانات (في هذه الحقبة من النطاق العريض ، تحميل 4KB - 5KB تافهة). تطبيق الأسهم سوف تسمح على الأكثر 50 آلة لبسبب القيود التقنية ، لذلك كل من آلة ليمكن تحميلها في طلب واحد. في حالة مثالنا ، getMoreRootElements مع اتجاه 0 الوسائل لتحميل مجموعة أولية من العناصر الوصفية. كيف البيانات التي يتم تحميلها مسؤولية تنفيذ getMoreRootElements. هذا المثال يستخدم الفئة غير متزامن ، والرد هو ترميز كصفيف جسون. لكل مؤشر وجدت ، ويتم إنشاء كائن حيث يتم دمجها مع شريط عنوان وتضاف إلى مجموعة arrTickers. وبمجرد أن مجموعة arrTickers قد تم شغلها مع العناصر ، وDynamicIterator. associateElements يتم استدعاء الأسلوب على النحو التالي. المصدر : / العميل / مخطوطات / jaxson / uimorphing.js (DynamicIterator)associateElements : وظيفة (arrElements) (this.arrElements = arrElements ؛ this.shiftArrayElements (0) ؛) ، الأسلوب associateElements بأمرين : يعين arrElements مرجعية واسعة ، وتحديث البيانات في الصفحة أتش تي أم أل باستخدام الأسلوب shiftArrayElements. إذا كان المستخدم تحوم الماوس فوق السهم إما إلى اليسار أو اليمين ، قائمة آلة لتحولات إلى اليسار أو اليمين. حركة مؤشر يرد ضمن الأسلوب shiftArrayElements. المستدعي من الأسلوب يوفر اتجاه التحول باستخدام قيمة إيجابية أو سلبية. استنادا إلى قيمة الاتجاه ، وسوف يتم نقل المؤشر. إذا كان مؤشر تحول تتجاوز حدود للطائفة ، ثم لمزيد من التعريف العناصر التي يلزم استردادها. والتنفيذ الكامل لshiftArrayElements هي على النحو التالي. المصدر : / العميل / مخطوطات / jaxson / uimorphing.js (DynamicIterator)shiftArrayElements : وظيفة (الإزاحة) (this.currOffset = this.currOffset + تعويض ، وإذا كان (this.currOffset <0) (this.getMoreRootElements (-1) ؛ this.currOffset = 0 ؛) والا اذا ((+ هذا this.currOffset . parentRow.cells.length)> = this.arrElements.length) (this.getMoreRootElements (1) ؛ this.currOffset = this.arrElements.length -- this.parentRow.cells.length ؛) ل(مكافحة فار = 1 ؛ العداد <(this.parentRow.cells.length -- 1) ؛ مكافحة + +) (this.parentRow.cells [مواجهة]. innerHTML = this.arrElements [this.currOffset + مضادة -- 1]. النص ؛ this.parentRow.cells [ مكافحة]. refElemInfo = this.arrElements [this.currOffset + مضادة -- 1] ؛)) ، في تنفيذ shiftArrayElements ، عملية حسابية لهذا التحول يتطلب اختبارا لتحديد ما إذا كان هذا التحول سوف يتسبب في القفز خارج حدود الصفيف. إذا كان الانتقال إلى اليسار أو اليمين للحدود الصفيف يحدث ، ثم الأسلوب getMoreRootElements يسمى حيث القيمة الاتجاه -1 أو 1 يحدد بادئة الفوقية إلى بداية المصفوفة أو إلحاق بيانات إلى نهاية المصفوفة ، على التوالي. وإذا كان التحول لا يسبب قفزة خارج حدود الصفيف ، ثم الفرد أتش تي أم أل عناصر هي رسم المستخدم بمعلومات جديدة المرجعية التي تعلق على الممتلكات refElemInfo. ليس من المعتاد ان نعلق البيانات الخاصة بك لفرد أتش تي أم أل عنصر واجهة المستخدم ، ولكن في هذه الحالة من الضروري تماما لأسباب لها علاقة مستخدم تحوم الماوس فوق العنصر. إذا كانت تحوم المستخدم مؤشر الماوس فوق ، أردت معلومات شريط كي يجري تحميلها في إطار عائمة بتوقيت جرينتش. هذا هو الأسلوب الذي أنجزه DynamicIterator.HightlightItem ، والتي تم تعريفها على النحو التالي. المصدر : / العميل / مخطوطات / jaxson / uimorphing.js (DynamicIterator)highlightItem : وظيفة (ابتدائي) (اذا (this.lastElem! = فارغة) (this.shrinkElement (this.lastElem) ؛) this.expandElement (ابتدائي) ؛ this.lastElem = ابتدائي ؛ this.fetch (elem.refElemInfo) ؛) ، highlightItem لا تفعل شيئا أكثر من مندوب الإجراءات إلى shrinkElement ، expandElement ، وجلب الأساليب. كل من هذه الأساليب بشكل افتراضي الوظائف الفارغة التي صفحة أتش تي أم أل يحتاج الى تنفيذ. فكرة highlightItem هو توفير clickless نظام الملاحة. كيف يمكنك جعل وظيفة الملاحة هي من مسؤولية الصفحة أتش تي أم أل. DynamicIterator مسؤولية هو التنسيق ولذا ، فإن الخطوة الأولى هي لتغيير في العودة إلى طبيعتها العنصر الأخير الذي سلط الضوء على استخدام الأسلوب shrinkElement. في حالة شريط المثال ، فإنه يتم تنفيذ على النحو التالي. المصدر : / / العميل المواد ajaxrest / العمارة / dynamiclist.html DynamicIterator.shrinkElement = وظيفة (ابتدائي) (elem.style.fontSize = 12 ؛) تنفيذ مؤشر بسيط لأنه يقلص من الخط الخلفي للخلية الجدول 12. أموريه للحصول على واجهة المستخدم المتطورة ، وتقلص العنصر قد يعني إغلاق قائمة أو منبثقة عنصر شعبة. والخطوة التالية من highlightItem هو تسليط الضوء العنصر الحالي باستخدام الدالة expandElement ، الذي يجري تنفيذه على النحو التالي. المصدر : / / العميل المواد ajaxrest / العمارة / dynamiclist.html DynamicIterator.expandElement = وظيفة (ابتدائي) (elem.style.fontSize = 30 ؛ فار متزامنة = FactoryHttp.getCachedAsynchronous () ؛ asynchronous.settings = (onComplete : وظيفة (xmlhttp) () asynchronous.get) (elem.refElemInfo.url) ؛) تنفيذ expandElement بأمرين : زيادة حجم الخط وتنزيل البيانات المقترنة العنصر الفوقية. ومع ذلك ، في تنفيذ onComplete ، لا يوجد عمل ، وذلك لأن عند تسليط الضوء على العنصر الفوقية ، وربما كنت لا ترغب في عرض البيانات ، ولكن كنت ترغب في التخزين المؤقت للبيانات للرجوع إليها مستقبلا سريعة. عند هذه النقطة ، تحتاج لاتخاذ قرار حول آلية عرض البيانات في بتوقيت جرينتش. إذا كنت ترغب في عرض البيانات باستخدام فوق ، ثم أنت بحاجة الى تنفيذ _ النقر للخلايا الجدول الفردية. إذا كنت تريد استخدام هذا الفعل من حيث تسليط الضوء على الزناد لعرض البيانات ، ثم أنت بحاجة الى تطبيق الأسلوب onComplete قلت قبل قليل ان لم يكن في حاجة إلى أن تنفذ. وجهة نظري هو أن الطريقة التي عرض البيانات متروك لكم وDynamicIterator يحدد أي إطار. DynamicIterator هي الوحيدة المسؤولة عن تحميلها مسبقا البيانات. قد يظن بعض القراء أن استرداد البيانات في كل مرة عنصرا الفوقية يسلط عليه الضوء هو مكلفة جدا ، ولكن التكلفة يعتمد على الكيفية التي تنفذ ذاكرة التخزين المؤقت ، وهذا يعني أنه كلما تزامني المشار إليها ، فإن أول شيء كان هل هو الاختيار على مخبأ للحصول على المعلومات. إذا كانت المعلومات متوفرة بالفعل ، وطريقة onComplete يسمى مباشرة. السحر يكمن في ذاكرة التخزين المؤقت ، وإذا لم يكن هناك مخبأ ، ثم في كل مرة يتم إبراز عنصر الفوقية ، والبيانات المرتبطة بالموارد سيتم تحميلها. دعونا خطوة الى الوراء والتفكير في تنفيذ العميل العمارة الجانب ، وكيف أنه لا يحل مشكلتنا مجموعات كبيرة من البيانات أو بطيئة. إذا كنا نعمل مع تطبيق البريد الإلكتروني ، ثم الفوقية ستكون عناوين البريد الإلكتروني الفردية ، ونود أن أعاد أكثر من الألقاب وتسليط الضوء عليها. للتحقق من رسائل البريد الإلكتروني الجديدة ، فإننا لا يمكن متفرعة عن خيط من شأنه أن تلقائيا إضافة عناصر البيانات الوصفية إلى نهاية الصفيف arrElements. كما نؤكد على عناوين البريد الإلكتروني ، من شأنه أن محتوياتها يمكن تحميلها وعرضها في إطار بتوقيت جرينتش. والآن دعونا نقول اننا كنا حساب كل من الأعداد الأولية ، ويريد أن يرى نتائج. في هذه الحالة ، هو البيانات الوصفية ، ومثل تطبيق البريد الإلكتروني ، ونسج خيط من شأنه أن يكون خارج لإبقاء مضيفا النتائج إلى الصفيف arrElements. ذكرتها هذه الأمثلة اثنين من المواضيع التي فصلتها ، لأن حتى الآن على سبيل المثال يوضح فقط التوسع وتحميل البيانات عندما يقوم المستخدم يسأل عنه. مواضيع باستخدام جافا سكريبت ، وتحميل البيانات تلقائيا دون الحاجة للمستخدم يطلب ذلك. مقال مقدم من سونيا Lande تنويه :موقعنا على الانترنت ليست مسؤولة عن محتوى هذه المادة. Webarticles هو حر للمعلومات. المهم : هذه المادة "خاصية تعدد في جافا سكريبت" وقد ترجم من قبل البرمجيات التلقائي. نشعر بالاسف من اجل أي الأخطاء الإملائية التي قد حدث. شكرا لتفهمكم.
|
|||||
| Online: 194 users browsing the articles directory |
|
|