في معرض 3 يوي : مات تايلور RaphaelJS الوحدة

27 سبتمبر 2010 في 01:05 من ماثيو تايلور | في التنمية ، يوي 3 معرض | 9 تعليقات

مات تايلور ( @ rhyolight ، بلوق ) يعمل لياهو على جانب جافا سكريبت إطار مستعرض الداخلية. يحب العمل مع الرسومات ، وكان يعمل مع الرسومات والصور المتحركة قبل استخدام Java2d المكتبات. قبل ان ينتقل الى وادي السليكون للعمل من أجل ياهو ، عملت مات في منطقة سانت لويس كمقاول البرمجيات. وعمل أيضا في نطاق واسع مع رائع و الكؤوس المقدسة تكنولوجيات SpringSource. وكان مبرمج يؤدي الأصلي للYUI2 المستندة GrailsUI المساعد للإطار ويب الكؤوس المقدسة.

RaphaelJS هي مكتبة جافا سكريبت القوية التي تدير اساسا الرسومات والصور المتحركة. انها تسمح لك بسهولة لخلق اللوحات اساسا ورسم الأشكال الأساسية والمسارات بسهولة جدا ، حتى تجمع لهم في مجموعات والتحولات التي تنطبق على واحد أو العديد من ناقلات. يمكنك رسم الأشكال ، ومعالجة الصور ، وتنشيط كل شيء. RaphaelJS يوفر لطيفة المعهد لإنشاء وتعديل العناصر اساسا مع سهولة.

في حين أن المكتبة هي مثيرة للإعجاب ، ولكني وجدت أن أستطيع أن أضيف بعض السمات الهامة لعناصر من مكتبة RaphaelJS مع YUI3. لقد بدأ تشغيل هذه الجهود مع الجديد وحدة معرض RaphaelJS .

RaphaelJS تحميل كسلان والإضافات

الميزة الأولى هي كسول التحميل من مكتبة RaphaelJS ليس فقط ، ولكن أي RaphaelJS الإضافات قد تحتاج إليها. في معرض RaphaelJS الوحدة سيتم تحميل هذه الملفات فقط عندما تقوم بتعريفه عليك أن تكون استخدامها داخل رمل يوي. على سبيل المثال :

 
 يوي ({معرض : 'معرض - 2010/9/22 ، 20-15'}) استخدام ('معرض - رافائيل ، وظيفة (ص) {
 
	 ي رافائيل (). استخدام (وظيفة) رافائيل) {
		
		 / / استخدام رافائيل هنا كأنك خارج يوي
		 فار = ورقة رافائيل ('myPaper ، 500 ، 500) ؛
 
	 }) ؛
 
 }) ؛

إذا كنت تستخدم المحمول RaphaelJS ، وتحديد مساراتها في صفيف وإرسال التي تستخدم كمعلمة الأول في رافائيل ي () () وظيفة :

 
 يوي ({معرض : 'معرض - 2010/9/22 ، 20-15'}) استخدام ('معرض - رافائيل ، وظيفة (ص) {
 
	 فار myPlugins = ['الإضافات / raphael.awesomePlugin.js' ، 'الإضافات / raphael.wickedPlugin.js'] ؛
 
	 ي رافائيل (). استخدام (myPlugins ، وظيفة (رافائيل) {
 
		 / / استخدام رافائيل هنا كأنك خارج يوي
		 فار = ورقة رافائيل ('myPaper ، 500 ، 500) ؛
		 / / أن 'ورقة' لديها أي وظائف جديدة أضيفت من قبل المحمول الخاص بك الآن
	 }) ؛
 
 }) ؛

يتم تحميل مكتبة RaphaelJS أولا ، ثم يتم تحميل أي ملحقات المحدد قبل تنفيذ الدالة رد الاتصال الخاصة بك مع هدف رافاييل كمعلمة فقط.

أحداث مخصص

بمجرد إنشاء مساحة الرسم مع الكائن رافائيل ، ثم يمكنك الحصول على الفور وصولا الى الرسم. عند استدعاء أساليب مثل rect ، circle ، و path على مساحة الرسم ، سوف تتلقى عودة الكائنات التي تمثل ناقلات اساسا. عادة ، سيكون لديك الوصول إلى العناصر المقابلة دوم من خلال node الممتلكات. على سبيل المثال :

 
 فار = ورقة رافائيل ('myPaper ، 500 ، 500) ؛
 فار paper.rect مربع = (0 ، 0 ، 100 ، 100) ؛

هذا بإنشاء كائن متجه مستطيلة في الإحداثيات [0،0] مع عرض وارتفاع 100 بكسل. لديك حق الوصول إلى العنصر دوم الأساسي (الذي هو اساسا rect عنصر) كما يلي :

 
 فار = rectNode square.node ؛
 rectNode.onclick = الدالة () {
	 تنبيه ('تهانينا ، نقرت مربع!') ؛
 } ؛

إذا كنت من مستخدمي متعطشا يوي ، ربما كنت ترغب شيئا أكثر من هذا. كيف بنيت في Y.Node كذلك؟ مثلما هو الحال في node الملكية يشير إلى HTMLElement خلف الكائن اساسا ، و $node الملكية يشير إلى Y.Node المجمع لذلك العنصر. بحيث يمكنك أن تفعل أشياء من هذا القبيل :

 
 مربع. node.on $ ('تمرير الماوس ، الدالة () {
	 تنبيه ('تهانينا ، يمكنك تحريك الفأرة!') ؛
 }) ؛

دعونا نجرب شيئا أكثر تعقيدا الآن. وينبغي أن يكون التفاعل مع ناقلات واحد يكون قادرا على سبب آخر ناقلات الانتباه إلى تحديث أساليبها ، أليس كذلك؟ كيف نخلق بعض الحانات التي تقدم كل الألوان التي تعتمد على المكان الذي يقع الفأر على دائرة على الصفحة :

 
 فار = ورقة رافائيل ('rcanvas ، 600 ، 800) ؛
 
 فار = paper.circle جنة تنظيم التأمين (350 ، 200 ، 100) attr ({ملء : 'بينك' والسكتة الدماغية : 'أسود'}) ؛
 
 / / دفع حفنة من المستطيلات في صفيف
 فار ط = 0 ؛ المستطيلات = [] ؛
 ل (، وأنا أقل من 10 ، وأنا + +) (
	 rectangles.push (paper.rect (0 ، 40 * ط ، 200 ، 20) attr ({ملء : 'الأحمر' والسكتة الدماغية : ''}))؛ الصفراء
 }
 
 / / حلقات عبر المستطيلات ، مضيفا معالجات محددة لكل دائرة mousemove
 Y.Array.each (مستطيلات ، وظيفة (احداثيات ، مؤشر) {
	 مؤشر فار = ط + 1 ؛
	 جنة تنظيم التأمين. node.on $ ('mousemove' ، وظيفة (evt) {
		 / / لون التعبئة الحيوية ، تعتمد على موقع هذا المستطيل
		 / / في الصفيف فضلا عن موقع الماوس
		 فار = circ.attrs.cx المجلة -- circ.attrs.r ،
			 غ = circ.attrs.r * 2 + المجلة ،
			 س = evt.clientX -- القوات اللبنانية ،
			 الأعلى = circ.attrs.cy -- circ.attrs.r ،
			 بطم = 2 circ.attrs.r * + افضل ،
			 ص = evt.clientY -- الأعلى ؛
			 أحمر = (((128 * س) / (2 * circ.attrs.r)) -1) * ط / 6 ،
			 أخضر = 256 -- ((((128 * س) / (2 * circ.attrs.r)) -1) * ط / 6) ،
			 أزرق = (((ص 128 *) / (2 * circ.attrs.r)) -1) * 6 / ط ؛
		 rect.attr ('ملء' ، 'rgb ('' + أحمر + '،' + أخضر + '،' + أزرق + ')')؛
	 }) ؛
 }) ؛

هذا المثال يستخدم هنا ، ولكن كما ترون في لقطات أدناه ، لون كل شريط يعتمد على مكان الماوس فوق الدائرة ، وكذلك الأمر في نقابة المحامين.



تبعا للمكان الذي يقع مؤشر الماوس على الدائرة ، وألوان شريط تغيير بشكل فردي.

بحيث يمكنك أن ترى أن $node هو اختصار مفيدة ، ولكن لا شيء مذهل. وسيكون حقا رائعة إذا كان كل اساسا الكائن الذي خلق مع RaphaelJS يمكن النار أحداث مخصصة . ومن شأن ذلك أن السماح لعناصر الرسم الفردية لاطلاق النار أحداث مخصصة ، وأي شيء على صفحة ويمكن الاستماع والاستجابة. قد يكون هذا مفيدا في نواح كثيرة. بالنسبة للمبتدئين ، ويوفر التفاعل بين الأغنياء الرسومات الخاصة بك. يمكن التفاعل مع المستخدم واحد متجه الآن أي إخطار ناقلات أخرى من التفاعل على الطلب. هذا يعني أنه يمكنك برمجيا النار الأحداث من الرسومات الخاصة بك عندما يتم استيفاء شروط معينة. وهذا لا يسمح الرسومات الخاصة بك لإعلام ناقلات أخرى ، ولكن أي شيء على الصفحة يمكن الاستماع فيها.

 
 فار = ورقة رافائيل ('rcanvas ، 600 ، 800) ؛
 
 فار = paper.circle جنة تنظيم التأمين (350 ، 200 ، 100) attr ({ملء : 'بينك' والسكتة الدماغية : 'أسود'}) ؛
 
 / / صنع صفائف المستطيلات والدوائر
 فار ط = 0 ، المستطيلات = [] ، والدوائر = [] ؛
 ل (، وأنا أقل من 10 ، وأنا + +) (
	 rectangles.push (paper.rect (0 ، 40 * ط ، ط * 40 ، 20) attr ({ملء : 'الأحمر' والسكتة الدماغية : ''}))؛ الصفراء
	 circles.push (paper.circle (0،0،20) إخفاء ()) ؛
 }
 Y.Array.each (مستطيلات ، وظيفة (احداثيات ، مؤشر) {
	 مؤشر فار = ط + 1 ؛
	 جنة تنظيم التأمين. node.on $ ('mousemove' ، وظيفة (evt) {
		 فار = circ.attrs.cx المجلة -- circ.attrs.r ،
			 غ = circ.attrs.r * 2 + المجلة ،
			 س = evt.clientX -- القوات اللبنانية ،
			 الأعلى = circ.attrs.cy -- circ.attrs.r ،
			 بطم = 2 circ.attrs.r * + افضل ،
			 ص = evt.clientY -- الأعلى ؛
			 newWidth = (((256 * س) / (2 * circ.attrs.r)) -1) * ط / 6 ،
			 أحمر = (((128 * س) / (2 * circ.attrs.r)) -1) * ط / 6 ،
			 أخضر = 256 -- ((((128 * س) / (2 * circ.attrs.r)) -1) * ط / 6) ،
			 أزرق = (((ص 128 *) / (2 * circ.attrs.r)) -1) * 6 / ط ؛
		 / / هذا الوقت ، وليس فقط تغيير اللون ، ولكن أيضا عرض المستطيل
		 rect.attr ({
			 العرض : newWidth ،
			 ملء : 'rgb ('' + أحمر + '،' + أخضر + '،' + أزرق + '')'
		 }) ؛
		 / / اطلاق النار حدث مخصص لإعلام أن هذا العرض قد تغيرت المستطيل
		 rect.fire ('عرض ، تغيير ، {العرض : newWidth ، المصدر : احداثيات والنظام : مؤشر}) ؛
	 }) ؛
	
	 / / كل مستطيل يحصل على المستمع ان الحرائق على العرض دون تغيير
	 rect.on ('عرض ، تغيرت ، وظيفة (evt) {
		 فار = attrs evt.source.attrs ؛
		 / / الحصول على دائرة المناظرة ونقلها إلى الطرف الأيمن من المستطيل
		 الدوائر [evt.order]. attr ({
			 معادل : attrs.x + attrs.width ،
			 قبرصي : attrs.y ،
			 ملء : 'cornflowerblue'
		 .}) عرض () ؛
		
	 }) ؛
	
 }) ؛

نلقي نظرة على هذا المثال يعمل هنا . يمكنك أن ترى أيضا من لقطة أدناه التي يجري استخلاصها الدوائر على الحق ينتهي من المستطيلات. هذا يحدث ردا على اطلاق كل مستطيل الفرد حدث مخصص ، يجري صيدها من قبل معالج الذي يتحرك في الدائرة إلى الموقف بالنسبة للسمات الحالية للمستطيل.

هذا يفتح بعض possiblities مثيرة للاهتمام لRaphaelJS داخل YUI3. على سبيل المثال ، ماذا لو كنا نستطيع إنشاء مجموعة من الأشكال ناقلات مع الفريق نفسه هو الكيان الذي حرائق الأحداث إلى العالم الخارجي؟ داخليا ، ويمكن لكل الرسم التواصل مع ناقلات الحاويات من خلال أحداث مخصصة ، والحاوية سيتخذ قرارات حول ما البيانات التي حرائق على العالم الخارجي. هذا يفتح فكرة مغلفة بشكل كامل ، وضوابط اساسا التفاعلية.

موجز

مع صعود HTML5 والتقنيات التابعة لها ، وهناك الكثير من الخيارات الأخرى أكثر من فلاش لتفاعلات الغنية. ومن الناحية المثالية ، ينبغي أن تنقلها أية عناصر على الصفحة تكون متاحة تماما وموحدة. هذا يفتح possiblities رائعة بالنسبة لنا لخلق الوصول ، وضوابط ويب قياسي من دون اللجوء الى فلاش. اساسا هو خيار جذابة لأن كل تدعمها ناقلات رسمها على صفحة بنسبة عقدة دوم أن نتمكن من تعديل مع يوي تماما مثل أي عقدة دوم الأخرى. هذا ما يسمح لل معرض RaphaelJS الوحدة لزيادة كافة الكائنات اساسا يجري إنشاؤها بواسطة RaphaelJS ، وهذا هو المفتاح لالغنية التفاعل مع هذه elments من مكان آخر في الصفحة.

وتوسيع نطاق مشاركة : احفظ مع del.icio.us | يسو أنها! | صديق!

9 تعليقات »

آر إس إس للتعليقات على هذه الوظيفة.

  1. اذا نظرتم الى الداخلية لرافاييل ، وقليلا أكثر من ثلث الصفقات مع رمز VML مع المبلغ نفسه تقريبا للاساسا. هل هناك أي فرصة للحصول على تحميل يوي المشروط للعمل هنا أو هناك ترخيص / مبلغ من جهد في الحصول على الحواجز رافائيل نفسها من انقسام واستضافت؟ (فائدة جانبية لتحميل السرد العمل فعلا)

    تعليق من قبل مجموعة كارل -- 27 سبتمبر 2010 #

  2. أمرين :

    1) رافائيل هو مجمع ل* اساسا وVML * ويشمل فقط الأشياء التي تعمل في كلا. عند تشجيع ملحقات ، لا تحذير القوم عدة مرات انها لن تفشل في آي إي. إذا كانوا لا يعيرون اي اهتمام ، ودفع غرامة ، ولكن يجب تحذيرهم.

    2) أنت دعوة الناس إلى عالم من الألم في الوصول إلى التوصية. العقدة. وهناك عدد من العمليات (والذي يتغير مع كل إصدار ، وبين شعار و/ VML) سبب ليعاد العقدة ، لذلك سوف تضيع معالجات الحدث والعقدة الخاص ي أو الرجوع إلى كائن محذوف. وأخيرا محتويات عقدة تختلف على منصة وليس مجرد واحد العقدة -- وخصوصا عندما كنت تنظر في النص ، حيث يمكنك الحصول على ما لا يقل عن كائن واحد لكل حرف -- ومرات عديدة ، ومعالجات الأحداث الماوس فقط على الزناد والحبر ، وعندما يقوم المستخدمون نتوقع الخلية أن تكون نشطة.

    تعليق كليفورد هيث -- 27 سبتمبر 2010 #

  3. writeup كبيرة والعروض ،

    منذ كنت إيه نعم! 'القرصنة بعيدا عن رافائيل ربما كنت أعرف بعض التفاصيل عن آخر على الرسم البياني / رسم الجهود ليوي؟

    ربما شيء بنيت على قمة رافائيل؟

    أنا من محبي رافائيل ، ولكن هذه المخططات مكتبة يغادر الى المستوى المطلوب قليلا ، وكذلك بعض الأمثلة التي تم إنشاؤها باستخدام الرسم البياني الخام خارج المربع ، يا رافائيل هي وسيلة أكثر وظيفية / التفاعلية

    أحب أن أرى بعض نعم! رش شبيبة سحرية في هذا المجال

    تعليق نيت -- 27 سبتمبر 2010 #

  4. شكرا لردود الفعل.

    @ كارل : إذا فهمت بشكل صحيح ، لفكرتك في العمل ، وأود أن كسر ملف raphael.js إلى قطع غيار للاساسا وVML. أنا لا تخطط للمس RaphaelJS مكتبة في كل شيء ، لذلك التحميل سيبقى على الأرجح كما هو.

    @ كليفورد : (1) وهذا هو نقطة جيدة أن شخصا ما تربى على القائمة البريدية Raphaeljs كذلك. أنا لست قلقة بشكل خاص إزاء هذه الوحدة العاملة في معرض آي إي ، ولكن هذا هو ترفا. لا يزال يحتاج الاختبار في شركة آي إي (على الرغم من أنني أعتقد أنه سوف يعمل بشكل جيد). وانا ذاهب الى أن يتم تشغيل الاختبارات في شركة آي إي لهذا الاسبوع القادم وحدة ، ولذا فإنني سوف نعرف على وجه اليقين. في غضون ذلك ، أنا وضعت تحذيرا حتى على صفحة وحدة نمطية. (2) شكرا ليصل رؤساء. يجعلني أتساءل عما إذا كان يمكن تحديد العمليات التي تسبب يعاد العقد الجديد وضمان الملكية عقدة دولار ملفوفة في عقدة ي. سأكون الغوص أعمق بكثير في RaphaelJS في وقت قريب جدا ، لذلك سوف تعقب ذلك ، ونأمل أن تكون قادرة على إعادة الممتلكات عقدة يوي على كل عملية عقدة clobbering.

    @ نيت : أنا لا أعرف بعض التفاصيل ، ولكن سوف أترك للفريق يوي التعامل مع أعمالهم هناك. ؛). وأنا ، ومع ذلك ، مثيرة جدا للاهتمام في رش بعض شبيبة يوي السحر في الملعب HTML5 رسومات جديدة.

    تعليق من جانب ماثيو تايلور -- 27 سبتمبر 2010 #

  5. هل تعرف ما إذا كان هذا الأسلوب أو تقنية مشابهة سوف تعمل مع عنصر قماش أتش تي أم أل 5. إذا كنت وضع أتش تي أم أل 5 قماش على صفحة ويب مع مستطيل في ذلك ، هل من الممكن الاستماع إلى أحداث الماوس على المستطيل في قماش.

    إذا كان لي HTML5 صفحة تحتوي على ما يلي.

    يتم عرض هذا النص إذا كان متصفحك لا يدعم HTML5 قماش.

    فار سبيل المثال = document.getElementById ('مثال') ؛
    فار = السياق example.getContext (د '2') ؛
    context.fillStyle = "rgb (255،0،0)" ؛
    context.fillRect (30 ، 30 ، 50 ، 50) ؛

    التي أخذت من هذا الموقع :
    http://en.wikipedia.org/wiki/Canvas_element

    هل من الممكن لالتقاط أحداث الماوس على أشكال مختلفة على قماش باستخدام يوي. هل من الممكن وضع ما يشبه المجمع عقدة يوسف على المستطيل في قماش على غرار ما تقومون به مع عناصر في RaphaelJS.

    شكرا

    تعليق على يد يوحنا -- 28 سبتمبر 2010 #

  6. جعل لكم التعليق :
    "
    إذا كان كل اساسا الكائن الذي خلق مع RaphaelJS يمكن النار أحداث مخصصة.
    "
    استعراض بسرعة على مجموعة كاملة من الأحداث أعد بسهولة مع رافائيل...
    http://www.irunmywebsite.com/raphael/additionalhelp.php؟q=usingelementevents
    يمكنك تعيين هذه إلى كائنات رافائيل...

    تعليق من جانب تشارلز -- 28 سبتمبر 2010 #

  7. @ جون : الرسم على العلامة قماش هو ممارسة الكثير من مختلف مع رافائيل واساسا (VML). ناقلات والدولة ، ويمكن نقلها ، الرسوم المتحركة ، وتفاعلوا معها. الرسم على القماش هو أشبه رسم صورة نقطية. مرة كنت ترسم شيئا ، فإنه عالق هناك كجزء من خلفية قماش ، ولست متأكدا بالضبط كيف تعمل التفاعلات المستخدم.

    تعليق من جانب ماثيو تايلور -- 28 سبتمبر 2010 #

  8. @ تشارلز : نعم! أن تكون قادرة على الوصول إلى عقدة اساسا هو لطيف لتلك الأنواع من تفاعلات المستخدم ، ويستخدم هذه العروض بلدي لا بأس به. نوع من أحداث مخصصة أنا أتحدث عن الأحداث التي تقع خارج نطاق الأحداث دوم العادي.

    في الماضي بلدي على سبيل المثال أعلاه ، يمكنك أن ترى أن كل مستطيل يطلق width-changed كلما حدث تغيير حجم هم. يمكن ضبط هذه الأحداث من قبل أي شيء على الصفحة التي تسجل لهذا الحدث. هذه هي الطريقة التي يتم نقل كل دائرة إلى الموقف الصحيح كما يتم تغيير حجم المستطيلات.

    بطبيعة الحال ، ومحفز للجميع وهذا هو mousemove الحدث الذي يحدث في دائرة كبيرة ، وهو ما حدث نوع من اعتقد كنت تقصد. يرجى تصحيح لي إذا كنت قد غاب عن شيء.

    تعليق من جانب ماثيو تايلور -- 28 سبتمبر 2010 #

  9. @ جون ،

    فمن الممكن ، ولكن الفوضى. عليك أن تحتفظ بسجل (أي تجزئة) من النقاط المثيرة للاهتمام ، ومن ثم يكون المستمعين التي تعلق على عنصر قماش. عندما تحصل على حدث ما ، فعليك أن تأخذ انها coords س ص ومقارنة التجزئة الخاص من النقاط المثيرة للاهتمام ، ومن ثم إطلاق النار ربما حدث مخصص.

    لقد فعلت هذا مع YUI2 ، وخلق الرسم البياني للرادار التي تسمح لك انقر على نقاط البيانات على الرسم البياني للحصول على معلومات ، وإضافة البيانات من خلال النقر على tickmarks على المحاور. مع excanvas هذا يعمل على آي إي ، وأيضا ، ويحتوي على ميزة بالنسبة لي من كونه صورة (على الرغم من أي أبطأ).

    ومع ذلك ، هذا هو كل شيء مع نقاط ، وعدد محدود نسبيا من النقاط في ذلك ، والتحقق من ذلك إذا كان الماوس من المثير للاهتمام في مكان ما غير الكثير من العمل. ولكن مع المناطق وأظن أن هذا سيحصل مكلفة للغاية ، وكنت ربما تريد أن نفكر في طريقة لمجرد الاستماع ل"mousein" (أي عبور خط) بدلا من تمرير الماوس. حتى مع نقاط ، ما عليك القيام به بعض المسح ، كما يشير وبكسل والمستخدمين تتوقع فوق دقة بكسل لا يجعل من السهل للمستخدم التفاعل!

    يمكنك القيام به 'الرسوم المتحركة' ، نوعا ما ، أيضا ، ولكن ذلك ينطوي على إعادة رسم اللوحة في كل مرة ، لذلك هم أكثر التحولات من الرسوم المتحركة. أنا خلقت RenderStack بسيطة للأشياء وأنا أعلم لن تتغير كثيرا (محاور على سبيل المثال) التي تملأ أنا مع دعوات لوحة الرسم القماشية ، ومن ثم إطلاق النار المكدس ، ولذا فإنني لا تملك أن تفعل الرياضيات في كل مرة. لكنني لست متأكدا من مدى الاختلاف وهذا ما يجعل حقا ، انها لا تزال بطيئة وسريعة في شركة آي إي في كل شيء آخر!

    مات

    تعليق بواسطة مات باركر -- 29 سبتمبر 2010 #

اترك التعليق

ملاحظة : التعليقات خاضعة للإشراف هي لتوقيت والعشرين. حذف الرسائل غير المرغوب فيها.

datetime=""> <del: <aالأقسام المختلفة title=""> <abbrhref="" title=""> <acronymtitle=""> <b><blockquotecite=""><cite><code>< <em><i><qcite=""> <strike><strong>

استضافته ياهو

جميع الحقوق محفوظة © 2006-2011 ياهو! جميع الحقوق محفوظة سياسة الخصوصية -- شروط الخدمة

بدعم من وورد على ياهو! استضافة المواقع .