همهی فضاهای ذخیرهسازی مثل هم نیستند؛ با «سطلهای ذخیرهسازی» آشنا شوید
وقتی حافظهی دستگاه کاربر تمام میشود، دادههایی که با APIهایی مثل IndexedDB یا localStorage ذخیره شدهاند، بیاختیار حذف میشوند و کاربر نمیتواند جلویش را بگیرد. راه فعلی برای «دائمی» کردن این است که متد persist() را صدا بزنیم:
این روش «همه یا هیچ» است؛ نمیتوانید بگویید «فقط فلان داده مهم بماند». همهچیز در یک سطل ذخیرهسازی واحد میریزد.
API سطلهای ذخیرهسازی (Storage Buckets API)
ایدهی اصلی این است که سایتها بتوانند چند سطل (bucket) جداگانه بسازند؛ مرورگر میتواند هر سطل را مستقل از بقیه حذف کند. بدینترتیب توسعهدهنده میگوید «اگر مجبور به پاککردن شدی، اول سراغ این سطل برو، آن یکی را آخرش بگذار».
مثال عملی
فرض کنید یک برنامهی ایمیل داریم. از دست رفتن پیشنویسهای ذخیرهنشده روی دستگاه فاجعه است، اما اگر ایمیلهای قدیمیِ Inbox حذف شوند چندان مهم نیست، چون روی سرور باقیماندهاند.
چطور از API استفاده کنیم؟
دو پارامتر اختیاری میتوان داد:
persisted: false (پیشفرض) یا true
durability: 'relaxed' (پیشفرض) یا 'strict'
'strict': در برابر قطع برق ایمنتر است؛ ممکن است سرعت نوشتن کم شود، باتری بیشتر مصرف کند و عمر حافظهی فیزیکی کوتاهتر شود.
'relaxed': در صورت قطع برق ممکن است چند ثانیهی آخر اطلاعات از بین برود؛ در عوض نوشتن سریعتر و دوام باتری و حافظهی بیشتر است.
دسترسی به APIهای حافظه از داخل هر سطل
هر سطل به همان APIهای همیشگی (IndexedDB، Cache، File و …) وصل است؛ فقط ورودی از طریق خود سطل انجام میشود.
🔗https://developer.chrome.com/docs/web-platform/storage-buckets
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
وقتی حافظهی دستگاه کاربر تمام میشود، دادههایی که با APIهایی مثل IndexedDB یا localStorage ذخیره شدهاند، بیاختیار حذف میشوند و کاربر نمیتواند جلویش را بگیرد. راه فعلی برای «دائمی» کردن این است که متد persist() را صدا بزنیم:
const persisted = await navigator.storage.persist();
if (persisted) {
/* حافظه فقط با دستور مستقیم کاربر پاک میشود. */
}
این روش «همه یا هیچ» است؛ نمیتوانید بگویید «فقط فلان داده مهم بماند». همهچیز در یک سطل ذخیرهسازی واحد میریزد.
API سطلهای ذخیرهسازی (Storage Buckets API)
ایدهی اصلی این است که سایتها بتوانند چند سطل (bucket) جداگانه بسازند؛ مرورگر میتواند هر سطل را مستقل از بقیه حذف کند. بدینترتیب توسعهدهنده میگوید «اگر مجبور به پاککردن شدی، اول سراغ این سطل برو، آن یکی را آخرش بگذار».
مثال عملی
فرض کنید یک برنامهی ایمیل داریم. از دست رفتن پیشنویسهای ذخیرهنشده روی دستگاه فاجعه است، اما اگر ایمیلهای قدیمیِ Inbox حذف شوند چندان مهم نیست، چون روی سرور باقیماندهاند.
چطور از API استفاده کنیم؟
// سطل پیشنویسها که فقط روی کلاینت است
const draftsBucket = await navigator.storageBuckets.open('drafts', {
durability: 'strict', // یا 'relaxed'
persisted: true, // یا false
});
دو پارامتر اختیاری میتوان داد:
persisted: false (پیشفرض) یا true
durability: 'relaxed' (پیشفرض) یا 'strict'
'strict': در برابر قطع برق ایمنتر است؛ ممکن است سرعت نوشتن کم شود، باتری بیشتر مصرف کند و عمر حافظهی فیزیکی کوتاهتر شود.
'relaxed': در صورت قطع برق ممکن است چند ثانیهی آخر اطلاعات از بین برود؛ در عوض نوشتن سریعتر و دوام باتری و حافظهی بیشتر است.
دسترسی به APIهای حافظه از داخل هر سطل
هر سطل به همان APIهای همیشگی (IndexedDB، Cache، File و …) وصل است؛ فقط ورودی از طریق خود سطل انجام میشود.
const inboxDb = await new Promise((resolve, reject) => {
const request = inboxBucket.indexedDB.open('messages');
request.onupgradeneeded = () => { /* کد مهاجرت */ };
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});🔗https://developer.chrome.com/docs/web-platform/storage-buckets
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
🎯 بارگذاری مشروط فایلهای CSS با استفاده از @supports
دستور کاربردی دیگری که در این زمینه مطرح میشود، `@supports` است. با استفاده از آن میتوان برخی سبکها را تنها زمانی بارگذاری کرد که مرورگر از قابلیتهای خاص CSS پشتیبانی کند. این ویژگی ابزاری قدرتمند برای پیادهسازی بهبود تدریجی (Progressive Enhancement) به شمار میآید و به توسعهدهندگان کمک میکند تا تجربهی کاربری یکسانی را در مرورگرهای مختلف حفظ کنند.
در این مثال، مرورگر فایل `scroll-animations.css` را فقط در صورتی بارگذاری میکند که از ویژگی `animation-timeline: scroll()` پشتیبانی داشته باشد. این روش راهی تمیز و هوشمندانه برای استفادهی بهینه از قابلیتهای مدرن CSS است.
#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
دستور کاربردی دیگری که در این زمینه مطرح میشود، `@supports` است. با استفاده از آن میتوان برخی سبکها را تنها زمانی بارگذاری کرد که مرورگر از قابلیتهای خاص CSS پشتیبانی کند. این ویژگی ابزاری قدرتمند برای پیادهسازی بهبود تدریجی (Progressive Enhancement) به شمار میآید و به توسعهدهندگان کمک میکند تا تجربهی کاربری یکسانی را در مرورگرهای مختلف حفظ کنند.
<style>
@import url('scroll-animations.css') supports(animation-timeline: scroll());
</style>
در این مثال، مرورگر فایل `scroll-animations.css` را فقط در صورتی بارگذاری میکند که از ویژگی `animation-timeline: scroll()` پشتیبانی داشته باشد. این روش راهی تمیز و هوشمندانه برای استفادهی بهینه از قابلیتهای مدرن CSS است.
#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
کار با dispatchEvent در جاوااسکریپت 👨🏫
متد dispatchEvent در جاوااسکریپت این امکان را میدهد که رویدادها را بهصورت برنامهنویسی برای عناصر ارسال کرد؛ در نتیجه، هندلرهای رویداد همانطور فعال میشوند که گویی کاربر آن را رقم زده است.
📚 اصول استفاده
برای ارسال یک رویداد باید:
✔️ رویداد را بسازید؛
✔️ آن را با dispatchEvent ارسال کنید.
حالا اگر روی دکمهای هندلر رویداد click تعریف شده باشد، اجرا میشود، درست همانند زمانی که کاربر واقعاً کلیک کرده باشد. 👍
📚 رویدادهای همراه با داده
اگر لازم است دادههای اضافی همراه رویداد ارسال شود، از CustomEvent استفاده میکنیم؛ رویدادی ویژه که امکان انتقال دادهها را از طریق ویژگی detail فراهم میکند.
✔️ detail: شیئی است که هر دادهای را که بخواهید میتواند در خود جای دهد؛
✔️ bubbles (اختیاری): رویداد میتواند در درخت DOM به سمت بالا «بجهد»؛
✔️ cancelable (اختیاری): اجازه میدهد رفتار پیشفرض رویداد لغو شود.
📚 چرا به این ابزار نیاز داریم؟
⏺️ میتوان در هر لحظهای رویداد را بهراحتی ارسال کرد؛
⏺️ با CustomEvent هر دادهای را میان اجزا رد و بدل کرد؛
⏺️ برای تست یا شبیهسازی اعمال کاربر روی صفحه بسیار کارآمد است.
در مجموع، این ابزار برای ساخت رابطهایی پویا و انعطافپذیر بینظیر است؛ از آن بهره بگیرید تا رویدادها را مدیریت کرده و دادهها را میان عناصر صفحه جابهجا کنید. 👍
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
متد dispatchEvent در جاوااسکریپت این امکان را میدهد که رویدادها را بهصورت برنامهنویسی برای عناصر ارسال کرد؛ در نتیجه، هندلرهای رویداد همانطور فعال میشوند که گویی کاربر آن را رقم زده است.
📚 اصول استفاده
برای ارسال یک رویداد باید:
✔️ رویداد را بسازید؛
✔️ آن را با dispatchEvent ارسال کنید.
const button = document.querySelector('button');
const event = new Event('click'); // ساخت رویداد
button.dispatchEvent(event); // ارسال رویدادحالا اگر روی دکمهای هندلر رویداد click تعریف شده باشد، اجرا میشود، درست همانند زمانی که کاربر واقعاً کلیک کرده باشد. 👍
📚 رویدادهای همراه با داده
اگر لازم است دادههای اضافی همراه رویداد ارسال شود، از CustomEvent استفاده میکنیم؛ رویدادی ویژه که امکان انتقال دادهها را از طریق ویژگی detail فراهم میکند.
const customEvent = new CustomEvent('dataChanged', {
detail: { value: 'متن جدید' },
bubbles: true, // رویداد در DOM به سمت بالا میجهد
cancelable: true // امکان لغل رفتار پیشفرض وجود دارد
});✔️ detail: شیئی است که هر دادهای را که بخواهید میتواند در خود جای دهد؛
✔️ bubbles (اختیاری): رویداد میتواند در درخت DOM به سمت بالا «بجهد»؛
✔️ cancelable (اختیاری): اجازه میدهد رفتار پیشفرض رویداد لغو شود.
📚 چرا به این ابزار نیاز داریم؟
⏺️ میتوان در هر لحظهای رویداد را بهراحتی ارسال کرد؛
⏺️ با CustomEvent هر دادهای را میان اجزا رد و بدل کرد؛
⏺️ برای تست یا شبیهسازی اعمال کاربر روی صفحه بسیار کارآمد است.
در مجموع، این ابزار برای ساخت رابطهایی پویا و انعطافپذیر بینظیر است؛ از آن بهره بگیرید تا رویدادها را مدیریت کرده و دادهها را میان عناصر صفحه جابهجا کنید. 👍
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
👍3
Vue Bits گنجینهای بزرگ از اجزای رابط کاربری متحرک VueJS است که طراحی شده تا به وبسایتهایتان جان تازهای ببخشد. انیمیشنهای خیرهکننده، کامپوننتهای متنوع، پسزمینههای خلاقانه و امکاناتی منحصربهفرد را در اختیارتان میگذارد — و همهی اینها کاملاً رایگاناند!
هر کامپوننت با گزینههای شخصیسازی بهصورت prop همراه شده تا بتوانید در سریعترین زمان نتیجهی دلخواهتان را بگیرید.
ویژگیهای کلیدی
بیش از نود کامپوننت (انیمیشن متن، انیمیشن، کامپوننت و پسزمینه) که هر هفته افزوده میشود
کمترین وابستگیها و امکان تنظیم کامل همهی اجزا از طریق prop
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
هر کامپوننت با گزینههای شخصیسازی بهصورت prop همراه شده تا بتوانید در سریعترین زمان نتیجهی دلخواهتان را بگیرید.
ویژگیهای کلیدی
بیش از نود کامپوننت (انیمیشن متن، انیمیشن، کامپوننت و پسزمینه) که هر هفته افزوده میشود
کمترین وابستگیها و امکان تنظیم کامل همهی اجزا از طریق prop
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
🔥1
موارد استفاده از <datalist> 🎨
عنصر <datalist> اغلب نادیده گرفته میشود، در حالی که قابلیتهای بسیار مفیدی دارد. 😔
با کمک این تگ میتوان فهرستی از گزینههای از پیش تعریفشده را در اختیار کاربر گذاشت تا از میان آنها انتخاب کند، بدون آنکه از وارد کردن مقدار دلخواه خود بازداشته شود.
این ویژگی زمانی ایدئال است که بخواهیم گزینههای رایج یا پرکاربرد را پیشنهاد دهیم، اما کاربر را به انتخاب آنها مجبور نکنیم.
📚 برای استفاده از <datalist> باید چند گام ساده را انجام داد:
✔️ ایجاد عنصر <datalist> با یک شناسهی منحصربهفرد؛
✔️ افزودن عناصر <option> درون <datalist> برای نمایش گزینههای قابل انتخاب؛
✔️ درون فیلد ورودی (<input>)، افزودن ویژگی list که مقدار آن باید با شناسهی عنصر <datalist> یکسان باشد.
نمونه:
گذشته از فیلدهای متنی، میتوان از <datalist> برای انتخاب رنگ نیز استفاده کرد. مرورگرها یک انتخابگر رنگ استاندارد در اختیار کاربر قرار میدهند که امکان انتخاب از میان رنگهای پیشنهادی را فراهم میکند.
کاربر میتواند یکی از رنگهای ارائهشده را انتخاب کند یا رنگ دلخواه خود را وارد نماید، و این انعطافپذیری باعث میشود روند انتخاب سادهتر و کاربرپسندتر شود. 👍
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
عنصر <datalist> اغلب نادیده گرفته میشود، در حالی که قابلیتهای بسیار مفیدی دارد. 😔
با کمک این تگ میتوان فهرستی از گزینههای از پیش تعریفشده را در اختیار کاربر گذاشت تا از میان آنها انتخاب کند، بدون آنکه از وارد کردن مقدار دلخواه خود بازداشته شود.
این ویژگی زمانی ایدئال است که بخواهیم گزینههای رایج یا پرکاربرد را پیشنهاد دهیم، اما کاربر را به انتخاب آنها مجبور نکنیم.
📚 برای استفاده از <datalist> باید چند گام ساده را انجام داد:
✔️ ایجاد عنصر <datalist> با یک شناسهی منحصربهفرد؛
✔️ افزودن عناصر <option> درون <datalist> برای نمایش گزینههای قابل انتخاب؛
✔️ درون فیلد ورودی (<input>)، افزودن ویژگی list که مقدار آن باید با شناسهی عنصر <datalist> یکسان باشد.
نمونه:
<label for="browsers">مرورگر را انتخاب کنید:</label>
<input list="browser-list" name="browsers" id="browsers">
<datalist id="browser-list">
<option value="Chrome">
<option value="Firefox">
<option value="Safari">
<option value="Edge">
</datalist>
گذشته از فیلدهای متنی، میتوان از <datalist> برای انتخاب رنگ نیز استفاده کرد. مرورگرها یک انتخابگر رنگ استاندارد در اختیار کاربر قرار میدهند که امکان انتخاب از میان رنگهای پیشنهادی را فراهم میکند.
کاربر میتواند یکی از رنگهای ارائهشده را انتخاب کند یا رنگ دلخواه خود را وارد نماید، و این انعطافپذیری باعث میشود روند انتخاب سادهتر و کاربرپسندتر شود. 👍
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
👍1
چگونه باید پارامترها را بهدرستی در نشانی اینترنتی (URL) ارسال کرد؟ 🤔
هنگام ارسال پارامترها از طریق نشانی اینترنتی، بسیار مهم است که آنها را بهدرستی کُدگذاری کنیم. این کار باعث میشود درخواستها بهدرستی اجرا شوند و دادهها دچار اعوجاج نشوند. در JavaScript چند تابع مفید برای این کار وجود دارد:
---
### ۱️⃣ encodeURIComponent()
از این تابع برای کُدگذاری مقدار پارامترها در نشانی اینترنتی استفاده میشود. این تابع تضمین میکند که همهٔ نویسههای خاص (مانند فاصله، علامت &، علامت =، یا /) به معادلهای ایمن درصدیشان تبدیل شوند.
نمونه:
➡️ همیشه زمانی که مقدار پارامترها (مثل نام یا شهر) را کُدگذاری میکنید از
---
### ۲️⃣ encodeURI()
از این تابع برای کُدگذاری کل نشانی اینترنتی استفاده میشود، اما نویسههایی مانند ?, &, = و / را که بخشی از ساختار درخواست هستند، دستنخورده باقی میگذارد. این روش زمانی مفید است که میخواهید کل URL را کُدگذاری کنید، اما نمیخواهید جداکنندههای پارامترها تغییر کنند.
نمونه:
➡️ از
---
### ۳️⃣ URLSearchParams
این شیء برای کار آسانتر با پارامترهای URL طراحی شده است. بهطور خودکار مقادیر پارامترها را کُدگذاری میکند و متدهایی برای افزودن، حذف یا تغییر آنها در اختیار میگذارد که کار با دادههای پویا را سادهتر میکند.
---
### در نتیجه:
✔️
✔️
✔️
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
هنگام ارسال پارامترها از طریق نشانی اینترنتی، بسیار مهم است که آنها را بهدرستی کُدگذاری کنیم. این کار باعث میشود درخواستها بهدرستی اجرا شوند و دادهها دچار اعوجاج نشوند. در JavaScript چند تابع مفید برای این کار وجود دارد:
encodeURIComponent()`، `encodeURI() و URLSearchParams. بیایید ببینیم هرکدام چه کاری انجام میدهند و در چه شرایطی بهتر است از آنها استفاده شود. 😁---
### ۱️⃣ encodeURIComponent()
از این تابع برای کُدگذاری مقدار پارامترها در نشانی اینترنتی استفاده میشود. این تابع تضمین میکند که همهٔ نویسههای خاص (مانند فاصله، علامت &، علامت =، یا /) به معادلهای ایمن درصدیشان تبدیل شوند.
نمونه:
const name = "Katerina & Pro Frontend";
const encodedName = encodeURIComponent(name);
console.log(encodedName); // Katerina%20%26%20Pro%20Frontend
➡️ همیشه زمانی که مقدار پارامترها (مثل نام یا شهر) را کُدگذاری میکنید از
encodeURIComponent() استفاده کنید تا از تفسیر نادرست نویسههایی مانند فاصله یا علامت & جلوگیری شود.---
### ۲️⃣ encodeURI()
از این تابع برای کُدگذاری کل نشانی اینترنتی استفاده میشود، اما نویسههایی مانند ?, &, = و / را که بخشی از ساختار درخواست هستند، دستنخورده باقی میگذارد. این روش زمانی مفید است که میخواهید کل URL را کُدگذاری کنید، اما نمیخواهید جداکنندههای پارامترها تغییر کنند.
نمونه:
const url = "https://example.com/search?channel=Katerina | Pro Frontend";
const encodedUrl = encodeURI(url);
console.log(encodedUrl); // https://example.com/search?channel=Katerina%20%7C%20Pro%20Frontend
➡️ از
encodeURI() برای کُدگذاری کل URL (هم مسیر و هم پارامترها) استفاده کنید، در حالی که ساختار کلی پرسوجو را حفظ میکنید.---
### ۳️⃣ URLSearchParams
این شیء برای کار آسانتر با پارامترهای URL طراحی شده است. بهطور خودکار مقادیر پارامترها را کُدگذاری میکند و متدهایی برای افزودن، حذف یا تغییر آنها در اختیار میگذارد که کار با دادههای پویا را سادهتر میکند.
const params = new URLSearchParams();
params.append('name', 'John Doe');
console.log(params.toString()); // 'name=John+Doe' —
---
### در نتیجه:
✔️
encodeURIComponent() — برای کُدگذاری مقادیر پارامترها (مانند name=Katerina & Pro Frontend)✔️
encodeURI() — برای کُدگذاری کل نشانی اینترنتی همراه با ساختار پرسوجو✔️
URLSearchParams — برای افزودن، ویرایش و مدیریت آسان پارامترهای URL#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
This media is not supported in your browser
VIEW IN TELEGRAM
⚜️عزیز خدا ذلیل نمیشود
💚سالروز ولادت حضرت زینب(س)
🔗https://www.youtube.com/watch?v=pg9wdMnPfcg
#️⃣#event
👥@IR_javascript_group
🆔@IR_javascript
💚سالروز ولادت حضرت زینب(س)
🔗https://www.youtube.com/watch?v=pg9wdMnPfcg
#️⃣#event
👥@IR_javascript_group
🆔@IR_javascript
❤9👎2🙏1
آشنایی با
این ویژگی رشتهای است که توسط شیء
به کمک آن میتوان وبسایت را متناسب با مرورگر یا دستگاه خاصی تنظیم و بهینه کرد. 😁
---
### 🔹 نمونهٔ رشته:
---
### اجزای اصلی رشتهٔ
⏺️ Mozilla/5.0 — برچسب تاریخی؛
⏺️ Macintosh; Intel Mac OS X 10_15_7 — اطلاعات مربوط به سیستمعامل؛
⏺️ AppleWebKit/537.36 — موتور رندر مرورگر؛
⏺️ Chrome/141.0.0.0 — نسخهٔ مرورگر؛
⏺️ Safari/537.36 — اجزای تکمیلی.
---
### 🎯 چرا این اطلاعات مفید است؟
✔️ تشخیص دستگاه و پلتفرم: میتوان فهمید کاربر از موبایل، تبلت یا رایانهٔ شخصی استفاده میکند.
✔️ سازگاری: دانستن نوع مرورگر کمک میکند سایت با ویژگیها و محدودیتهای آن تطبیق یابد.
✔️ طراحی واکنشگرا: نمایش درست و بهینهٔ سایت روی دستگاههای گوناگون را ممکن میسازد.
---
### 💡 نمونهٔ استفاده از
---
### ⚠️ نکات مهم:
✔️ قابل تغییر بودن رشته: کاربران میتوانند با افزونهها مقدار
✔️ دقت پایین اطلاعات: برخی مرورگرها خود را بهجای مرورگر دیگر معرفی میکنند.
برای نتایج قابلاعتمادتر، بهتر است بهجای تکیه بر
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
navigator.userAgent 🧐این ویژگی رشتهای است که توسط شیء
navigator برگردانده میشود و شامل اطلاعاتی دربارهٔ مرورگر، سیستمعامل و دستگاه کاربر است.به کمک آن میتوان وبسایت را متناسب با مرورگر یا دستگاه خاصی تنظیم و بهینه کرد. 😁
---
### 🔹 نمونهٔ رشته:
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36"
---
### اجزای اصلی رشتهٔ
userAgent:⏺️ Mozilla/5.0 — برچسب تاریخی؛
⏺️ Macintosh; Intel Mac OS X 10_15_7 — اطلاعات مربوط به سیستمعامل؛
⏺️ AppleWebKit/537.36 — موتور رندر مرورگر؛
⏺️ Chrome/141.0.0.0 — نسخهٔ مرورگر؛
⏺️ Safari/537.36 — اجزای تکمیلی.
---
### 🎯 چرا این اطلاعات مفید است؟
✔️ تشخیص دستگاه و پلتفرم: میتوان فهمید کاربر از موبایل، تبلت یا رایانهٔ شخصی استفاده میکند.
✔️ سازگاری: دانستن نوع مرورگر کمک میکند سایت با ویژگیها و محدودیتهای آن تطبیق یابد.
✔️ طراحی واکنشگرا: نمایش درست و بهینهٔ سایت روی دستگاههای گوناگون را ممکن میسازد.
---
### 💡 نمونهٔ استفاده از
userAgent:if (/Chrome/.test(navigator.userAgent)) {
console.log("کاربر از مرورگر Chrome استفاده میکند");
}---
### ⚠️ نکات مهم:
✔️ قابل تغییر بودن رشته: کاربران میتوانند با افزونهها مقدار
userAgent را تغییر دهند.✔️ دقت پایین اطلاعات: برخی مرورگرها خود را بهجای مرورگر دیگر معرفی میکنند.
برای نتایج قابلاعتمادتر، بهتر است بهجای تکیه بر
userAgent از روش feature detection (شناسایی قابلیتها) استفاده کنید — که در پست بعدی دربارهاش صحبت خواهیم کرد. 😉#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
👍2🔥1
گاهی بهنظر میرسد که فهمیدن وضعیت کلیدهای ترکیبی مانند Shift**، **Control**، **Alt یا Meta کار پیچیدهای است. 🙈
«اصلاً چطور باید این کار را انجام داد؟ آیا باید هر کلید را جداگانه بررسی کنیم؟» 🤔
نگران نباشید — راهحل وجود دارد و بسیار سادهتر از چیزی است که تصور میکنید! تنها چیزی که نیاز دارید، متد `getModifierState()` در جاوااسکریپت است که در رویدادهای صفحهکلید در دسترس میباشد.
این متد به شما اجازه میدهد بهراحتی بفهمید آیا یک کلید ترکیبی (مثلاً Shift یا Ctrl یا Alt) در لحظهٔ وقوع رویداد فشرده شده است یا نه.
---
### 💡 نمونهٔ استفاده:
متد
---
### 🎯 مثال کاربردی
فرض کنید میخواهیم از رفتار پیشفرض مرورگر هنگام فشردن ترکیب Ctrl + S (ذخیرهٔ صفحه) جلوگیری کنیم:
---
### ✅ نتیجه
با استفاده از تنها چند خط کد و متد **
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
«اصلاً چطور باید این کار را انجام داد؟ آیا باید هر کلید را جداگانه بررسی کنیم؟» 🤔
نگران نباشید — راهحل وجود دارد و بسیار سادهتر از چیزی است که تصور میکنید! تنها چیزی که نیاز دارید، متد `getModifierState()` در جاوااسکریپت است که در رویدادهای صفحهکلید در دسترس میباشد.
این متد به شما اجازه میدهد بهراحتی بفهمید آیا یک کلید ترکیبی (مثلاً Shift یا Ctrl یا Alt) در لحظهٔ وقوع رویداد فشرده شده است یا نه.
---
### 💡 نمونهٔ استفاده:
document.addEventListener('keydown', function(event) {
if (event.getModifierState('Shift')) {
console.log('کلید Shift فشرده شده است!');
}
if (event.getModifierState('Control')) {
console.log('کلید Control فشرده شده است!');
}
});متد
getModifierState() مقدار true برمیگرداند اگر کلید ترکیبی در آن لحظه فشرده شده باشد، و در غیر این صورت false. به همین سادگی! 😁---
### 🎯 مثال کاربردی
فرض کنید میخواهیم از رفتار پیشفرض مرورگر هنگام فشردن ترکیب Ctrl + S (ذخیرهٔ صفحه) جلوگیری کنیم:
document.addEventListener('keydown', function(event) {
if (event.getModifierState('Control') && event.key === 's') {
event.preventDefault(); // جلوگیری از عملکرد پیشفرض
console.log('عملیات ذخیرهسازی لغو شد!');
}
});---
### ✅ نتیجه
با استفاده از تنها چند خط کد و متد **
getModifierState()**، میتوانیم بهسادگی وضعیت کلیدهای ترکیبی موردنیاز را بررسی و کنترل کنیم. 👍#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
نوآوریهای CSS — کنترل حداکثری با انتخابگر :nth-child() و دستور جدید OF S
با استفاده از شبهکلاس `:nth-child()` میتوان عناصر موجود در DOM را بر اساس ترتیبشان انتخاب کرد. نحوۀ کلاسیک An+B به شما امکان میدهد انتخاب عناصر را با دقت بالا کنترل کنید.
برای نمونه:
*
*
*
و غیره...
اما حالا ویژگی جدیدی در سطح چهارم انتخابگرهای CSS معرفی شده است — یعنی سینتکس OF S. این قابلیت به شما اجازه میدهد ابتدا عناصر را بر اساس یک فیلتر مشخص (مثلاً کلاس یا نوع خاصی از عناصر) محدود کنید، و سپس از میان همان گروه، عناصر مورد نظر را بر اساس ترتیبشان انتخاب نمایید.
ساختار کلی:
در سطح چهارم انتخابگرهای CSS (Selectors Level 4) که در [W3C](https://www.w3.org/TR/selectors-4/) تعریف شده است، میتوان بهصورت اختیاری یک فهرست از انتخابگرها را در
---
### 📘 مثال
---
### 🔍 چگونه کار میکند؟
تصور کنید شبهکلاس
ابتدا مرورگر همهٔ عناصری را که با انتخابگرهای
به این ترتیب میتوان عناصر پراکنده در صفحه را که کلاسهای خاصی دارند، در یک فهرست مجازی جمع کرد و سپس از میان آنها دقیقاً عنصر دلخواه را بر اساس موقعیتش در سند انتخاب نمود.
---
با این قابلیت، دامنۀ کارهایی که میتوان تنها با CSS انجام داد روزبهروز گستردهتر میشود — بدون نیاز به جاوااسکریپت! 🎨
#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
با استفاده از شبهکلاس `:nth-child()` میتوان عناصر موجود در DOM را بر اساس ترتیبشان انتخاب کرد. نحوۀ کلاسیک An+B به شما امکان میدهد انتخاب عناصر را با دقت بالا کنترل کنید.
برای نمونه:
*
:nth-child(2) — انتخاب دومین فرزند.*
:nth-child(2n) — انتخاب تمام فرزندان زوج.*
:nth-child(2n+1) — انتخاب تمام فرزندان فرد.و غیره...
اما حالا ویژگی جدیدی در سطح چهارم انتخابگرهای CSS معرفی شده است — یعنی سینتکس OF S. این قابلیت به شما اجازه میدهد ابتدا عناصر را بر اساس یک فیلتر مشخص (مثلاً کلاس یا نوع خاصی از عناصر) محدود کنید، و سپس از میان همان گروه، عناصر مورد نظر را بر اساس ترتیبشان انتخاب نمایید.
ساختار کلی:
:nth-child(An+B [of S])
:nth-last-child(An+B [of S])
در سطح چهارم انتخابگرهای CSS (Selectors Level 4) که در [W3C](https://www.w3.org/TR/selectors-4/) تعریف شده است، میتوان بهصورت اختیاری یک فهرست از انتخابگرها را در
:nth-child() یا :nth-last-child() ارسال کرد.---
### 📘 مثال
<div class="test-1">one</div>
<div class="test-2">two</div>
<div class="test-1">three</div>
<div class="test-2">four</div>
:nth-child(2 of .test-1, .test-2) {
outline: 0.3rem dashed lightblue;
}---
### 🔍 چگونه کار میکند؟
تصور کنید شبهکلاس
:nth-child با دستور of S مانند یک فیلتر هوشمند عمل میکند.ابتدا مرورگر همهٔ عناصری را که با انتخابگرهای
.test-1 و .test-2 مطابقت دارند پیدا میکند. سپس از میان آن فهرست فیلترشده، دومین عنصر را انتخاب میکند و سبک (style) مورد نظر را به آن اعمال میکند.به این ترتیب میتوان عناصر پراکنده در صفحه را که کلاسهای خاصی دارند، در یک فهرست مجازی جمع کرد و سپس از میان آنها دقیقاً عنصر دلخواه را بر اساس موقعیتش در سند انتخاب نمود.
---
با این قابلیت، دامنۀ کارهایی که میتوان تنها با CSS انجام داد روزبهروز گستردهتر میشود — بدون نیاز به جاوااسکریپت! 🎨
#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
چگونه بدون استفاده از
یک ترفند جالب وجود دارد که با استفاده از نماد
📕 نماد `\A` چیست؟
در CSS،
با این حال، برای کارکرد صحیح این روش، لازم است ویژگی
مثال:
اینجا
✅ نتیجه: این روش یک راه عالی برای تمیز نگه داشتن کد و راحتتر کردن مدیریت متن است.
#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
<br> در CSS شکست خط ایجاد کنیم 🧐یک ترفند جالب وجود دارد که با استفاده از نماد
\A و سبکهایی مثل white-space: pre-wrap میتوان شکست خط را در CSS ایجاد کرد. بیایید بررسی کنیم چگونه این کار انجام میشود!📕 نماد `\A` چیست؟
در CSS،
\A راهی برای وارد کردن شکست خط در ویژگی content است که معمولاً در پیشعنصرها (::before و ::after) استفاده میشود. به جای قرار دادن دستی <br>`، کافی است `\A را بنویسیم تا مرورگر بداند در این نقطه باید خط جدید شروع شود.با این حال، برای کارکرد صحیح این روش، لازم است ویژگی
white-space را اضافه کنیم، مثلاً با مقدار pre-wrap. این ویژگی به مرورگر میگوید: «شکستهای خط را مانند تگ <pre> پردازش کن، ولی همچنین اجازه بده متن در صورت نیاز به خط بعد منتقل شود.»مثال:
.text::before {
content: "خط اول\Aخط دوم"; /* \A شکست خط ایجاد میکند */
white-space: pre-wrap; /* \A را به عنوان شکست خط پردازش میکند */
}اینجا
\A در ویژگی content شکست خط ایجاد میکند و white-space: pre-wrap به مرورگر کمک میکند این شکست را به درستی نمایش دهد.✅ نتیجه: این روش یک راه عالی برای تمیز نگه داشتن کد و راحتتر کردن مدیریت متن است.
#️⃣#tip #css
👥@IR_javascript_group
🆔@IR_javascript
👍1
مسدود کردن dev-tool
اگر امکانش رو دارید به این سایت [+لینک] بروید و با هر روشی dev-tools رو باز کنید
پکیجی برای غیرفعالسازی ابزارهای توسعهدهندهی وب از طریق دکمهی F12، کلیک راست و منوی مرورگر
🔗https://theajack.github.io/disable-devtool/
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
اگر امکانش رو دارید به این سایت [+لینک] بروید و با هر روشی dev-tools رو باز کنید
پکیجی برای غیرفعالسازی ابزارهای توسعهدهندهی وب از طریق دکمهی F12، کلیک راست و منوی مرورگر
🔗https://theajack.github.io/disable-devtool/
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
😁1
EyeDropper API: انتخاب رنگها مستقیم از روی صفحه 🤩
هر ساله APIهای بومی جدیدی برای مرورگرها معرفی میشوند و یکی از این ابزارهای جالب، EyeDropper API است.
EyeDropper API به توسعهدهندگان وب این امکان را میدهد که کاربران بتوانند با استفاده از ابزار قطرهچکان (pipette) رنگها را مستقیماً از صفحه انتخاب کنند. پس از انتخاب، مقدار رنگ به صورت sRGBHex (مثل
---
### نمونه ساده استفاده:
---
### نحوه عملکرد 🧐
1. فراخوانی متد
2. باز شدن ابزار قطرهچکان در مرورگر؛
3. انتخاب رنگ توسط کاربر؛
4. بازگرداندن رنگ انتخابشده در فرمت `#RRGGBB`.
---
### مزایای API
* سادگی: تنها با چند خط کد میتوان انتخاب رنگ را در وبسایت ادغام کرد.
* تعاملپذیری: امکان تنظیم رابط کاربری و اجازه دادن به کاربران برای انتخاب رنگ پسزمینه، متن یا سایر عناصر.
* کاربرد در طراحی: ایدهآل برای ویرایشگرهای آنلاین تصویر، تولیدکنندههای پالت رنگ و رابطهای واکنشگرا.
---
### محدودیت پشتیبانی
این API در حال حاضر فقط در Chrome، Edge و Opera پشتیبانی میشود. در مرورگرهای Safari و Firefox هنوز قابل استفاده نیست.
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
هر ساله APIهای بومی جدیدی برای مرورگرها معرفی میشوند و یکی از این ابزارهای جالب، EyeDropper API است.
EyeDropper API به توسعهدهندگان وب این امکان را میدهد که کاربران بتوانند با استفاده از ابزار قطرهچکان (pipette) رنگها را مستقیماً از صفحه انتخاب کنند. پس از انتخاب، مقدار رنگ به صورت sRGBHex (مثل
#ff5733) بازگردانده میشود.---
### نمونه ساده استفاده:
if ("EyeDropper" in window) {
const eyeDropper = new EyeDropper();
eyeDropper.open()
.then(result => {
console.log("رنگ انتخابشده:", result.sRGBHex);
document.body.style.backgroundColor = result.sRGBHex;
})
.catch(err => {
console.error("خطا:", err);
});
}---
### نحوه عملکرد 🧐
1. فراخوانی متد
open() روی شیء `EyeDropper`؛2. باز شدن ابزار قطرهچکان در مرورگر؛
3. انتخاب رنگ توسط کاربر؛
4. بازگرداندن رنگ انتخابشده در فرمت `#RRGGBB`.
---
### مزایای API
* سادگی: تنها با چند خط کد میتوان انتخاب رنگ را در وبسایت ادغام کرد.
* تعاملپذیری: امکان تنظیم رابط کاربری و اجازه دادن به کاربران برای انتخاب رنگ پسزمینه، متن یا سایر عناصر.
* کاربرد در طراحی: ایدهآل برای ویرایشگرهای آنلاین تصویر، تولیدکنندههای پالت رنگ و رابطهای واکنشگرا.
---
### محدودیت پشتیبانی
این API در حال حاضر فقط در Chrome، Edge و Opera پشتیبانی میشود. در مرورگرهای Safari و Firefox هنوز قابل استفاده نیست.
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
👍1
مرتب نگه داشتن head
با یک اسکریپت جالب برخورد کردم که امکان انجام یک حسابرسی بسیار سریع و اصلاح نسبتاً سریع ترتیب تگها درون <head> را فراهم میکند.
یک قطعه CSS از هری رابرتز وجود دارد که ترتیب نادرست تگهای سیستمی را برجسته میکند. این فایل ct.css نام دارد [+لینک]. همچنین یک ارائه درباره این قطعه وجود دارد. هری یک متخصص فوقالعاده در زمینه عملکرد وب است و اسلایدهای او [+لینک] بسیار متقاعدکننده هستند.
اسکریپت capo.js تقریباً همان کار را انجام میدهد، با این تفاوت که نتایج حسابرسی را در کنسول نمایش میدهد و پیشنهاد میکند چگونه متا تگها، نشانهگذاری و سایر محتوای <head> را بهتر مرتب کنیم تا مهمترین اطلاعات برای بارگذاری سریع صفحه در اولویت قرار گیرند و بقیه موارد بعداً بارگذاری شوند.
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
با یک اسکریپت جالب برخورد کردم که امکان انجام یک حسابرسی بسیار سریع و اصلاح نسبتاً سریع ترتیب تگها درون <head> را فراهم میکند.
یک قطعه CSS از هری رابرتز وجود دارد که ترتیب نادرست تگهای سیستمی را برجسته میکند. این فایل ct.css نام دارد [+لینک]. همچنین یک ارائه درباره این قطعه وجود دارد. هری یک متخصص فوقالعاده در زمینه عملکرد وب است و اسلایدهای او [+لینک] بسیار متقاعدکننده هستند.
اسکریپت capo.js تقریباً همان کار را انجام میدهد، با این تفاوت که نتایج حسابرسی را در کنسول نمایش میدهد و پیشنهاد میکند چگونه متا تگها، نشانهگذاری و سایر محتوای <head> را بهتر مرتب کنیم تا مهمترین اطلاعات برای بارگذاری سریع صفحه در اولویت قرار گیرند و بقیه موارد بعداً بارگذاری شوند.
#️⃣#tool
👥@IR_javascript_group
🆔@IR_javascript
Speaker Deck
Get Your Head Straight
Despite being the only section of a website that a user never sees, the HEAD is arguably the most important. It is bound to its own unique set of rules …
ترتیب عناصر در
چند وقت یکبار به
ابتدا باید از صحت ساختار اطمینان حاصل کرد. درون
* یک عنصر
* یک عنصر
* صفر یا بیشتر عناصر
* صفر یا بیشتر عناصر
* صفر یا بیشتر عناصر
* صفر یا بیشتر عناصر
* صفر یا بیشتر عناصر
* صفر یا بیشتر عناصر
اگر هر عنصر دیگری در
مثال:
پارسر این کد را به شکل زیر بازسازی میکند:
این موضوع پیامدهای مختلفی دارد، زیرا محل و اولویت عناصر در صف بارگذاری منابع، وضعیت مسدودسازی پارسر و عملکرد اسکریپتهایی که به
عناصر غیرمجاز در
دستورالعملهای این افزونهها اغلب پیشنهاد میکنند که کد مربوطه در ابتدای
منبع دیگر مشکلات، ترتیب نادرست عناصر در
دو ابزار برای شناسایی مشکلات ترتیب عناصر وجود دارد:
*
*
مدیران تگ نیز توجه ویژهای میطلبند، زیرا از طریق آنها اسکریپتهای بازاریابی مختلف بهطور غیرقابل کنترل وارد سایت شده و
#️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
<head>چند وقت یکبار به
<head> پروژههای خود سر میزنید و بررسی میکنید که چه اتفاقی در آنجا میافتد؟ بهتر است این کار را بهصورت دورهای انجام دهید، زیرا محتوای <head> و ترتیب عناصر میتواند تأثیر منفی بر عملکرد سایت داشته باشد.ابتدا باید از صحت ساختار اطمینان حاصل کرد. درون
<head> تنها برخی عناصر مشخص مجاز هستند:* یک عنصر
<title>* یک عنصر
<base>* صفر یا بیشتر عناصر
<link>* صفر یا بیشتر عناصر
<meta>* صفر یا بیشتر عناصر
<script>* صفر یا بیشتر عناصر
<style>* صفر یا بیشتر عناصر
<template>* صفر یا بیشتر عناصر
<noscript>اگر هر عنصر دیگری در
<head> مشاهده شود، پارسر فوراً <head> را میبندد و عناصر باقیمانده را به <body> منتقل میکند.مثال:
<head>
<meta charset="utf-8">
<title>سایت من</title>
<img src="pixel.png">
<link
rel="preload"
href="custom-font.woff2"
as="font"
type="font/woff2"
>
<link
rel="stylesheet"
href="styles.css"
>
<script
src="script.js"
defer
></script>
</head>
<body>
<!-- ... -->
</body>
پارسر این کد را به شکل زیر بازسازی میکند:
<head>
<meta charset="utf-8">
<title>سایت من</title>
</head>
<body>
<img src="pixel.png">
<link
rel="preload"
href="custom-font.woff2"
as="font"
type="font/woff2"
>
<link
rel="stylesheet"
href="styles.css"
>
<script
src="script.js"
defer
></script>
<!-- ... -->
</body>
این موضوع پیامدهای مختلفی دارد، زیرا محل و اولویت عناصر در صف بارگذاری منابع، وضعیت مسدودسازی پارسر و عملکرد اسکریپتهایی که به
<head> وابستهاند، تغییر میکند.عناصر غیرمجاز در
<head> معمولاً هنگام ادغام «پیکسلها»، فریمهای تحلیلی و دیگر افزونههای جانبی ظاهر میشوند و معمولاً شامل <img>`، <iframe> و <div>` هستند.دستورالعملهای این افزونهها اغلب پیشنهاد میکنند که کد مربوطه در ابتدای
<body> قرار گیرد، اما گاهی همراه با <script> به <head> وارد میشوند. استفاده از ولیدیتور HTML میتواند چنین خطاهایی را شناسایی کند.منبع دیگر مشکلات، ترتیب نادرست عناصر در
<head> است. جابجایی ساده عناصر به ترتیب مناسب میتواند زمان بارگذاری را تا چند ثانیه کاهش دهد. در این زمینه، سخنرانی بسیار خوبی توسط هری رابرتز موجود است.دو ابزار برای شناسایی مشکلات ترتیب عناصر وجود دارد:
*
ct.css — فایل استایلی که عناصر <head> را قابل مشاهده میکند و نقاط مشکلدار را برجسته میسازد.*
capo.js — قطعه کدی که محتوای <head> را تحلیل کرده و ترتیب فعلی و مرتبشده را در کنسول نمایش میدهد.مدیران تگ نیز توجه ویژهای میطلبند، زیرا از طریق آنها اسکریپتهای بازاریابی مختلف بهطور غیرقابل کنترل وارد سایت شده و
<head> را شلوغ میکنند. #️⃣#tip
👥@IR_javascript_group
🆔@IR_javascript
Quicklink
یک کتابخانه کوچک جاوااسکریپت که برای شناسایی لینکهایی طراحی شده است که وارد ناحیه قابل مشاهده مرورگر (viewport) میشوند و منابعی را که این لینکها به آنها اشاره دارند، بهصورت خودکار پیشبارگذاری میکند. این کتابخانه DOM را تحلیل میکند، لینکهایی را که در دید کاربر قرار دارند شناسایی میکند و بارگذاری منابع مرتبط (مانند تصاویر، اسکریپتها یا دادههای دیگر) را آغاز میکند و آنها را در کش ذخیره میکند تا دسترسی بعدی سریعتر شود. این ویژگی بهویژه برای بهینهسازی عملکرد صفحات وب مفید است، زیرا زمان بارگذاری هنگام کلیک روی لینکها را کاهش میدهد.
🔗https://getquick.link/
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
یک کتابخانه کوچک جاوااسکریپت که برای شناسایی لینکهایی طراحی شده است که وارد ناحیه قابل مشاهده مرورگر (viewport) میشوند و منابعی را که این لینکها به آنها اشاره دارند، بهصورت خودکار پیشبارگذاری میکند. این کتابخانه DOM را تحلیل میکند، لینکهایی را که در دید کاربر قرار دارند شناسایی میکند و بارگذاری منابع مرتبط (مانند تصاویر، اسکریپتها یا دادههای دیگر) را آغاز میکند و آنها را در کش ذخیره میکند تا دسترسی بعدی سریعتر شود. این ویژگی بهویژه برای بهینهسازی عملکرد صفحات وب مفید است، زیرا زمان بارگذاری هنگام کلیک روی لینکها را کاهش میدهد.
🔗https://getquick.link/
#️⃣#npm_module
👥@IR_javascript_group
🆔@IR_javascript
❤1
This media is not supported in your browser
VIEW IN TELEGRAM
و در گوشش، با زمزمهای جانکاه صحبت کرد ... .
◾️سالروز شهادت حضرت فاطمه زهرا (ص)
#️⃣#event
👥@IR_javascript_group
🆔@IR_javascript
◾️سالروز شهادت حضرت فاطمه زهرا (ص)
#️⃣#event
👥@IR_javascript_group
🆔@IR_javascript
❤4