PDA

View Full Version : سوال: حلقه در javascript



delasaee
دوشنبه 08 شهریور 1389, 12:30 عصر
سلام خدمت همه ی دوستان
مشکل کد من کجاس؟

وقتی که این اسکریپت رو چند بار کپی می کنم درسته


<script type="text/javascript">

$("#btn1").dblclick(function() {
$('#radiobt1 input[type=radio]:checked').removeAttr("checked");
});

</script>


<script type="text/javascript">

$("#btn2").dblclick(function() {
$('#radiobt2 input[type=radio]:checked').removeAttr("checked");
});

</script>


ولی من می خوام از حلقه استفاده کنم چون نزدیک 50 بار باید کد بالا رو کپی کنم
ولی کار نمی کنه




<script type="text/javascript">
var i=1
for (i=1;i<=50;i++)
{
$("#btn"+i).dblclick(function() {
$('#radiobt'+ i +' input[type=radio]:checked').removeAttr("checked");
});
}
</script>

امیـرحسین
دوشنبه 08 شهریور 1389, 20:44 عصر
چرا بجای حلقه و این کارا از کلاس و توابع Traversing استفاده نمی کنی که یکبار کد رو اجرا کنی؟
مثلا این شکلی:
$('.btns').dbclick(function() {
$(this).next('input[type=redio]:checked').removeAttr("checked");
});
این کد یکبار اجرا میشه. سعی کنید از قرار دادن کدهای تکراری در حلقه (از جمله تابع $ که به چشم نمیاد) خودداری کنید.

cups_of_java
سه شنبه 09 شهریور 1389, 00:25 صبح
سلام خدمت همه ی دوستان



<script type="text/javascript">
var i=1
for (i=1;i<=50;i++)
{
$("#btn"+i).dblclick(function() {
$('#radiobt'+ i +' input[type=radio]:checked').removeAttr("checked");
});
}
</script>


مشکل کد شما استفاده از متغیر محلی i (که در حلقه تعریف شده) در تابع "کال بک" که برای dblclick تعریف کردید، هستش. توی اون تابع نمی تونید از i استفاده کنید.

راه حلی که دوستمون گفتن، مناسب تر، منعطف تر و قشنگ تر هستش.

delasaee
سه شنبه 09 شهریور 1389, 11:19 صبح
چرا بجای حلقه و این کارا از کلاس و توابع Traversing استفاده نمی کنی که یکبار کد رو اجرا کنی؟
مثلا این شکلی:
$('.btns').dbclick(function() {
$(this).next('input[type=redio]:checked').removeAttr("checked");
});
این کد یکبار اجرا میشه. سعی کنید از قرار دادن کدهای تکراری در حلقه (از جمله تابع $ که به چشم نمیاد) خودداری کنید.

ممنون دوست عزیز
ولی من هنوز مشکل دارم
من دارم آزمون اینترنتی برگزار می کنم که از rediobuttonlist در asp.net استفاده کردم
فرض کنید 20 تا سوال دارم و 20 تا rediobuttonlist که هر کدیو آیدیشون به ترتیب rbl1,rbl2,... هست و همچنین 20 تا button جلوی هر radiobuttonlist برای حذف تیک که هر کدوم از این button ها هم به ترتیب آیدی دارن مثل btn1,btn2,...
کدی که شما دادید فکر می کنم برای یک button و حذف کل تیک ها است

mehdi.mousavi
سه شنبه 09 شهریور 1389, 12:02 عصر
ممنون دوست عزیز ولی من هنوز مشکل دارم من دارم آزمون اینترنتی برگزار می کنم که از rediobuttonlist در ASP.NET استفاده کردم فرض کنید 20 تا سوال دارم و 20 تا rediobuttonlist که هر کدیو آیدیشون به ترتیب rbl1,rbl2,... هست و همچنین 20 تا button جلوی هر radiobuttonlist برای حذف تیک که هر کدوم از این button ها هم به ترتیب آیدی دارن مثل btn1,btn2,... کدی که شما دادید فکر می کنم برای یک button و حذف کل تیک ها است

سلام.
خیر اینطور نیست. ایشون توی کدشون، نوشتن $('.btns'( و این در jQuery به این معناست که کلیه Element هایی رو که class اونها، btns هست رو انتخاب کن. سپس، dblclick به اون Element ها Bind میشه. هنگامیکه Double Click رخ داد، با $(this) نگاه می کنن ببینن روی کدوم element کاربر Double-Click کرده. اون element رو میگیرن، توی DOM Document، عنصر بعدی رو در صورتیکه radio button روشن شده ای باشه، انتخاب میکنن و اونو خاموش میکنن. اگر چه برای خاموش کردن Radio Button بهتره از

attr('checked', false);

استفاده بشه، چون بسیار خواناتر هستش.

در کل، همه این حرفهایی که گفتم به این معناست که شما باید در ASPX خودتون، برای کلیه Button ها، CssClass رو مساوی btns قرار بدید تا کد فوق درست کار کنه. (البته دقت کنید که ایشون جای radio به اشتباه redio نوشتن، حواستون به این مساله نیز باشه).

در کل، بهتره جای این خط

$(this).next('input[type=redio]:checked').removeAttr("checked");

از این خط استفاده کنید:

$(this).next('input:radio:checked').attr('checked' , false);

موفق باشید.

delasaee
سه شنبه 09 شهریور 1389, 14:17 عصر
سلام.
خیر اینطور نیست. ایشون توی کدشون، نوشتن $('.btns'( و این در jQuery به این معناست که کلیه Element هایی رو که class اونها، btns هست رو انتخاب کن. سپس، dblclick به اون Element ها Bind میشه. هنگامیکه Double Click رخ داد، با $(this) نگاه می کنن ببینن روی کدوم element کاربر Double-Click کرده. اون element رو میگیرن، توی DOM Document، عنصر بعدی رو در صورتیکه radio button روشن شده ای باشه، انتخاب میکنن و اونو خاموش میکنن. اگر چه برای خاموش کردن Radio Button بهتره از

attr('checked', false);

استفاده بشه، چون بسیار خواناتر هستش.

در کل، همه این حرفهایی که گفتم به این معناست که شما باید در ASPX خودتون، برای کلیه Button ها، CssClass رو مساوی btns قرار بدید تا کد فوق درست کار کنه. (البته دقت کنید که ایشون جای radio به اشتباه redio نوشتن، حواستون به این مساله نیز باشه).

در کل، بهتره جای این خط

$(this).next('input[type=redio]:checked').removeAttr("checked");

از این خط استفاده کنید:

$(this).next('input:radio:checked').attr('checked' , false);

موفق باشید.


سپاسگزارم از راهنمایی بسیار کاملتون
مطالب جدیدی یاد گرفتم ولی متاسفانه هنوز کد من کار نمی کنه
من radiobuttonlist va btn را به صورت داینامیک تولید می کنم


For i = 1 To 20
Dim rbl As New RadioButtonList
Dim lbl As New Label
lbl.Text = "سوال" & i
PlaceHolder1.Controls.Add(New LiteralControl("<img alt='حذف تیک' class='btns' id='btns' src='img/remove.png'/>"))
rbl.Items.Add(New ListItem("گزینه الف", "1"))
rbl.Items.Add(New ListItem("گزینه ب", "2"))
rbl.Items.Add(New ListItem("گزینه ج", "3"))
rbl.Items.Add(New ListItem("گزینه د", "4"))
rbl.ID = i



PlaceHolder1.Controls.Add(lbl)
PlaceHolder1.Controls.Add(rbl)
If i <> 20 Then
PlaceHolder1.Controls.Add(New LiteralControl("<hr>"))
End If
Next


و سپس در آخر صفحه این کد رو می نویسم



<script type="text/javascript">

$('.btns').dbclick(function() {
$(this).next('input:radio:checked').attr('checked' , false);
});
</script>


ولی وقتی روی عکسم (حذف تیک) 2 بار کلیک می کنم تیکم حذف نمی شود

mehdi.mousavi
سه شنبه 09 شهریور 1389, 17:04 عصر
سلام.
بر اساس کدی که نوشته اید، باید اینطوری عمل کنید:

<script type="text/javascript">
$(function () {
$('.btns').dblclick(function () {
$(this).next().next().find('input:radio:checked'). attr('checked', false);
});
});
</script>


چون ASP.NET اون RadioButtonList رو در یک Table رندر میکنه و ... در نتیجه کد اولی کار نمیکنه.
از اینها گذشته، شما دارید یک Label به Control Collection اضافه می کنید که این مساله فرضیات ما رو بهم ریخت.
در هر حال، کدی که دادم رو آزمایش کنید، قاعدتا باید جواب بده.

موفق باشید.