├── src ├── hello-world │ ├── blank-project.png │ ├── build-project.png │ ├── chrome-output.png │ ├── name-project.png │ ├── output-files.png │ ├── creating-mainkt.png │ ├── create-new-project.png │ ├── target-kotlin-javascript.png │ └── README.md ├── working-with-the-dom-part1 │ ├── output1.png │ ├── output2.png │ ├── output3.png │ ├── output4.png │ ├── output5.png │ ├── output6.png │ ├── output7.png │ ├── output8.png │ ├── output9.png │ └── README.md ├── working-with-the-dom-part3 │ ├── IDE-workspace.png │ ├── add-as-library.png │ ├── lib-contains.png │ ├── bitnary-download.png │ ├── dl-bitnary-link.png │ ├── kotlinx-download.png │ ├── link-of-others-kotlinx-version.png │ ├── choose-categories-of-selected-files.png │ └── README.md ├── README.md ├── javascript-introp │ └── README.md └── working-with-the-dom-part2 │ └── README.md ├── LICENSE └── README.md /src/hello-world/blank-project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/hello-world/blank-project.png -------------------------------------------------------------------------------- /src/hello-world/build-project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/hello-world/build-project.png -------------------------------------------------------------------------------- /src/hello-world/chrome-output.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/hello-world/chrome-output.png -------------------------------------------------------------------------------- /src/hello-world/name-project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/hello-world/name-project.png -------------------------------------------------------------------------------- /src/hello-world/output-files.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/hello-world/output-files.png -------------------------------------------------------------------------------- /src/hello-world/creating-mainkt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/hello-world/creating-mainkt.png -------------------------------------------------------------------------------- /src/hello-world/create-new-project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/hello-world/create-new-project.png -------------------------------------------------------------------------------- /src/hello-world/target-kotlin-javascript.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/hello-world/target-kotlin-javascript.png -------------------------------------------------------------------------------- /src/working-with-the-dom-part1/output1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/working-with-the-dom-part1/output1.png -------------------------------------------------------------------------------- /src/working-with-the-dom-part1/output2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/working-with-the-dom-part1/output2.png -------------------------------------------------------------------------------- /src/working-with-the-dom-part1/output3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/working-with-the-dom-part1/output3.png -------------------------------------------------------------------------------- /src/working-with-the-dom-part1/output4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/working-with-the-dom-part1/output4.png -------------------------------------------------------------------------------- /src/working-with-the-dom-part1/output5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/working-with-the-dom-part1/output5.png -------------------------------------------------------------------------------- /src/working-with-the-dom-part1/output6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/working-with-the-dom-part1/output6.png -------------------------------------------------------------------------------- /src/working-with-the-dom-part1/output7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/working-with-the-dom-part1/output7.png -------------------------------------------------------------------------------- /src/working-with-the-dom-part1/output8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/working-with-the-dom-part1/output8.png -------------------------------------------------------------------------------- /src/working-with-the-dom-part1/output9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/working-with-the-dom-part1/output9.png -------------------------------------------------------------------------------- /src/working-with-the-dom-part3/IDE-workspace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/working-with-the-dom-part3/IDE-workspace.png -------------------------------------------------------------------------------- /src/working-with-the-dom-part3/add-as-library.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/working-with-the-dom-part3/add-as-library.png -------------------------------------------------------------------------------- /src/working-with-the-dom-part3/lib-contains.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/working-with-the-dom-part3/lib-contains.png -------------------------------------------------------------------------------- /src/working-with-the-dom-part3/bitnary-download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/working-with-the-dom-part3/bitnary-download.png -------------------------------------------------------------------------------- /src/working-with-the-dom-part3/dl-bitnary-link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/working-with-the-dom-part3/dl-bitnary-link.png -------------------------------------------------------------------------------- /src/working-with-the-dom-part3/kotlinx-download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/working-with-the-dom-part3/kotlinx-download.png -------------------------------------------------------------------------------- /src/working-with-the-dom-part3/link-of-others-kotlinx-version.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/working-with-the-dom-part3/link-of-others-kotlinx-version.png -------------------------------------------------------------------------------- /src/working-with-the-dom-part3/choose-categories-of-selected-files.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KotlinFarsi/OpenSourceTutorials-Browser/HEAD/src/working-with-the-dom-part3/choose-categories-of-selected-files.png -------------------------------------------------------------------------------- /src/README.md: -------------------------------------------------------------------------------- 1 |
11 |
12 |
13 | و بعدش از داخل صفحهای که ظاهر میشه Kotlin(JavaScript) رو به عنوان تارگت انتخاب کنین و برروی دکمه Next کلیک کنین. یادتون باشه که فعلا نمیخوایم از هیچگونه بیلدری غیر از بیلدر خود IntelliJ استفاده کنیم. بعدا توی دورمون به بیلدهایی مثل gradle و یا maven اشاره میکنیم.
14 |
15 |
16 |
17 |
18 |
19 | برای شروع اسم پروژه رو KotlinJSHelloWorld میذاریم و بعدش Next رو فشار میدیم.
20 |
21 |
22 |
23 |
24 |
25 | و حالا بعد از چندتا پردازش محیط توسعه برامون ظاهر میشه و میتونیم کدهامون رو توش بزنیم.
26 |
27 |
28 |
29 |
30 |
31 | خب حالا باید یک پکیج داخل فولدر src درست کنیم و فایل `Main.kt` رو داخلش قرار بدیم.
32 |
33 |
34 |
35 |
36 |
37 | خب تا اینجا پروژمون آماده شد. بریم سراغ اصل قضیه یعنی کدنویسی. کد زیر رو توی فایل
38 |
39 | `Main.kt` میزنیم:
40 |
41 |
58 |
59 | و حالا اگه دقت کنین متوجه میشین که توی قسمت Project، سمت راست، یه فولدر جدید ایجاد شده که اگه اونو باز کنین متوجه میشین که خروجی هامون اونجا ریخته میشه!
60 |
61 |
62 |
63 | همینطور میتونین همونجا فایل `KotlinJSHelloWorld.js` رو هم ببینین، که خروجی جاوا اسکریپت ماهستش. بالای اون دوتا فولدر میبینین. بعدا به محتویات فولدر اول اشاره میکنیم ولی فعلا قسمت مهمی که نیاز به بررسی داره فولدر lib هستش. اگه اونو باز کنین متوجه میشین که یک فایل `kotlin.js` داخلش هست که درحقیقت کتابخونه استاندارد کاتلین مورد نیاز برای اجرای برنامه های جاوا اسکرپیتیمونه. علاوه بر اون یک سری فایلها میبینین که اخرش `*.meta.js` داره. درحقیقت ما فعلا نیازی به استفاده از این فایل ها نداریم، ولی در این حد بدونین که زمانی که مثلا میخواین از اون فایل .js به عنوان یک کتابخونه استفاده کنین، توسط کامپایلر مورد استفاده قرار میگیره.
64 |
65 | حالا بیاین برگردیم به محیط توسعهامون و از این فایل خروجیمون استفاده کنیم. برای نشون دادن خروجی ما از یک فایل html استفاده میکنیم. برای همین ما توی مسیر root یک فایل html درست میکنیم و کدهای زیر رو داخلش میزنیم.
66 |
67 |
89 |
90 |
91 | توی قسمت بعدی میبینیم که چطور میتونیم در کاتلین با DOM کار کنیم.
92 |
93 |
14 |
15 | روی گزینه دانلود کلیک میکنیم و به یک صفحه دیگه منتقل میشیم.
16 |
17 |
18 |
19 | اگه بالا سمت راست دقت کنین متوجه یک لینک میشین، لینکی که در اصل با اون به صفحه بعد منتقل بشین.
20 |
21 |
22 |
23 | بعد از این کافیه به مقصدی که توی شکل زیر میبینین برسین:
24 |
25 |
26 |
27 | الان کافیه اخرین نسخهی موجود رو انتخاب کنین و بعدش توی صفحهای که ظاهر میشه فایل `kotlinx-html-js-
32 |
33 |
34 | همینطور که میبینین یک فولدر باز کردیم به اسم `libs` و داخلش فایل کتابخونمون رو قرار دادیم.حالا کافیه اون فایلر رو به عنوان یک کتابخونه معرفی کنیم.برای این کار روی اون فایل کلیک راست کرده و گزینه add as library رو انتخاب میکنیم.
35 |
36 |
37 |
38 | بعد از این که این گزینه رو انتخاب میکنیم، صفحهای ظاهر میشه به شکل زیر:
39 |
40 |
41 |
42 | که باید بگیم این فایل jar حاوی چه چیزهاییه و ما با انتخاب classes میگیم که این فایل حاوی یک سری کلاسه و بعدش هم ok و دوباره ok و تمام.
43 |
44 | و حالا اگه دقت کنیم توی قسمت Project شما میتونین فایل `*.jar` رو به صورت زیر ببینین.
45 |
46 |
47 |
48 | خب تا اینجا پروژه رو اضافه کردیم، حالا نوبت نوشتن کد توی فایل `Main.kt` فقط قبل از این که ادامه بدیم، بذارین فایل `index.html` رو نشون بدم تا مطمئن شیم همه چی درسته
49 |
50 |
79 |
80 | اگه root به root1 تغییر کنه، یعنی مثلا کد زیر:
81 |
82 |
93 |
94 | همینطور که میبینین چون عنصری رو صدا زدیم که `null` بود مقدارش چاپ نشد. ولی این خوبه اگه یادمون باشه که قبلش `null` رو چک کنیم و دقیقا زمان هایی به وجود میاد که یادمون میره همچین کاری انجام بدیم.
95 |
96 | راه حل دیگه استفاده از عملگر `!!` هه. درواقع این عملگر درکاتلین اومده که تنها ارور در زمان کامپایلرو از بین ببره و در واقع توسعه دهنده با صدازدن همچین عملگری به کامپایلر میگه: " تو کاریت نباشه، من میدونم چیکار دارم میکنم". بیاین ازش استفاده کنیم و نتیجه هارو ببینیم :
97 |
98 |
117 |
118 | همینطور که میبینین وقتی عنصر درستی رو صدا بزنیم، برنامه درست کار میکنه. ولی وقتی root1 رو صدا بزنیم:
119 |
120 |
121 |
122 | متوجه میشیم که به `NullPointerException` میخوریم و متاسفانه این مسئله خیلی از موقع ها پیش میاد و باعث بروز مشکل در سیستم میشه. به همین خاطر به این ارور ها، ارورهای میلیون دلاری هم گفته میشه.
123 |
124 | ولی راه حل درستی که کاتلین پیشنهاد میکنه استفاده از عملگر `?` هه . کد زیر رو نگاه کنین:
125 |
126 |
127 |
128 |
129 |
130 | در واقع وقتی کامپایلر به اون نقطه میرسه نگاه میکنه، اگه عنصری که داره ازش استفاده میشه `null` نبود، عمل لازم رو روش انجام میده، ولی اگر `null` بود از روی اون خط رد میشه.
131 |
132 | خب معلومه که اگه این کد رو اجرا کنیم نتیجه درست و دلخواهمون رو میگیریم.بذارین با `root1` اجرا کنیم و نتیجه رو ببینیم:
133 |
134 |
135 |
136 |
137 |
138 | خب همینطور که میبنین، همون نتیجه که میخواستیم رو گرفتیم و علاوه بر اون چون کامپایلر بهمون موقع کدنویسی ارور میده، خودمون قبل از اجرا متوجه میشیم و با استفاده از این عملگر از اجراش جلوگیری میکنیم.
139 |
140 | حالا اگه توسعهدهنده که ما باشیم بخواد اگه `null` دریافت کرد کار دیگه ای رو انجام بده(مثلا موقعی که `null` دریافت کرد یک رشته رو چاپ کنه) اون موقع باید چیکار کنه. کاتلین اینجا هم راه حل داره. کد زیر رو نگاه کنین:
141 |
142 |
162 |
163 | همینطور که میبینین مقدار `null` رو چاپ میکنه.
164 |
165 | حالا بیاین کد `html` ای که میخوایم به `div` اضافه کنیم رو یکم مشکلتر کنیم، یک کد چندخطی استفاده کنیم.
166 |
167 | KotlinFarsi contains ${message.length} letters
179 | """ 180 | val root = document.getElementById("root") 181 | root?.innerHTML = html 182 | 183 | println("The end") 184 | } 185 | ``` 186 | 187 |
194 |
195 | حالا بیاین یک دکمه به html اضافه کنیم. دکمه ای که وقتی روش کلیک شد یک عبارت رو چاپ کنه
196 |
197 |
198 | KotlinFarsi contains ${message.length} letters
209 | 210 | """ 211 | val root = document.getElementById("root") 212 | root?.innerHTML = html 213 | val btn = document.getElementById("btn") 214 | btn?.addEventListener("click",{ println("Clicked") }) 215 | 216 | println("The end") 217 | } 218 | ``` 219 | 220 |
227 |
228 |
229 | و بعد از فشار دادن دکمه :
230 |
231 |
232 |
233 |
234 |
235 | همینطور که میبینین وقتی دکمه رو فشار دادیم Clicked چاپ شد.
236 |
237 |