PDA

View Full Version : سوال: سوال در مورد رویداد ها در JS



prince4prodigy
دوشنبه 03 مهر 1391, 19:00 عصر
من تازه شروع به یادگیری JQuery کردم و الان در مبحث رویداد ها به یک مشکل برخوردم.
موضوع اصلی تفاوت ها در نحوه ی معرفی رویداد هست ؛ برای مثال میخوام بدونم فایده ی استفاده اجرای عملکرد به شیوه ی "حبابی" و "گیرانداز" چیه ؟ اگه با ذکر مثال بفرمائید ممنون میشم.
در ضمن بهتر نیست به جای انواع مختلف معرفی رویداد فقط از متدهای bind و live استفاده بشه و متدهایی مثل addEventListener رو کلا بیخیال شد؟

mrgraphy
دوشنبه 03 مهر 1391, 20:02 عصر
دوست عزیز addEventListener برای خود جاوااسکریپت هستش و ربطی به jquery نداره.
bind و live هم همه جا نمیتونن کاربرد داشته باشن مثل مواقعی که قراره برای یک action یک reaction هم تعریف بشه.

prince4prodigy
دوشنبه 03 مهر 1391, 20:09 عصر
میشه در مورد اجرای حبابی و گیر انداز هم یه توضیح بدید و فایده ی استفاده از اون ها

mrgraphy
دوشنبه 03 مهر 1391, 21:21 عصر
اجرای حبابی و گیرانداز؟
چنین چیزی تا به حال نه دیدم نه شندیم؟
منظورتون چیه؟
این چیزی که میگید اصطلاح انگلیسیش چیه؟

Variable
دوشنبه 03 مهر 1391, 22:16 عصر
دو روش در انتشار رویداد وجود داره
روش حبابی . و رو ش کپچرینگ


<body>
<ul>
<li>
<button> click me </button>
</li>
</ul>
</body>


شما وقتی روی یک باتن روی صفحه وب کلیک میکنید
مرورگر رویداد کلیک رو انتشار میده .به این اتفاق میگن . event propagaion

خب حالا ترتیب رسیدن این رویداد به عناصر صفحه مهمه .
مثلا . در روش کپچرینگ . Capturing
رویداد کلیک اول از شئی (عنصر) داکیومنت میگذره و اگه document یک ( تابع ) برای کنترل کردن رویداد کلیک داشته باشه .اون تابع اجرا میشه .
و بعد رویداد به عنصر body میرسه . اینجا هم اگه این عنصر یک تابع برای کنترل کردن این روبداد داشته باشه . اون تابع اجرا میشه
وبعد رویداد به ul میرسه . اگه این عنصر هم تابعی برای کنترل کردن رویداد داشته باشه . اون تابع اجرا میشه .
و بعد رویداد به li میرسه . اگه این عنصر هم تابعی برای کنترل کردن رویداد داشته باشه . اون تابع اجرا می یشه
و بعد تابع به button میرسه . اگه این عنصر هم تابعی برای کنترل کردن رویداد داشته باشه . اون تابع اجرا میشه


رویداد حبابی Bubbling
وقتی مرورگر رویداد رو انتشار میده .
مثله این که این رویداد از کف دریا به سمت آب میاد .
یعنی وقتی روی Button کلیک میشه . اول این عنصر . یا عمیق ترین عنصر از اون رویداد مطلع میشه . ( یا رویداد بهش میرسه .)
که تو مثال من . عنصر Button است . که اگر این عنصر یک تابع برای کنترل کردن رویداد داشته باشه . اون تابع رو اجرا میکنه .
و بعد li
و بعد ul
و بعد body
و بعد document


......
خب حالا کدوم . حبابی یا کپچرینگ ؟
این داستان بر میگرده به خیلی وقته پیش . وقتی که فقط مرورگرهای (نت اسکیپ) بود و IE
که خیلی جالب هر کدوم از این مرورگرها . روش متفاوت بادیگری رو بکار میبردند
به طوریکه IE از روش حبابی و نت اسکیپ فقط از روش کپچرینگ استفاده میکرد.

با اومدن استاندارد سطح 2 dom .
این استاندارد انتشار رویداد رو در سه مرحله انجام میدهد.
مرحله اول ) رویداد به صورت کپچرینگ عمل میکنه .و به سمت عنصر هدف حرکت میکنه
مرحله دوم ) رویداد در عنصر هدف بکار میره .
مرحله سوم ) رویداد از عنصر هدف دوباره به بالا حرکت میکنه . حبابی

مرورگرهای فایرفاکس سافاری و اپرا . هر سه فاز رو پشتیبانی میکنند.

حالا فایدش :( شاید اشتباه بگم )
حبابی بهترین استفادست.
ساده ترین حالتش پیدا کردن عنصر هدف هست.
مثلا شما یه صفحه پر از عناصر تو در تو دارید.
ببینید. گاهی میخای از انتشار رویداد به سطح بالا تر جلو گیری کنی.
یا میخای وقتی رو عنصر فرم راست کلیک کردی . این رویداد به عنوان راست کلیک روی صفحه وب تعبیر نشه . (اینجور مواقع میتونی از رفتن رویداد به سطح بالا تر جلوگیری کنی)



دوست عزیز addEventListener برای خود جاوااسکریپت هستش و ربطی به jquery نداره.
در ضمن باید بگم.
جی کوئری و جاوا اسکریپت از هم جدا نیستن .در واقع جاوا اسکریپت رو میتونید پدر جیکوئری بدونید. پس فرزند میتونه تمام خصوصیات پدر رو به ارث ببره .
addEventListener متد پدر است. که برای تعریف کنترل کننده رویداد به کار میره.
bind , live هم متد های فرزند هستند که برای کارهاشون از میراث پدری ( همون متد addEventListener ) استفاده میکنند.

prince4prodigy
دوشنبه 03 مهر 1391, 22:59 عصر
ممنون از پاسخ کاملتون.
آیا در هنگام استفاده از متدهای bind و live هم عملکرد های حبابی و کپچرینگ به صورت دستی مطرح هست یا این که به طور خودکار انجام میشن؟

Variable
سه شنبه 04 مهر 1391, 00:06 صبح
الان روش مناسبی که وجود داره همون حبابی هست.
که جیکوئری هم افکر میکنم فقط به همین روش بسنده کرده و دیگر کارو مشکل نکرده
یعنی به طور پیشفرض برای جاوا اسکریپت روش حبابی هست . و جیکوئری هم از همین رویه استفاده کرده .

abdollah_sam
پنج شنبه 05 بهمن 1391, 01:27 صبح
سلام
كاش يه مثال كاربردي با توضيح برا addEventListener ميگفتين.
با تشكر

Variable
پنج شنبه 05 بهمن 1391, 02:20 صبح
یه مثال تو این صفحه هست میتونی کامل ببینی


یک اسلاید شو برای خودتون بسازید ... (http://barnamenevis.org/showthread.php?351483-%DB%8C%DA%A9-%D8%A7%D8%B3%D9%84%D8%A7%DB%8C%D8%AF-%D8%B4%D9%88-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AE%D9%88%D8%AF%D8%AA%D9%88%D9%86-%D8%A8%D8%B3%D8%A7%D8%B2%DB%8C%D8%AF-...)

jalil_gh
پنج شنبه 10 اسفند 1391, 12:03 عصر
خاستم یادآوری کنم که live و bind دیگه منسوخ شده و بهتره به جاش از on استفاده کنید.
مورد دیگه اینه که جاوااسکریپت رو نمیشه با جی کوئری مقایسه کرد. جاوااسکریپت یک زبان برنامه نویسیه در حالی که جی کوئری یک کتابخانه برای جاوااسریپته. به زبان ساده تر جی کوئری یک سری توابع هست که قبلا توسط کسای دیگه ای نوشته شده و شما از اونا استفاده می کنید.
در مورد addEventListener هم لازمه بدونید وقتی شما تو جی کوئری از رویدادی رو تعریف می کنید

$('button').on('click', function(){});

جی کوئری تو پشت صحنه از addEventListener استفاده می کنه.

2undercover
پنج شنبه 10 اسفند 1391, 14:30 عصر
جان من تاپیکه قدیمی رو بالا نیارید!