PDA

View Full Version : مشکل در استفاده از دو for در جاوا اسکریپت



fun_9990
یک شنبه 24 اردیبهشت 1396, 02:02 صبح
وقتی می خوام دو متغیر رو بفرستم در قالب دو innerhtml هر دو توسط for دومی اعمال میشه

من چطور می تونم به ازای هر innethtml براش for مربوط به خودش رو بفرستم

یه مثال می زنم


console.log = function(msg) {document.body.innerHTML += '<p>' + msg + '</p>';};


var funcs = {};
for (var i = 0; i < 3; i++) {
funcs[i] = wrapper(i);
}
for (var j = 0; j < 3; j++) {
funcs[j]();
}
//creates a separate environment for the inner function
function wrapper(ilocal) {
return function() { //return the inner function
console.log("My value: " + ilocal);
};
}

چطور میشه کد رو به صورتی در آورد که هر for به طور جداگانه مقدار مربوط به خودش رو نشون بده

fun_9990
سه شنبه 26 اردیبهشت 1396, 01:22 صبح
از عزیزان کسی راهنمایی نداره ؟

plague
سه شنبه 26 اردیبهشت 1396, 19:34 عصر
از عزیزان کسی راهنمایی نداره ؟

چرا .... سوالت رو بد توضیح دادی قابل فهم نیست که چی داری میپرسی
استفاده از http://jsfiddle.net برای نوشتن و ارائه کد هم میتونه به درک سوال کمک بکنه

fun_9990
سه شنبه 26 اردیبهشت 1396, 22:59 عصر
چرا .... سوالت رو بد توضیح دادی قابل فهم نیست که چی داری میپرسی
استفاده از http://jsfiddle.net برای نوشتن و ارائه کد هم میتونه به درک سوال کمک بکنه
حق با شماست
یک مثال دیگه می زنم که قابلیت پاسخ به قول شما داشته باشه
فرض کنید کد html ما این هست


<input type="button" value="Test" onclick="nemi()"/>
<br/>
<input type="text" id="red1" />
<br />
<input type="text" id="red2" />

و کد جاوااسکریپت ما این هست


function nemi()
{
var myida = document.querySelectorAll("[id^=red]");
var myidb = document.querySelectorAll("[id^=red]");
for (var j = 0; j < myida.length; j++)
{
myida[j].value = 1;
}
for (var n = 0; n < myidb.length; n++)
{
myidb[n].value = 2;
}}


الان اینجا خروجی for اول به دلیل آخرین حلقه ای که برنامه می خونه عملا حذف میشه و نمی شه خروجی اون رو مشاهده کرد

plague
چهارشنبه 27 اردیبهشت 1396, 06:00 صبح
مشکل کد شما ربطی به حلقه ها ندارن مشکل اینه که سلکتوراتون دقیقا یکی هستن
در نتیجه توی هر دو متغیر دارن به المنت های یکسانی اشاره میکنن
به طور خلاصه داری میگی که توی اون 2 تا فیلد 1 بریز بعد میگی توی اون 2 فیلد 2 بریز انتظار دارید چه اتفاقی بیفته ؟ توی اولی 1 و توی دومی 2 ریخته بشه ؟
https://jsfiddle.net/196fsvq1/

fun_9990
پنج شنبه 28 اردیبهشت 1396, 17:41 عصر
مشکل کد شما ربطی به حلقه ها ندارن مشکل اینه که سلکتوراتون دقیقا یکی هستن
در نتیجه توی هر دو متغیر دارن به المنت های یکسانی اشاره میکنن
به طور خلاصه داری میگی که توی اون 2 تا فیلد 1 بریز بعد میگی توی اون 2 فیلد 2 بریز انتظار دارید چه اتفاقی بیفته ؟ توی اولی 1 و توی دومی 2 ریخته بشه ؟
https://jsfiddle.net/196fsvq1/

درسته اما اگر هر سلکتور زیر مجموعه از یک کلاس باشه چی ؟ اما اینجا هم همون نتیجه رخ میده
لطفا به این کد نگاه کنید



<input type="button" value="Test" onclick="nemi()"/>
<div class="d1">
<input type="text" id="red1" />
</div>
<div class="d2">
<input type="text" id="red2" />
</div>
<script>
function nemi()
{
var d1 = document.getElementsByClassName('d1')[0].childNodes;
var d2 = document.getElementsByClassName('d2')[0].childNodes;
var myida = document.querySelectorAll("[id^=red]");
var myidb = document.querySelectorAll("[id^=red]");
for (var i=0; i < d1.length; i++){
for (var j = 0; j < myida.length; j++)
{
myida[j].value = 1;
}
}
for (var m=0; m < d2.length; m++){
for (var n = 0; n < myidb.length; n++)
{
myidb[n].value = 2;
}
}
</script>



برای حالتی که سلکتور پسر زیر مجموعه کلاس پدر باشه آیا میشه برای دو سلکتور با تعریف همسان کاری کرد که for جواب یکسان نده ؟

آیا با تغییر در for امکان پذیر هست ؟

اگر هست جوابش به چه صورت می تونه باشه . و اگر نه آیا باید دسترسی از کلاس پدر داده بشه ؟ ( به چه صورت )

ممنون

plague
پنج شنبه 28 اردیبهشت 1396, 19:56 عصر
سلکتور شما تو این مثال هیچ فرقی نکرده
به هیچ وجه زیر مجموعه کلاس نرفته اصلا
تنها کاری که کردی شما یه حلقه اضافه کردی به هر حلقه از 2 تای قبلی
به طور خلاصه داری میگی برای 1 بار توی 2 فیلد بریز 1 - برای 1 بار توی 2 فیلد بریز 2
مشکل شما اون سلکتور red هستش که نوشتی اگه میخای نتیجه متفاوت بگیری باید اون سلکتور رو عوض کنی مثل این
https://jsfiddle.net/196fsvq1/1/

fun_9990
دوشنبه 01 خرداد 1396, 04:14 صبح
سلکتور شما تو این مثال هیچ فرقی نکرده
به هیچ وجه زیر مجموعه کلاس نرفته اصلا
تنها کاری که کردی شما یه حلقه اضافه کردی به هر حلقه از 2 تای قبلی
به طور خلاصه داری میگی برای 1 بار توی 2 فیلد بریز 1 - برای 1 بار توی 2 فیلد بریز 2
مشکل شما اون سلکتور red هستش که نوشتی اگه میخای نتیجه متفاوت بگیری باید اون سلکتور رو عوض کنی مثل این
https://jsfiddle.net/196fsvq1/1/

مرسی شما دسترسی مستقیم دادین ( اما من اینقد هم کد ساده رو تصور نمی کنم )
اما در این صورت یعنی اگر هر دو Red باشن آیا باید زیر مجموعه کلاس باشن
کاری که در مثال دوم کردم مگه زیر مجموعه کلاس نشدن ؟ اشکال کارم کجاست ؟ ( مگه نه اینه که وقتی for برای سلکتور داخل for کلاس آوردم و آخر سر هم for والد رو بستم )
شما فرض کنید اون دو تا red همسان باشن
حالا اینی که گفتم یک حالت و حالت دوم هم اینکه اگه ما اصلا به id ها کاری نداشته باشیم و صرفا بخوایم با class خروجی بگیریم چی
اون موقع چطور باید بنویسیم ؟

plague
دوشنبه 01 خرداد 1396, 16:42 عصر
حلقه for مالکیت یا زیر مجموعه بودن المنت ها رو تایین نمیکنه فقط یه حلقست
شما وقتی میگی
for (var i=0; i < d1.length; i++)
از نظر برنامه داری میگی
for (var i=0; i < 1; i++)

هیچ ربطی به اون المنت پدر نداره چون d1.length تبدیل میشه به یک عدد
شما اگه میخای ببری زیمجموع دیو ها بزاری باید سلکتور red رو تغییر بدی من همیشه با jquery کار میکنم و مطمئن نیستم با جاوا اسکریپت خالی سلکتورش چجوری میشه ممکنه اررور سینتکس داشته باشم ولی بیه همچین چیزی باید بشه

var myid1 = document.getElementsByClassName("d1")[0].getElementById("red1");



با جیکوئری هم که این میشه


var myid1 = $('.b1').find('#red1');

اگرم بخای صرفا با کلاس بگیریشون اینجوری میشه

var myid1 = $('.b1').find('div');

ولی خب این یکم باید حواست باشه چون همه div های توی کلاس رو میگیره

fun_9990
سه شنبه 02 خرداد 1396, 20:30 عصر
حلقه for مالکیت یا زیر مجموعه بودن المنت ها رو تایین نمیکنه فقط یه حلقست ...خیلی ممنون از توضیحاتتون من پون قبلا اینو تست کرده بودم نتیجه نداد اومدم حلقه تو در تو کردم که بنا به چیزی که شما میگید در این مورد استنباطم غلط بودهحالا اگر querySelectorAll باشه چی ؟ ( فرقی نمی کنه جاوا اسکریپت یا جی کیوئری اگر هر کدوم رو بگید معادلشو پیدا می کنم ) می تونه به این صورت باشه ؟
var myid1 = document.getElementsByClassName("d1")[0].querySelectorAll("[id^=red]");به نظرم اصلا نمیشه . یا شایدم اشتباه می کنم . ( به هر حال من هدفم اینه دسترسی داشته باشم در صورتی که هر دو id یکسان هست و اگر تغییرش دادم مجبور نشم هر بار id رو برای JS عوض کنم و از querySelectorAll استفاده کردم )

plague
سه شنبه 02 خرداد 1396, 22:20 عصر
بله اینم کار میکنه لینک رو نگاه کنید
https://jsfiddle.net/196fsvq1/2/