جاوااسکریپت | JavaScript
507 subscribers
654 photos
139 videos
3 files
512 links
کانال @IR_javascript حاوی اطلاعات مفید در حوزه برنامه نویس فرانت که بصورت روزانه بروز می‌شود.
در این کانال شما به:
[1] مطالب تازه
[2] تحلیل‌های عمیق
[3] نکات آموزشی
[4] چالش
[5] ابزار و راهنمایی‌های کاربردی
دسترسی خواهید داشت.

🆔@IR_javascript
Download Telegram
آیا تا به حال دقت کرده‌اید که هنگام کپی کردن متن از برخی سایت‌ها، به طور خودکار لینک منبع نیز اضافه می‌شود؟ 🧐

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

بیایید مراحل پیاده‌سازی را بررسی کنیم:

۱️⃣ ردیابی رویداد کپی
هنگامی که کاربر متنی را کپی می‌کند، می‌توان این عمل را با استفاده از مدیریت‌کننده رویداد copy ردیابی کرد.

۲️⃣ دریافت متن انتخاب‌شده
با استفاده از متد window.getSelection().toString() می‌توان متن انتخاب‌شده توسط کاربر را استخراج کرد.

۳️⃣ اضافه کردن منبع
یک رشته متنی شامل اطلاعات اضافی، مانند آدرس وب‌سایت یا امضا، ایجاد کنید و آن را با متن انتخاب‌شده ترکیب کنید.

۴️⃣ به‌روزرسانی محتوای کلیپ‌بورد
با متد event.clipboardData.setData() متن جدید را به کلیپ‌بورد انتقال دهید.

۵️⃣ جلوگیری از رفتار پیش‌فرض
برای جلوگیری از کپی شدن تنها متن انتخاب‌شده توسط مرورگر، از متد event.preventDefault() استفاده کنید.

حالا هر زمان که کاربر متنی را از سایت شما کپی کند، اطلاعات اضافی نیز به طور خودکار به کلیپ‌بورد اضافه می‌شود. 👍



#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
👏3👍1
📱 بهینه‌سازی شرایط با استفاده از و && در جاوااسکریپت

استفاده از عملگرهای
و && می‌تواند کد را ساده‌تر کرده و از بررسی‌های غیرضروری جلوگیری کند:

🔸 عملگر || (OR):
این عملگر به شما اجازه می‌دهد که یک مقدار پیش‌فرض برای متغیر تعیین کنید اگر مقدار اصلی آن خالی یا نامعتبر باشد.

🔸 عملگر && (AND):
این عملگر امکان انجام عملی را تنها در صورت معتبر بودن مقدار یک متغیر فراهم می‌کند.

در این مثال:

🔸 متغیر `name` مقدار "مهمان" دریافت می‌کند، اگر `user.name` تعریف نشده باشد:
let name = user.name || "مهمان";

این خط بررسی می‌کند که آیا user.name مقدار معتبری دارد یا خیر. اگر تعریف نشده یا مقدار آن خالی باشد، مقدار پیش‌فرض "مهمان" به name اختصاص داده می‌شود.

🔸 پیام تنها در صورتی ارسال می‌شود که `user` وجود داشته باشد:
user && sendMessage(user);

این خط اطمینان حاصل می‌کند که تابع sendMessage تنها زمانی اجرا می‌شود که user وجود داشته باشد (یعنی مقدار آن undefined یا null نباشد).

این رویکرد از بروز خطاهای احتمالی جلوگیری کرده و کد را تمیزتر می‌کند. 😊

#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
👍42🙏1
🖤 وفات حضرت زینب(س)

قسمتی از خطبه حضرت زینب سلام الله علیها در کاخ یزید لعنت الله علیه:

ای یزید آیا گمان می بری این که اطراف زمین و ‌آفاق آسمان را بر ما تنگ گرفتی و راه چاره را بر ما بستی که ما را به مانند کنیزان به اسیری برند، ما نزد خدا خوار و تو سربلند گشته و دارای مقام و منزلت شده ای، پس خود را بزرگ پنداشته به خود بالیدی، شادمان و مسرور گشتی که دیدی دنیا چند روزی به کام تو شده و کارها بر وفق مراد تو می چرخد، و حکومتی که حق ما بود در اختیار تو قرار گرفته است، آرام باش، آهسته تر. آیا فراموش کرده ای قول خداوند متعال را «و کسانی که کافر شدند، گمان نکنند مهلتی که به آنان می دهیم به سودشان خواهد بود، جز این نیست که مهلتشان می دهیم تا بر گناه خود بیفزایند، و برای آنان عذابی خوار کننده است»


#️⃣#event
👥@IR_javascript_group
🆔@IR_javascript
16👎4🤬2👍1😡1
مقایسه عملکرد سیستم های واکنش پذیری Vue 2 و Vue 3

🔗https://stackblitz.com/edit/sb1-ftgjrkge?file=performance.js
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
2👍1
می‌توان از AbortController نه تنها برای لغو درخواست‌های شبکه‌ای، بلکه برای لغو تقریباً هر نوع رویدادی دیگر مانند **setTimeout**، انیمیشن‌ها یا کلیک روی دکمه نیز استفاده کرد.

const abortController = new AbortController();

button.addEventListener(
'click',
() => console.log('clicked'),
{ signal: abortController.signal }
);

abortController.abort();


گاهی اوقات این روش راحت‌تر از استفاده از روش‌های اشتراک و لغو اشتراک (unsubscribe/subscribe) است.

#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
👍2
ویدیو دوبله شده در مورد Install ESLint Prettier extensions for VSCode [+لینک]

‏ Prettier و ESLint هر دو ابزارهایی برای بهبود کد هستند، اما نقش‌های متفاوتی دارند.
‏Prettier یک فرمت‌کننده کد است که به طور خودکار کد شما را قالب‌بندی می‌کند و آن را مرتب می‌کند تا خواناتر شود. این ابزار بر نحوه نگارش کد تمرکز دارد.
‏ESLint اما یک ابزار تحلیل استاتیک کد است که به شما کمک می‌کند تا خطاهای رایج در کد را شناسایی کنید و همچنین می‌تواند به شما در رعایت قواعد کدنویسی کمک کند.
در واقع، Prettier به ظاهر کد می‌پردازد، در حالی که ESLint به کیفیت و صحت کد. معمولاً از هر دو به صورت مکمل استفاده می‌شود.

🔗https://www.aparat.com/v/mpo29n3
#️⃣#tip #dub
👥@IR_javascript_group
🆔@IR_javascript
🔥3
// useUserService.ts

function isAuthenticated() {
return !!user.value;
}


// کامپوننت A

<script>
const { isAuthenticated } = useUserService();
</script>

<template>
<p v-if="isAuthenticated()">سلام</p>
</template>


توابع در Vue رفتار متفاوتی از توابع معمولی دارند.

در این مثال، تابع isAuthenticated() مانند یک computed عمل می‌کند و هر بار که مقدار user تغییر کند یا کامپوننت A دوباره رندر شود، فراخوانی خواهد شد.

این اتفاق به این دلیل می‌افتد که Vue تمام وابستگی‌های واکنش‌پذیر را درون بدنه‌ی تابع شناسایی کرده و هر زمان که یکی از آن‌ها تغییر کند، کامپوننت را دوباره رندر می‌کند.

بنابراین، تفاوت زیادی در استفاده از یک تابع به جای computed وجود ندارد. اما اگر داخل تابع منطق پیچیده‌تری وجود داشته باشد، بهتر است از computed استفاده کنید، زیرا فقط زمانی که وابستگی‌های آن تغییر کنند، محاسبه مجدد می‌شود، در حالی که تابع در هر رندر اجرا می‌شود.


#️⃣#tip #vue
👥@IR_javascript_group
🆔@IR_javascript
1
This media is not supported in your browser
VIEW IN TELEGRAM
یک کتابخانه جالب از الگوهای هندسی رایگان است.

🔗http://mazeletter.xyz/
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
1🙏1
Intl.DurationFormat: زمان تحت کنترل

در برخی موارد، نیاز است که مدت زمان را به شکلی راحت و قابل درک برای کاربر نمایش دهیم. به عنوان مثال، تایمرها، گزارش‌ها یا حتی زمان باقی‌مانده برای بارگذاری. برای چنین مواقعی اکنون یک راه‌حل واقعی در دسترس است — Intl.DurationFormat (اما مراقب باشید - پشتیبانی از آن تنها ۸۲٪ است، و متاسفانه هنوز در Firefox پشتیبانی نمی‌شود).

چطور در عمل به نظر می‌رسد؟

const durationFormatter = new Intl.DurationFormat('fa', {
style: 'long', // می‌تواند 'long'، 'short' یا 'narrow' باشد
});

const duration = { hours: 2, minutes: 5, seconds: 32 };
console.log(durationFormatter.format(duration)); // خروجی: "۲ ساعت ۵ دقیقه ۳۲ ثانیه"


چرا این مفید است:

لکالیزه کردن: پشتیبانی از زبان‌های مختلف، که به‌طور خودکار با قوانین هر منطقه تنظیم می‌شود.
انعطاف‌پذیری: می‌توانید واحدهای مورد نظر خود را تنظیم کنید: اگر می‌خواهید فقط دقیقه و ثانیه نمایش داده شود، به راحتی امکان‌پذیر است!

❗️ برای مطالعه بیشتر: [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DurationFormat)

Intl مانند یک جعبه اسرار است: هر چقدر هم که مطالعه کنید، همیشه جزئیات جدیدی پیدا می‌شود که شما را شگفت‌زده می‌کند. 🤩

#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
👍7
Wow.js

یک کتابخانه JavaScript است که انیمیشن‌ها را به عناصر صفحه هنگام اسکرول اضافه می‌کند. این کتابخانه به‌طور خودکار عناصری که وارد ناحیه قابل مشاهده پنجره مرورگر می‌شوند را شناسایی کرده و انیمیشن‌های CSS را به آن‌ها اعمال می‌کند.


🔗 https://www.delac.io/WOW/
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
👍5
سایت مفید AngryTools که شامل ابزارهای مختلفی برای توسعه وب است.

به عنوان مثال، ابزارهایی برای ایجاد انیمیشن‌های CSS یا تولیدکننده Flexbox.

🔗https://angrytools.com/
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
شهادت امام موسی کاظم (ع)

امام موسی کاظم عليه‌السلام:
سه دسته در روز قيامت، روزى كه سايه و پناهى جز سايه خداوند نيست، در سايه و پناه خدا هستند:
۱. مردى كه زمينه ازدواج برادر مسلمانش را آماده نمايد.
۲. مردى كه خدمتگزارى به برادر مسلمانش بدهد.
۳. كسى كه سرّ برادر مسلمانش را بپوشاند.

#️⃣#event
👥@IR_javascript_group
🆔@IR_javascript
17👎5
همه با *Container size queries* آشنا هستند، اما هنوز بسیاری از افراد از *Container style queries* بی‌خبرند.

هدف از این ویژگی، استایل‌دهی به المان‌ها بر اساس زمینه و ویژگی‌های کانتینر والد است.

این امکان را فراهم می‌آورد تا قوانینی ایجاد شوند که تنها زمانی اعمال شوند که شرایط خاصی در مورد استایل کانتینر برآورده شود.

این ویژگی امکان ایجاد استایل‌های تطبیقی و وابسته به زمینه را فراهم می‌کند و می‌توان المان‌ها را بر اساس محیط اطرافشان استایل‌دهی کرد.

.card {
/* ...استایل‌های کارت... */
}

@container style(--background-color: #333) {
.card {
/* استایل‌ها برای کارت زمانی که پس‌زمینه والد آن تیره باشد */
color: white;
}
}


در برنامه‌ریزی‌ها، پشتیبانی از تابع style() نه تنها برای ویژگی‌های سفارشی CSS بلکه برای ویژگی‌های ساده‌تر مانند style(color: green) نیز در نظر گرفته شده است.

این ویژگی در همه جا پشتیبانی می‌شود، به جز در مرورگر Firefox.

#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
حالت "تصویر در تصویر" (Picture-in-Picture) 🖼

آیا متوجه شده‌اید که گاهی اوقات هنگام تماشای سریال، فیلم یا ویدیو، بین تب‌ها جابه‌جا می‌شوید؟ شاید هم در حال شرکت در یک تماس آنلاین هستید و هنگام جابه‌جایی بین تب‌ها، به‌طور خودکار یک پنجره کوچک از ویدیو باز می‌شود که در دید باقی می‌ماند؟

این همان حالت "تصویر در تصویر" (Picture-in-Picture یا PiP) است. این ویژگی تعامل با محتوای چندرسانه‌ای را بسیار آسان‌تر می‌کند و به شما این امکان را می‌دهد که تماشای ویدیو را با انجام سایر وظایف ترکیب کنید.
امروز می‌خواهم به‌طور عمیق‌تر به این موضوع بپردازم و نحوه عملکرد PiP، چگونگی فعال کردن آن در یک وب‌اپلیکیشن، و نیز نحوه اتوماسیون این فرآیند را بررسی کنم. 😉

حالت "تصویر در تصویر" به شما این امکان را می‌دهد که ویدیو را در یک پنجره جداگانه نمایش دهید که بر روی سایر برنامه‌ها باقی می‌ماند. به عنوان مثال، می‌توانید ویدیو را تماشا کنید در حالی که ایمیل‌های خود را چک می‌کنید یا بین تب‌ها جابه‌جا می‌شوید.

محدودیت‌ها و نکات مهم:

نیاز به حرکت کاربر: درخواست فعال‌سازی PiP باید در حین یک عمل از سوی کاربر انجام شود، مثلاً با کلیک بر روی یک دکمه. این محدودیت به دلیل مسائل امنیتی است.

همه مرورگرها از PiP پشتیبانی نمی‌کنند: اطمینان حاصل کنید که مرورگر شما از این API پشتیبانی می‌کند، با بررسی وجود ویژگی requestPictureInPicture در آن (https://caniuse.com/?search=requestPictureInPicture).

حالت "تصویر در تصویر" یک ابزار عالی برای ایجاد تجربه‌ای راحت‌تر در تعامل با ویدیوها در وب‌سایت‌های شماست. این ویژگی به کاربران اجازه می‌دهد که حتی زمانی که در حال انجام سایر وظایف هستند، به تماشای ویدیو ادامه دهند. 👍


#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
👍2
یک افزونه مفید دیگر برای VS Code: Pretty TypeScript Errors

این افزونه به شما کمک می‌کند تا خطاهای TypeScript را به صورت زیبا و خوانا نمایش دهید، که باعث می‌شود تشخیص و رفع مشکلات کد بسیار راحت‌تر شود.

🔗https://marketplace.visualstudio.com/items?itemName=yoavbls.pretty-ts-errors
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
👍1
This media is not supported in your browser
VIEW IN TELEGRAM
عید مبعث خاتم الانبیا،

☀️ رسول خدا صلّي‌الله‌عليه‌وآله فرمودند:
نزدیکترین فرد در روز قیامت به من،
کسی است که بیشتر از همه بر من صلوات فرستاده باشد.
📚 مکارم الاخلاق، ص ۳۱۲

#️⃣#event
👥@IR_javascript_group
🆔@IR_javascript
13👎5
برای کسانی که از انوتیشن‌های نام پارامترهای JetBrains خوششان می‌آید، VS Code افزونه‌ای برای این کار دارد: Inline Parameters for VSCode
(لینک: Inline Parameters for VSCode)

این افزونه به شما امکان می‌دهد که نام پارامترها را به‌صورت inline در کد مشاهده کنید، مشابه آنچه که در محیط‌های توسعه JetBrains وجود دارد. این ویژگی می‌تواند به خوانایی بیشتر کد و فهم بهتر آن کمک کند.


🔗https://marketplace.visualstudio.com/items?itemName=liamhammett.inline-parameters
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
1
Merge vs Rebase: تفاوت‌ها و زمان استفاده از هرکدام

هنگام کار با Git، ما معمولاً با دو دستور پرکاربرد برای مدیریت شاخه‌ها روبه‌رو می‌شویم: merge و rebase. هر دو این دستورات به ما کمک می‌کنند تا تغییرات را از دو شاخه مختلف در یک شاخه ترکیب کنیم، اما نحوه عملکردشان کاملاً متفاوت است. در اینجا تفاوت‌ها را بررسی می‌کنیم و می‌فهمیم که چه زمانی بهتر است هرکدام را استفاده کنیم.

🌀 Merge: ترکیب شاخه‌ها با حفظ تاریخچه
هنگامی که از دستور merge استفاده می‌کنیم، Git یک merge commit ایجاد می‌کند که تاریخچه دو شاخه را با هم ترکیب می‌کند. در این حالت، تمام تاریخچه موجود دست‌نخورده باقی می‌ماند و نتیجه به‌صورت ترکیبی از دو خط موازی به نظر می‌آید.

مثال:
ما یک شاخه به نام main و یک شاخه به نام feature داریم.
تغییراتی در هر دو شاخه انجام می‌دهیم.
هنگامی که در شاخه main قرار داریم و دستور git merge feature را اجرا می‌کنیم، یک merge commit جدید در تاریخچه شاخه main ایجاد می‌شود که هر دو مجموعه تغییرات را با هم ترکیب می‌کند.

💡 کی از merge استفاده کنیم؟
وقتی می‌خواهید تمام تاریخچه کامیت‌ها، از جمله شاخه‌ها، را حفظ کنید؛
وقتی برای شما مهم است که بفهمید تغییرات از کجا آمده‌اند؛
برای کار در تیم‌های بزرگ که شفافیت در روند کاری اهمیت دارد.

مثال بصری پس از merge (ترتیب زمانی از پایین به بالا: ابتدا در شاخه main کار کردیم (۲ کامیت)، سپس به شاخه feature رفتیم (۲ کامیت)، و بعد شاخه feature را به شاخه main وارد کردیم):

                 *   Merge branch 'feature' [merge commit]
|\
| * افزودن ویژگی جدید
| * اصلاح باگ
اصلاح استایل * |
بروزرسانی README * |
[شاخه main] [شاخه feature]


🔀 Rebase: بازنویسی تاریخچه
‏Rebase تغییرات را از یک شاخه به بالای شاخه دیگر منتقل می‌کند، به‌گونه‌ای که انگار این تغییرات ابتدا روی آن شاخه ایجاد شده‌اند. در نتیجه، تاریخچه به‌صورت خطی می‌شود و خبری از merge commit نخواهد بود.

مثال:
ما یک شاخه به نام main و یک شاخه به نام feature داریم.
بعد از اجرای دستور `git rebase main`، تغییرات شاخه feature روی نسخه فعلی شاخه main قرار می‌گیرند، به‌گونه‌ای که انگار شاخه feature قبل از ایجاد تغییرات، مشابه شاخه main بوده است.

💡 کی از rebase استفاده کنیم؟
وقتی می‌خواهید تاریخچه‌ای تمیز و خطی داشته باشید و خبری از merge commit نباشد؛
وقتی در شاخه شخصی خود کار می‌کنید و برای به‌روزرسانی تغییرات خود با آخرین نسخه شاخه اصلی نیاز به «هماهنگ کردن» دارید.

مثال بصری پس از rebase:

* اصلاح باگ
* افزودن ویژگی جدید
* اصلاح استایل
* بروزرسانی README
[شاخه feature]


🔑 نکته:
Merge برای تیم، Rebase برای تمیزی تاریخچه
👀 از merge برای حفظ تاریخچه کامل و منابع/نویسندگان تغییرات در پروژه‌های بزرگ استفاده کنید؛
👀 از rebase در شاخه شخصی/شاخه‌های مربوط به تکالیف استفاده کنید تا تغییرات خود را قبل از ارسال به شاخه اصلی به‌روزرسانی کنید (اما از انجام rebase روی کامیت‌های منتشر شده اجتناب کنید، زیرا ممکن است باعث ایجاد تداخل‌ها و سردرگمی هنگام همکاری شود).

#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
👍3