حلقه (2)

سلام

اين درس را، كه اهميت ويژه‌اي دارد، هديه مي‌كنم به شما دوستان عزيزم؛ مخصوصا دوستي كه مدتي است نمي‌تواند ما را در اين دروس، همراهي كند. براي سلامتي او، دعا مي‌كنم.

يارب! آن نوگل خندان که سپردي به منش    مي‌سپارم به تو از چشم حسود چَمَنش
گرچه از کوي وفا، گشت به صد مرحله دور            دور باد آفتِ دور فلک از جان و تنش
هرکه ترسد ز ملال، اندُه عشقش نه حلال           سَر ما و قدَمش، يا لب ما و دَهنش

 

حلقه for ... in

 • اين حلقه، فقط براي يك منظور استفاده مي‌شود؛ به دست آوردن خصوصيات اشياء. اگر به خاطر داشته باشيد، در جلسه هشتم، به مباحث عمومي برنامه نويسي، يعني متد، خصوصيات و رويداد اشياء، پرداختيم. حتما به آن درس، مراجعه كنيد.

سوال مهم اين است: چگونه خصوصيات و رويداد يك شي را به دست آوريم؟ اين پرسش، ممكن است براي هر كسي، پيش آماده باشد. البته يك روش، مراجعه به پايگاه وب و يا كتابهاي مرجع است؛ ولي راه راحتتري وجود دارد كه امروز به شما مي‌گويم. از خود جاوا بپرسيم. بله، بهترين و ساده‌ترين راه، اين است كه از خود جاوا اسكريپت، سوال كنيم كه خواص فلان شي _ مثلا  window - چيست. به وسيله همين حلقه، از جاوا درخواست مي‌كنيم كه هرچه درباره يك شي، وجود دارد، به ما بگويد.
 

ساختمان حلقه

for (var x in object)
{
    document.write ("<li>object." + x + " = " + object [x]);
}

مشاهده مي‌كنيد كه ساختمان اين حلقه، با حلقه for كه قبلا ديده‌ايم، تفاوت دارد.

x =  خصوصيات شي. يك متغير است كه بيانگر تمام خصوصيات شي است.
in =  كلمه‌اي كليدي؛ به اين معني كه هرچه خصوصيات (x) در اين شي است.
Object = به جاي اين كلمه، نام شي را بنويسيد؛ مثلا window, document.
object [x] = شيئي كه نوشته‌ايم، تبديل به آرايه مي‌شود؛ يعني يك متغير كه داراي چندين مقدار است.
 

تمرين

مي‌خواهيم، خصوصيات شي سند (window) را به دست آوريم

كد:

<script>
document.write ("<ol>");
for (var x in window)
{
    document.write ("<li>window." + x + " = " + window[x]);
}
</script>

چيزي كه جاوا به شما نمايش خواهد داد، اين است:

  1. window.onbeforeunload = null
  2. window.onafterprint = null
  3. window.top = [object]
  4. window.location = file:///E:/Web/Weblog/JScript/15.02.htm
  5. window.parent = [object]
  6. window.offscreenBuffering = auto
  7. window.frameElement = null
  8. window.onerror = null
  9. window.screen = [object]
  10. window.event = null
  11. window.clipboardData = [object]
  12. window.onresize = null
  13. window.defaultStatus =
  14. window.onblur = null
  15. window.window = [object]
  16. window.onload = null
  17. window.onscroll = null
  18. window.screenTop = 119
  19. window.onfocus = null
  20. window.Option = [object]
  21. window.length = 0
  22. window.onbeforeprint = null
  23. window.frames = [object]
  24. window.self = [object]
  25. window.clientInformation =
  26. window.external =
  27. window.screenLeft = 4
  28. window.opener = undefined
  29. window.onunload = null
  30. window.document = [object]
  31. window.closed = false
  32. window.history = [object]
  33. window.Image = [object]
  34. window.navigator =
  35. window.status =
  36. window.onhelp = null
  37. window.name =

تحليل

 • همانطور كه مي‌بينيد جاوا، 37 خط، نوشته است كه مخلوطي از اشياء، خصوصيات و رويدادهاي پنجره (window) است. چرا به شكل درهم و نامنظم نوشته شده، من نمي‌دانم! ولي تشخيص اين سه، كار مشكلي نيست.

  • شي: هر كدام كه مقابلش object نوشته شده، يك شي ديگري است كه زير مجموعه window مي‌باشد؛ مانند top.
  • رويداد: هر كدام كه با on شروع شده، رويداد (event) است؛ مانند onload. مقابل رويدادهايي كه از آنها در پنجره، استفاده نكرده‌ايم، null نوشته مي‌شود؛ در غير اين صورت، نوع عمليات را مي‌نويسد.
  • خصوصيت: هر چيزي به غير از اينها، خصوصيات window است، كه معمولا چيزي مقابلش نوشته شده است؛ مانند screenTop، كه موقعيت پنجره را از بالا، نشان مي‌دهد. اگر پنجره را تغيير مكان دهيد و رفرش كنيد، مقدار آن تغيير مي‌كند.


براي ديدن نمونه‌هاي بيشتر، اينجا كليك كنيد.


پرسش و پاسخ
.
با عذرخواهي از كساني كه پاسخشان دير شد.
. هر يك از دوستان كه جواب مرا كافي يا صحيح ندانست، حتما تذكر دهد.

پاسخ:
تشكر از دوست عزيز، ايراني، كه پاسخ تمرين جلسه قبل را ارسال كرده‌اند. بله، به نظر مي‌آيد نمي‌شود به غير از حلقه، اين عمليات را انجام داد. منظور من هم همين بود، كه متوجه اهميت و منحصر به فرد بودن حلقه بشويد.

var a = 0;
function funFor(){
        if (a < 5)
            {
            a++;
            alert ("پيام" + a);
            }
setTimeout ("funFor()", 1000);
}
funFor();

شايد اين حداكثر كاري باشد كه مي‌توان در تكرار يك دستور انجام داد. مسلما، بهترين و ساده‌ترين راه، استفاده از حلقه است.

?پرسش:
سلام. اول تشكر كنم به خاطر وبلاگ خوبتون. چطوري ميشه خروجي يك كد جاوا اسكريپت را در يك جدول گذاشت؟ يا مثلا ورودي يك كد جاوا را از يك اديت (input) گرفت. يك دنيا ممنون.

پاسخ:
سلام دوست عزيز! تشكر از لطفتان.
1- يك راه، قرار دادن تگ اسكريپت، درون جدول است. يعني كل كدها را در بدنه و داخل همان جدول بگذاريد و آنگاه از دستور document.write براي نوشتن نتيجه، استفاده كنيد. براي آشنايي بيشتر، به جلسه 11، "صدا كردن تابع" مراجعه كنيد.
روش ديگر اين است كه  از دستور innerText استفاده كنيد كه من در "يك پروژه" به كار برده‌ام.
2- براي گرفتن داده، از يك شي، به تمرين جلسه 12 مراجعه كنيد. همانجا كه از Menu.value استفاده كرده‌ام. input داراي يك value است؛ همانجا كه متن خود را وارد مي‌كنيد.

?پرسش:
دوست عزيز
! من تازه شروع کردم به ياد گيري؛ اما از اونجايي که من با C, Delphi به صورت حرفه شغلي کار کردم. اين درسهاي شما را خوب مي فهمم. ولي سوالم اينه که با چه اديتوري بايد اينها رو نوشت؟

پاسخ:
سلام حسين آقا! خوش آمديد.
1- اگر برايتان ممكن است، از اين به بعد پيامتان را در آخرين درس بنويسيد، تا زودتر متوجه آن بشوم.
2- حق با شماست. جاوا اسكريپت چون از لحاظ ساختاري، به C و دلفي شبيه است، يادگيري و فهمش برايتان راحت است.
3- در جلسه سوم در اين باره توضيح داده‌ام. "نوشتن اين زبان، احتياج به محيط خاصي ندارد. مثلا زبان ويژول بيسيك را، بايد برنامه ويژوال بيسيك را نصب، و در محيط آن بنويسيم؛ ولي زبانهاي وب، چنين محدوديتي ندارند. مثلا شما در يك متن ساده (Text)،‌ مي‌توانيد به راحتي، هم HTML بنويسيد و هم Java و هم PHP". به آن مراجعه كنيد.

?پرسش:
لطفا آموزش اين برنامه را بگوييد. دادن پيغام در روزهاي 5، 9، 12 هر ماه. فارسي؛ نه انگليسي.

پاسخ:
سلام. براي ساخت اين برنامه، شما به چند چيز، احتياج داريد. يك متد دريافت روزهاي ماه (getDate)، و يك پيام. خوشبختانه با تمام اين عناصر، در جلسات قبل، آشنا شده‌ايد. كافي است تابعي بسازيد كه در روزهاي مقرر، يك پيام بدهد. نتيجه كار را به من اطلاع دهيد.

پاسخ يكي از دوستان:
سلام استاد! در مورد اون برنامه‌اي كه دوستمون از شما سؤال كرده بود، من هم اونو به عنوان يك تمرين انجام دادم. لطفاً اگه راه‌هاي ديگري هم هست راهنماييم كنيد. ممنون.

var now = new Date()
var A = now.getDate()
if    (A == 6)    alert("امروز قرار داريد");
if    (A == 12)    alert("امروز قرار داريد");
if    (A == 26)    alert("امروز قرار داريد");


 • براي جلسه آينده يك بازي زيبا - كه با جاوا اسكريپت ساخته شده - آماده كرده‌ام؛ اگر خطوط كُند اينترنتي، مانع نشوند.

به اميد ديدار
خدانگهدار