ماجرای چند فرم ، ایجکس ، جیکوئری

[size="4"][font="Tahoma"][right]داستان:

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

برای شفافیت بیشتر میتوانید عکسهای زیر را ببینید[/right][/font][/size]

1

2

[right][rtl][font="Tahoma"]

میشه بگید سناریوی شما چیه که هربار اینها id جدید هم می گیرند؟ همینطوری واسم جالبه بدونم

من تو همچین شرایطی یک data-attribute مشخص و یکسان به همه این فرمها میدم و بعدش برای onSubmit اون فرمها کد دلخواه ام رو مینوشتم. چیزی شبیه این:

[/font][/rtl][/right]




<form id="random-id" class="random-class" data-formtype="mylovelyform">

...

</form>


<script type="text/javascript">

$(document).ready(function(){

  $('form[data-formtype="mylovelyform"]').submit(function() {

    alert('yuhu!');

  }

</script>



فرض کنید 12 تا آیتم وجود داره و هر صفحه 6 تا از اونا را نشان میده پس با عوض کردن صفحه آیدیها هم عوض میشن. علت استفاده از آیدیهای منحصر به فرد برای هر آیتم هم اینه که اگه بخوام از یک کلاس به جای آیدیها استفاده کنم یا به همه آیدی یکسان بدم اونوقت هر ایونتی که بخواد اعمال بشه روی همه فرمها ایجاد میشه که این دقیقا چیزیه که نمیخوام.

سناریوی اصلی یک سایت گالری نقاشی که کاربر باید بتونه برای هر اثر کامنت بزاره و هر 6 اثر در یک صفحه باز میشن و باید بشه در همون صفحه برای همشون کامنت گذاشت بدون اینکه صفحه رفرش بشه و برای اینکه آیا کامنت با موفقیت ذخیره شده یا نه پیغامی به جای فرم یا درون فرم نوشته بشه.

از توجهت هم واقعا ممنونم

[right][rtl][font="Tahoma"]

الان راستش متوجه نشدم، ینی میفرمایید با این کد مشکل حل نمیشه؟ میشه ها! :)

شما داخل اونجا که alert کردم اگر مثلا فرم رو hidden کنید، (با $(this) به فرم دسترسی خواهید داشت) میبینید که فقط همون فرمی که submit شده مخفی میشه و بقیه سر جاشون میمونند. اگر اشتباه نکنم این همون چیزیه که شما میخواهید دیگه؟!

اتفاقا میتونید با همین روش تابع ajax مربوطه رو هم بنویسید و هر ۶ فرم به صورت مستفل میتونند تو سرور ذخیره شند

[/font][/rtl][/right]

[right]

یکی از مشکلات من هم توضیح این مسئله هست جوری که بقیه متوجه بشن ولی با توجه به جوابتون فکر کنم تا حد زیادی متوجه شدید.

من استفاده از

this

را امتحان کرده بودم ولی به طرز مرموزی کار نمیکنه[/right]

[right]برای مثال کد زیر همه فرمها را پنهان میکند[/right]


Yii::app()->clientScript->registerScript('comment_submission','$(document).ready(function(){

            $(this).submit(function(event){

	    event.preventDefault();

	    $("form").hide();

            });

        });',CClientScript::POS_HEAD);

[right]ولی کد زیر ارسال را انجام میده ولی پنهان شدن کار نمیکنه[/right]


Yii::app()->clientScript->registerScript('comment_submission','$(document).ready(function(){

            $(this).submit(function(event){

	    event.preventDefault();

	    $(this).hide();

            });

        });',CClientScript::POS_HEAD);

مشکوکه

[right][rtl][font="Tahoma"]

راستش اگر کدی که استفاده میکنید همین دومی باشه که نوشتید، خب selector شما اشتباهه. اون $(this).submit که نوشتید به document اشاره داره نه فرم! من اون data-attribute ها که اشاره کردم برای همین بود که یک selector صحیح به دست ما بده. شما عینا کدی که من تو پست اول نوشتم رو امتحان کنید، بعد لطفا نتیجه رو اطلاع بدید :)

[/font][/rtl][/right]