نمایش پیام در حال بارگذاری با جاوا اسکریپت (JavaScript)

برای هدف های زیادی می توانیم از جاوا اسکریپت (JavaScript) در وب استفاده کنیم، قابلیت های متنوع و قدرت این زبان اسکریپت نویسی و مهمتر از همه ویژگی سمت کاربر (Client-side) بودن آن این امکان را به برنامه نویس می دهد تا در موقعیت های متفاوت بر فعل و انفعالات رابط کاربری صفحه کنترل داشته و عملکرد و پردازش های مرورگر را مدیریت کند، یکی از این موقعیت ها زمانی است که صفحه سایت یا وبلاگ در حال بارگذاری (Loading) است، بدین منظور در جاوا اسکریپت متدی به نام document.readyState و رویداد document.onreadystatechange وجود دارد که دقیقا با همین هدف یعنی شناسایی زمانی که صفحه وب کاملا بارگذاری می شود تعریف شده اند، به این صورت می توانیم مرحله قبل و بعد از بارگذاری صفحه را از هم تفکیک و به فرض پیامی مبنی بر شکیبایی تا بارگذاری کامل محتوا نمایش دهیم، ایجاد چنین قابلیتی به خصوص برای صفحاتی که دیتای حجیمی دارند می تواند به ارتقای رابط کاربری و عدم بستن صفحه توسط کاربر به دلیل طولانی شدن فرآیند Loading کمک کند، از این رو در مطلب پیش رو می خواهیم با استفاده از متد document.readyState با نحوه نمایش پیام و تصویر "در حال بارگذاری... لطفا چند لحظه صبر کنید!" آشنا شویم.
ایجاد تگ HTML نمایش پیام و تصویر در حال بارگذاری (Loading)
قبل از هر چیز برای نمایش پیام و تصویر در حال بارگذاری یا Loading باید در سورس HTML صفحه تگی با ID مشخص جهت نمایش پیام و انیمیشن یا تصویر تعریف کنیم، این تگ ترجیحا می تواند به صورت تگ div باشد برای نمونه کد زیر را پس از تگ body درج می کنیم، این قسمت در واقع همان بلاکی است که پیام و انیمیشن یا تصویر "صفحه در حال بارگذاری است... لطفا شکیبا باشید!" یا هر متن دلخواه دیگری را نمایش می دهد.
<div id="loading-main">
<div id="loading-animation"></div>
در حال بارگذاری... <br> لطفا چند لحظه صبر کنید!
</div>
در این نمونه کد از پیام متنی و انیمیشن مبتنی بر دستورات CSS برای ایجاد تصویر متحرک کمک گرفته ایم که در ادامه به آن خواهیم پرداخت، نکته مهم در این نمونه کد در نظر گرفتن آی دی یکتا برای تگ های div است که به صورت عبارات loading-main و loading-animation تنظیم شده است، از این آی دی ها برای استایل دهی و شناسایی تگ توسط دستورات جاوا اسکریپتی که در ادامه خواهیم دید استفاده کرده ایم.
سفارشی سازی ظاهری و شناور کردن بلاک با استایل CSS
برای سفارشی سازی ظاهری و شناور کردن بلاک نمایش پیام و انیمیشن یا تصویر در حال بارگذاری (Loading) در بالاترین قسمت صفحه (ترجیحا مابین تگ های head) استایل CSS زیر را به سورس کدها اضافه می کنیم، این استایل به صورت شناور (position: absolute) است و از تکنیک keyframes و transform: rotate برای ایجاد حالت انیمیشن "دایره گردان" استفاده شده است.
<style>
#loading-main {
display: block;
position: absolute;
font-family: Tahoma, Geneva, sans-serif;
font-size: 12px;
color: #f0c;
text-align: center;
direction: rtl;
width: 300px;
height: 200px;
line-height: 22px;
top: 25%;
bottom: 0;
left: 0;
right: 0;
margin:0 auto;
}
#loading-animation {
border: 12px solid #f5f5f5;
border-top: 12px solid #999;
border-radius: 50%;
width: 50px;
height: 50px;
margin: 0 auto;
animation: spin 1s linear infinite;
}
@keyframes spin {
100% {
transform: rotate(360deg);
}
}
</style>
دقت کنیم که فقط یک تگ در خروجی HTML سایت ما باید آی دی loading-main داشته باشد به عبارتی دیگر مقدار آی دی در صفحات وب یکتا است و نباید بین تگ های مختلف مشترک باشد، وجود آی دی همسان برای دو تگ مختلف باعث ایجاد مشکل در شناسایی عناصر صفحه خواهد شد.کنترل نمایش و مخفی سازی بلاک با JavaScript
در حالت عادی و قبل از بارگذاری کامل محتوای صفحه وب بلاک loading-main به صورت مرئی و قابل روئیت است اما زمانی که فرآیند بارگذاری کامل می شود این بلاک باید مخفی شده و نمایش داده نشود، برای کنترل نمایش یا عدم نمایش بلاک و همچنین محتوای تگ body اسکریپت زیر را در کد قالب پس از تگ body و پس از بلاک loading-main درج می کنیم، این اسکریپت در واقع تابعی مبتنی بر متدهای document.readyState، document.querySelector، display و visibility است که با تغییر وضعیت بارگذاری صفحه در رویداد document.onreadystatechange قسمت های شرطی آن اجرا می شود.
<script>
document.onreadystatechange = function() {
if(document.readyState !== "complete") {
document.querySelector("body").style.visibility = "hidden";
document.querySelector("#loading-main").style.visibility = "visible";
} else {
document.querySelector("#loading-main").style.display = "none";
document.querySelector("body").style.visibility = "visible";
}
};
</script>
رویداد document.onreadystatechange با هر تغییر وضعیت بارگذاری صفحه فراخوانی می شود و با بررسی مقدار متناظر متد document.readyState (شامل موارد loading, interactive, complete) می توانیم در صورتی که پاسخ complete بود (یا نبود) تصمیم بگیریم که کدام عنصر را به حالت مرئی و کدام مورد را مخفی کنیم.کد کامل پیام و تصویر "صفحه در حال بارگذاری..." و پیش نمایش آنلاین
همان طور که دیدیم برای ایجاد پیام "صفحه در حال بارگذاری است... لطفا کمی صبر کنید." به کمک جاوا اسکریپت کافی است از نمونه کدهای بالا به ترتیبی که گفتیم در قالب سایت یا وبلاگ خود استفاده کنیم، به این صورت پیش از اینکه صفحه به طور کامل در مرورگر بارگذاری شود پیامی به کاربر نشان داده می شود که بعد از تکمیل بارگذاری محو خواهد شد، در هر صورت برای جمع بندی توضیحات و تجمیع کدها در یک صفحه می توانیم نمونه کد زیر را بررسی و پیش نمایش آنلاین آن را امتحان کنیم ( با توجه به کش شدن تصویر در مرورگر احتمالا در حالت سرور-آنلاین فقط برای بار اول پیام بارگذاری را خواهیم دید اما برای بررسی بیشتر می توانیم کد را در صفحه ای بر روی دستکتاپ ذخیره کرده و با دستورالعملی که در انتها گفته ایم، فرآیند تست را بدون محدودیت به صورت لوکال-آنلاین انجام دهیم).
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | نمایش پیام صفحه در حال بارگذاری</title>
<!-- Webgoo.ir -->
<style>
#webgoo-logo {
display: block;
position: absolute;
background-color: #0E5076;
width: 20%;
height: 20%;
top: 25%;
bottom: 0;
left: 0;
right: 0;
margin:0 auto;
padding: 8px;
}
#loading-main {
display: block;
position: absolute;
font-family: Tahoma, Geneva, sans-serif;
font-size: 12px;
color: #f0c;
text-align: center;
direction: rtl;
width: 300px;
height: 200px;
line-height: 22px;
top: 25%;
bottom: 0;
left: 0;
right: 0;
margin:0 auto;
}
#loading-animation {
border: 12px solid #f5f5f5;
border-top: 12px solid #999;
border-radius: 50%;
width: 50px;
height: 50px;
margin: 0 auto;
animation: spin 1s linear infinite;
}
@keyframes spin {
100% {
transform: rotate(360deg);
}
}
</style>
</head>
<body>
<noscript>جاوا اسکریپت در مرورگر شما پشتیبانی نمی شود یا غیرفعال است!</noscript>
<div id="loading-main">
<div id="loading-animation"></div>
در حال بارگذاری... <br> لطفا چند لحظه صبر کنید!
</div>
<script>
document.onreadystatechange = function() {
if(document.readyState !== "complete") {
document.querySelector("body").style.visibility = "hidden";
document.querySelector("#loading-main").style.visibility = "visible";
} else {
document.querySelector("#loading-main").style.display = "none";
document.querySelector("body").style.visibility = "visible";
}
};
</script>
<!--
کدهای نمایش پیام در حال بارگذاری را در قسمت بالا درج کنید
کدهای مربوط به سایر محتوای صفحه را در قسمت پائین درج کنید
-->
<div id="webgoo-logo">
<a href="https://webgoo.ir" title="وبگو | آموزش برنامه نویسی و مهارتهای وب" target="_blank">
<!--
برای تست مجدد عملکرد کد در حالت لوکال-آنلاین، عبارت فرضی
py75mr3rtyuo1
را در قسمت
src
تغییر داده، صفحه را در دستکتاپ ذخیره کرده و آدرس مرورگر را رفرش کنید
-->
<img id="logo-img" alt="Webgoo" src="https://webgoo.ir/image/webgoo.svg?ver=py75mr3rtyuo1">
</a>
</div>
</body>
</html>
پیش نمایش آنلاین
ایجاد پنل جمع شونده با جاوا اسکریپت و فریم ورک Spry
ساخت افکت رنگی با جاوا اسکریپت (JavaScript)
ساخت پنل چند سربرگی (Tabbed Panel) با جاوا اسکریپت و CSS
چگونه لوگوی حمایتی برای نمایش در سایت یا وبلاگ بسازیم؟
اعتبارسنجی فرم های وب با جاوا اسکریپت (JavaScript)


لینک تست:
حذف شد
با تشکردر مرورگر دکمه F12 را بزنید و جزئیات بارگذاری صفحه را در قسمت Network مشاهده کنید، می بینید که تاخیر در پاسخ دارد.
اینو تست کردم لینک رو به درستی شناسایی نمی کنه و ارور میده! وگرنه همون مسیر خودش رو واسه لینک هست! نمیشه کاری کرد فرآیند بصورت continue عمل کنه و لینک رو وارد نکنیم؟ الان چند بار تست کردم لینک رو ثابت نگه می داره و واسه finish نمیره نمیشه کاری کرد واسه لینک عمل continue اجرا بشه؟ الان من پیام رو توی صفحه کال بک می بینم ولی لینک ثابت هست و به همین خاطر ارور میده در حال عادی بعد از این فرآیند به صفحه finish میره توی دستور die نمیشه کاری کرد که continue اجرا بشه؟
فکر کنم اینطوری مشکل منم حل میشه
با تشکر
با sleep نمیشه متن به کاربر نشون داد فقط میشه تاخیر ایجاد کرد واسه همین die بهتره ولی من نمی دونم چطوری با دستور die بگم که کاربر به مرحله بعد بره متن نوشتم و مرحله کال بک متن رو با die به کاربر نشوم دادم ولی از این مرحله باید ادامه فرآیند طی بشه با sleep کاربر بازم صفحه سفید می بینه ولی با die متن نوشتم و کاربر اون متن رو می بینه با settimeout هم ۱۰ ثانیه کاربر متن رو می بینه ولی واسه ادامه رفتن فرآیند نمی دونم چطوری باید باشه نمونه کد ندارم که به ادامه فرایند رو کاربر بره مثل این می مونه که یه نفر می خواد جایی بره بعد از یکی می پرسه چطوری برم! و جوابش فقط این باشه که برو مستقیم برو اینم همین طوره که با die جلوی کاربر رو بگیری فقط جلوش رو بگیری ولی بعد کاربر ادامه فرآیندش بره واسه اینکه یه امتحان تستی انجام بدید اینکارو انجام بدید
روی یه لینک کلیک کنید موقع باز کردن لینک به کاربر بگین وایسا اینو ببین با دستور die بعد توی دستور die ادامه فرآیند باز کردن لینک باشه اینجا واسه کامنت دکمه ارسال هست واسه تست میشه کاری کرد
ارسال رو که میزنی با دستور die به کاربر بگی خیلی ممنون که پیام ارسال کردی بعد ادامه فرآیند ارسال پیام طی بشه توی همه ی فرومهای خارجی سرچ کردم پیدا نکردم اگه کال بک صفحه و ویو داشت برام خیلی راحت بود ولی ویو نداره به جای صفحه مرگ die چند ثانیه پیامی به کاربر نشون داده بشه بعد بهش بگی برو...
یه نمونه کد با دستور die براتون میذارم که خودم تست کردم
با تشکر
<?php
die("
<meta charset=utf-8>
<meta name='viewport' content='width=device-width, initial-scale=1.0'>
<div style='margin:0px auto !important;padding:0px !important;width:920px !important;max-width:97% !important'>
<center style='margin-top:7px;background:#F6F6CA'>
لطفا تا ادامه فرآیند منتظر بمانید!<br>
شما در حال انتقال به صفحه اصلی سایت هستید...<br></div>
<script>
setTimeout(function(){
window.location='$url'
},5000);
</script>
");
?>
این برای یه url تعیین شده است که بعد از چند ثانیه کاربر به اون هدایت میشه به جای url باید کاری کنم که کاربر همون لینکی که باز شده رو بره$url = (empty($_SERVER['HTTPS']) ? 'http' : 'https') . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
کد به صورت مستقل عمل می کند و مشکلی ندارد پس اگر با درج در کدهای شما عمل نکند و صفحه بعد از 5 ثانیه رفرش نشود یعنی جایی از کار ایراد دارد و باید خطایابی شود.متاسفانه هرکاری کردم نشد! یه هفته ست درگیرش هستم
انگار هیچ راهی نداره البته احتمالا به دستور die باشه ولی اون وقفه می اندازه و بعدش کاربر باید کلیک کنه که برگرده به سایت که من بلد نیستم! یه طوری باشه که دستور die اجرا بشه و منتظر کلیک کاربر نباشه باید ادامه دستور رو خودش بصورت خودکار بره و یا ۱۰ ثانیه تنطیم بشه پیام نشون داده بشه، و همزمانی که callback اجرا میشه اونم اجرا بشه فقط die یه مشکلی داره که صفحه رو متوقف می کنه و کاربر یا باید بره جلو و یا باید صفحه رو بره عقب! الان اگه دستور die اجرا بشه و ادامه فرایند رو بره درست میشه
وگرنه هیچ راهی نداره چون باید id براش تعریف کرد و چون فایل view نداره کد اجرا نمیشه
توی همه فرومها نگاه کردم نبود جایی که بشه جوابی پیدا کنم
یه هفته ست شبا هی چک می کنم ولی جواب نمی گیرم
واسه همین مزاحم شما شدم
امیدوارم منو ببخشید
با تشکر
من فقط اکشنش رو دارم که اکشن به تنهایی کار نمی کنه! :(
الان این کد رو توی قالب گذاشتم تا هر وقت توی لینک callback وجود داشت کد رو اجرا کنه ولی کلا همه ی جای صفحه سفید میشه
<?php
$link = $_SERVER['QUERY_STRING'];
if( ! empty($link) and strpos($link, 'callback')!==false)
{
echo "<div id='loading-main'>";
echo "<div id='loading-animation'></div>";
echo "در حال بارگذاری...<br> لطفا چند لحظه تا بارگذاری کامل صفحه منتظر بمانید...!</div>";
}
?>
وقتی اسکریپتش رو حذف می کنه صفحه از سفیدی در میاد ولی کد عمل نمی کنه احتمالا به خاطر تگ body هست و توی قالب نمیذاره عمل کنه!استاد خیلی خوب بود
من توی فریمورک yii صفحه callback ندارم کاربر زمان زیادی برای اکشن callback میذاره حدود ده تا ۱۵ ثانیه بعد از بررسی اکشن callback به صفحه finish هدایت میشن و من این کد رو واسه این میخوام که توی اکشن callback قرار بدم چون کاربر فقط بعد از برگشت از بانک به اکشن callback هدایت و بعد به صفحه انتهایی finish هدایت میشن من نیاز دارم این کدها رو توی اکشن کنترلر قرار بدم چون همانطور که گفتم صفحه callback ندارم این کدها رو توی صفحه finish گذاشتم ولی چون اونجا اکشن callback عمل نمی کنه کاربرد نداره چون پردازش دستورات کوئری در اکشن callback زمان زیادی می بره صفحه تا بارگذاری صفحه سفید نشون داده میشه تا صفحه کامل لود میشه
ببخشید این چند روز خیلی شما رو زحمت دادم شرمنده یه سوال داشتم توی یه صفحه با فروم یک کد جاوا تولید میشه کدهای جاوا هم بلافاصله توی textarea نمایش داده میشه و با تغییر محتوای فروم اونم تغییر می کنه توی textarea اینطوری نمایش داده می شه
<textarea dir=ltr id=codeGet rows=3 cols=75 readonly=readonly onmouseup="this.select()"></textarea>
اینم توی view-source نشون داده نمیشه بعد می خوام من از این با echo خروجی بگیرم یه خروجی می خوام بگیرم چون توی همون صفحه می خوام این خروجی رو ازش یه جور دیگه استفاده کنم راهی وجود داره من اینکارو انجام بدم؟با تشکر
ولی عمل نکرد ؛
حالا نمیدونم به روش وارد کردن مستقیم کدهای جاوا عمل میکنه یا نه !
نکته: طبق یررسی ما کدنویسی HTML قالب وبلاگتان دچار اشکالات متعدد است و علت کار نکردن کد نیز همین است!
واقعا سایت خوبی داری به خصوص مطالب حرفه ای رو خوب اموزش دادی ایول من شما رو بوکمارک کردم
اگه بخوایم از این کد ها به صورت جاوا اسکریپت فراخوانی کنیم باید چه تغییری در اون ایجاد بشه یعنی به شکل زیر فراخوانی بشه مثل سایت های ابزار دهی
<script src="http://www.site.ir/load.php"></script>
قسمت اصلی کدها می تواند به صورت خروجی PHP چاپ شود، برای قسمت body و onload می توانید از روش جایگزین زیر استفاده کنید تا نیاز به دستکاری سورس صفحه هدف نباشد:
<script type="text/javascript">
window.onload = function(){
pageLoading();
}
</script>
نکته: این روش تست نشده!ببخشید در قسمت if else
(if (document.getElementById یعنی چی؟ یعنی چه موقع true میشه؟
همینطور (if (document.layers
خیلی ممنون از اموزش خوبتون
در این حالت دستور if زمانی true خواهد بود که متد document.getElementById در مفسر جاوا اسکریپت مرورگر تعریف شده باشد (در مرورگرهای قدیمی این متد وجود ندارد و لذا نتیجه false خواهد شد)، همین طور است برای document.layers که البته این متدی قدیمی است و در مرورگرهای جدید استاندارد محسوب نمی شود.
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.