Boplo.ir
rss

من در Facebook


جستجو


آخرین مطالب

مطالب همینجوری

بر و بچ

MyView TakhteShasi Tween

دوستشون دارم

بیلبورد

دامین برای فروش: CleanCode.ir
FastFeed.ir
Fonvi.com

تماس


انواع و اقسام سفارشات طراحی و برنامه نویسی سایت پذیرفته میشه. از سایت حمایت از خرگوشهای صورتی گرفته تا سایت قاچاق اعضای بدن!
تماس

 

از بيماران سرطاني حمايت كنيم

A new begining
AHHP presents

 

آدرس کوتاه: http://Boplo.ir/:77

Delegation با اسب سفید
۱۶ اسفند ۱۳۸۸ ساعت ۰۲:۵۳

طراحی وب
توابع Delegation در فریم ورکهای MooTools و jQuery

همونطور که مستحضریم، جاوااسکریپت امکان تعیین Event رو به هر Element از صفحه میده که مثلا اگر فلان Element کلیک شد این اتفاقا بیافته و اگر یکی دیگه mouseover شد اون یکی اتفاقا بیفته و غیره. تعیین این Eventها از طریق Frameworkها مثل MooTools و jQuery عجیب آدم رو یاد هلو میندازه. مخصوصا که امکان تعریف Evnet های اختصاصی رو هم میدن مثل OnLoveBoplo، OnVisitBoplo و غیره.

این فریم ورکها، امکانی برای اجرای کد در زمان تکمیل DOM رو دارند که در MooTools رویداد domReady و در jQuery متد ()ready. که به ما امکان قرار دادن کدها رو در <head> صفحه میدن و خیلی کاربرد دارند. مثل کدهای زیر که وقتی هر لینکی کلیک شد، یه alert ناقابل نمایش میده:

// MooTools
window.addEvent('domready', function(){
	$$('a').addEvent('click', function() {
		alert("You've clicked " + this.href + "!");
	});
});

// jQuery
$(document).ready(function(){
	$('a').click(function() {
		alert("You've clicked " + $(this).attr('href') + "!");
	});
});

همونطور که گفتم این کد در زمان تکمیل DOM یکبار انجام میشه و Eventها رو تنظیم می کنه. همه چی آرومه و من خیلی خوشحالم تا اینکه یه جایی یک لینک توسط جاوااسکریپت ساخته میشه یا توسط Ajax به صفحه اضافه میشه و کاملا منطقی خواهد بود که چون موقع اجرای کدهای بالا اون لینک وجود نداشته، Eventاش هم Set نشده و کدهاش هم اجرا نخواهد شد. برای حل این مشکل سه راه وجود داره:

اولی اینکه DOM و <head> اینا رو بیخیال شیم، function بسازیم و به همه لینکها onclick اضافه کنیم که اصلا جالب نیست. روش دوم اینه که کار خودمون رو بکنیم ولی هر موقع لینکی به صفحه اضافه شد، کدهای بالا رو اجرا کنیم تا Eventها دوباره تنظیم شه که از نظر بهینگی مناسب نیست و اما روش سوم که مثل پست LazyLoad، یک تنبل دوست داشتنی از خلاقیت برنامه نویسها بوجود اومده، قابلیت Delegation است. Delegation نه تنها این مشکل رو حل کرده، بلکه از نمونه کد بالا هم بهینه تره. Delegation براساس Parent یا شاخه بالادستی عمل می کنه. به این ترتیب که Event برای Parent تنظیم میشه با این شرط که Element های موردنظر ما رو شامل بشه یعنی توی مثال این پست، من میگم توی <body> (همون Parentامون)، هر لینکی که کلیک شد (رویداد کلیک، روی Element موردنظرمون یعنی لینک)، فلان کدها اجرا بشه. مثلا:

// MooTools 1.2.4 + Element.Delegation
window.addEvent('domready', function(){
	$(document.body).addEvent('click:relay(a)', function() {
		alert("You've clicked " + this.href + "!");
	});
});

// jQuery 1.4.2
$(document).ready(function(){
	$(document).delegate('a', 'click', function() {
		alert("You've clicked " + $(this).attr('href') + "!");
	});
});

همونجور که میبینی، فرمت استفاده از این قابلیت در MooTools و jQuery متفاوته. MooTools بخشهای مورد نظر رو توسط عبارت relay میگیره و jQuery توسط پارامتر اول متد delegate. نحوه اجرا شدن این مثال به این شکله که برای <body> یک Event از نوع click تعریف شده و زمانی که اجرا میشه (یعنی کلیکی روی صفحه صورت میگیره) میاد چک می کنه که آیا Element کلیک شده، همون Element مورد نظر ماست یا نه (تو این مثال تگ <a>) که اگر بود، کدها رو اجرا می کنه.اینجوری اصلا مهم نیست لینکهای صفحه چطور بوجود میان و تغییر می کنند چون فقط در زمان Event سراغشون میریم. همچنین این روش از این نظر بهینه تر از روش قبلیه که توی روش اول، مثلا اگر در صفحه 100 تا لینک داشته باشیم، 100 هم Event تنظیم میشه ولی اینجوری فقط یک Event برای Parent تعیین میشه.

لازم به ذکر است که در زمان نگارش این پست، Delegation یک ویژگی جدیده و فقط در آخرین نسخه های ارائه شده MooTools و jQuery قابل استفاده است یعنی اگر خیلی وقت از تاریخ این پست نگذشته باشه، احتمالا باید فریم ورکت رو بروز کنی.

بروز باشید

 

تو چی فکر می کنی؟


حسن : Delegation اسم قلنبه‌ای داره، من تا مدت‌ها می‌ترسیدم برم سراغش ولی بعد فهمیدم چه چیز فوق‌العاده‌ای رو از دست دادم.
یه راه برای فریم‌ورک‌های قدیمی‌تر اینه:
<code>
$(parentElement).click(function(e){

if($(e.target).is('a')) {
// hello puppet!
}

})
</code>
(2 سال و 2 ماه و 13 روز و 11 ساعت و 7 دقیقه پیش)

امیرحسین : که این همون اجرای دستی Delegation در کدهاست...
(2 سال و 2 ماه و 13 روز و 6 ساعت و 53 دقیقه پیش)

احمد : سلام
یک متد live() در jQuery داریم. پس اون چیه؟ فرقش با delegate چیه؟

$('a').live('click', function() {
alert('You clicked ' + $(this).attr('href'));
return false;
});

در ضمن ممنون از مطالب بسیار عالی شما در این سایت
(7 ماه و 20 روز و 3 ساعت و 28 دقیقه پیش)

امیرحسین : delegate به یک المنت (Context) نسبت داده میشه ولی live به document نسبت داده میشه.
یعنی وقتی رویداد click رو توسط live ثبت کنیم، با هر کلیک روی صفحه (document) جی‌کوئری سلکتور رو چک میکنه (در مثال شما 'a') ولی delegate رویداد رو بجای document به سلکتور متصل میکنه.
در واقع delegate همون live هست که میشه context رو بهش داد تا بر روی document اجرا نشه.
مسلما delegate بهینگی بیشتری داره چون event رو به المنتهای محدودی منتسب کردیم ولی نکته‌ی مهم اینجاست که وقتی context مشخص می‌کنیم باید مطمئن باشیم که خود context همیشه ثابت باشه و تغییر نکنه! مثلا من اگر خود context رو با AJAX لود کنم و eventهاش از بین بره دیگه کار نخواهد کرد.
در این حالت چون live روی document اجرا میشه پس همیشه کار می‌کنه و اینکه سینتکس تمیزتری داره.

خلاصه اگر سلکتوری که delegate بهش چسبیده همیشه وجود داره، delegate از live بهتره.
(7 ماه و 19 روز و 13 ساعت و 46 دقیقه پیش)

اسحقی : اقای امیر حسین مطالب شما بسیار جالب و خواندنی هست و تفکرات شما هم قابل احترام
موفق باشید
(5 ماه و 23 روز و 18 ساعت و 22 دقیقه پیش)

 

me

امیرحسینم. اسمم رو دوست دارم، خودم رو دوست دارم. تهران زندگی می کنم. فارغ التحصیل مهندسی صنایع هستم. برنامه‌نویسی و طراحی وب می کنم. در واقع Web Developer محسوب میشم. برنامه نویسی و وقت گذرونی با وب تنها کاریه که خسته ام نمی کنه.
آدم خیلی سردی هستم، اینو دور و وری هام میگن. ولی به نظر خودم سرد نیستم در واقع گرمای خودم رو کم بروز می دم! آدما رو اغلب دوست دارم غیر از اون مواقعی که اونا من رو نادیده میگیرن!

این سایت رو بعد از کلی اینور اونور دوباره راه انداختم تا هرچی دوست دارم توش بنویسم، چه کسی بخونه چه نخونه.
خلاصه اینجا خونه منه،

به خونه امیرحسین خوش اومدی...

MODx | Template World