Boplo.ir
rss


جستجو

آخرین مطالب

 

 

مطالب همینجوری

 

 

بر و بچ

MyView Tween


دوستشون دارم


بیلبورد

دامین برای فروش: CleanCode.ir
FastFeed.ir
Fonvi.com

تماس


انواع و اقسام سفارشات طراحی و برنامه نویسی سایت پذیرفته میشه. از سایت حمایت از خرگوشهای صورتی گرفته تا سایت قاچاق اعضای بدن!
تماس

 

از بيماران سرطاني حمايت كنيم

A new begining
AHHP presents

 

بیایم AJAX یاد بگیریم.....
10 اردیبهشت 1388 ساعت 12:55

طراحی وب

loading loading loading loading loading
loading

AJAX چی هست اصلا؟ آژاکـــــــس یا ای-جکــــس مخفف Asynchronous JavaScript And XML به معنی جاوااسکریپت و XML غیرهمزمان هست. به معنیش فکر نکن که چیزی دستگیرت نمیشه! بی خیال
آژاکس تکنیکی برای دریافت اطلاعات از سرور بدون بازخوانی یا Refresh صفحه است. اصولش هم به این صورته که جاوااسکریپت به سرور درخواست(Request) ارسال می کنه و نتیجه یا پاسخ(Response) سرور رو دریافت می کنه بدون این که صفحه جاری بازخوانی بشه.

توضیح بیشتر به این صورت هست که دو نوع زبان تحت وب داریم:

  • Server-Side (سمت سرور) : این زبانها صرفا توسط سرور اجرا میشن مثل PHP, JAVA, ASP.NET, PERL و... .
  • Client-Side (سمت کاربر) : این زبانها صرفا توسط کامپیوتر کاربر اجرا میشن (دقیقتر توسط مرورگر کاربر) مثل JavaScript و ... .

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

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

برای فهم این آموزش اطلاعات حداقلی از جاوااسکریپت نیازهست! 

کلید تسلط به هر چیزی اطلاعات کافی درباره اون موضوعه پس بهتره اول همه سوراخ سمبه های این آبجکت رو بشناسیم. منگ
این شیء در مرورگر اینترنت اکسپلورر توسط کلاس ()ActiveXObject هست و تقریبا برای سایر مرورگرها ()XMLHttpRequest، به اضافه اینکه کلاس مربوط به اینترنت اکسپلورر اطلاعات مربوط به نسخه مرورگر رو هم میگیره.

متدهای این آبجکت به شرح زیر هست:

متد توضیح
(open(Method,URL,Async,User,Pass آغاز عملیات
(send(header ارسال اطلاعات بصورت دیتا
(setRequestHeader(header,value تعیین header اطلاعات ارسالی
(getResponseHeader(header دریافت header جاری بصورت متن
()getAllResponseHeaders دریافت تمامی headerها بصورت متن
()abort اتمام فوری عملیات

و Property یا مشخصه ها هم بصورت زیر هستند:

مشخصه توضیح
onreadystatechange باعث اجرای تابع متناظر با خودش به ازای هر بار تغییر وضعیت
readyState وضعیت عملیات
responseText نتیجه عملیات بصورت Text
responseXML نتیجه عملیات بصورت XML
status پیغام سرور بصورت کد مثل 404 (Page Not Found) یا 200 برای موفقیت
statusText پیغام سرور بصورت متن


شروع می کنیـــــــــــــــــــــــــــــــــــــــــــــــــم... داغون

می خوایم یه آژاکس ساده درست کنیم. برای این آموزش من از PHP استفاده کردم که برای اجرای این زبان باید از سرور روی اینترنت یا سرورهای لوکال مثل Wamp Server یا EasyPHP استفاده کنیم.

ما یه صفحه HTML مثل این داریم که میخوایم وقتی فیلد صفحه رو پر کردیم و دکمه رو زدیم، جواب آژاکس، زیر فرم چاپ شه:

<html>
<html>
<head>
    <title>Boplo.ir | AJAX Tutorial</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <script type="text/javascript" src="ajaxRequest.js"></script>
</head>
<body>
    <p>
        اسمت چیه: <input id="ajaxField" type="text" value="Go" />
        <input id="ajaxButton" type="button" onclick="javascript:ajaxAction();" />
    </p>
    <div id="ajaxResponse" style="border:1px dashed #555; margin:10px; padding:10px;"></div>
</body>
</html>

ما برای ارسال درخواست آژاکس، به یه سری کد جاوااسکریپت نیاز داریم که توی فایل ajaxRequest.js قرار میدیم و توی <head> هم فراخوانیش می کنیم. فرض می کنیم که عملیات آژاکس توسط تابع ajaxAction در فایل جاوااسکریپتمون انجام میشه که قراره با فشار دادن دکمه فرم شروع بشه پس بصورت onclick در فرم قرار دادیم.

برای بخش اصلی کار یعنی کدهای جاوااسکریپت اول باید یک نمونه (Instance) از شی آژاکس رو ایجاد کنیم. همونطور که گفتم بازم اینترنت اکسپلورر نخاله گری کرده و شیء اش با بقیه فرق می کنه در نتیجه ایجاد نمونه یکم پیچیده تر از استفاده از یک فرمان new ساده است. البته اینترنت اکسپلورر توی نسخه 7 و بالاتر (اینجوری که یادم میاد) شیء XMLHttpRequest رو هم پشتیبانی می کنه. من برای ایجاد نمونه از کد زیر استفاده می کنم:

function AjaxRequest() {
    try{    var xmlhttp = new XMLHttpRequest();    }
    catch(err1)
    {
        var ieXmlHttpVersions = new Array();
        ieXmlHttpVersions[ieXmlHttpVersions.length] = "MSXML2.XMLHttp.7.0";
        ieXmlHttpVersions[ieXmlHttpVersions.length] = "MSXML2.XMLHttp.6.0";
        ieXmlHttpVersions[ieXmlHttpVersions.length] = "MSXML2.XMLHttp.5.0";
        ieXmlHttpVersions[ieXmlHttpVersions.length] = "MSXML2.XMLHttp.4.0";
        ieXmlHttpVersions[ieXmlHttpVersions.length] = "MSXML2.XMLHttp.3.0";
        ieXmlHttpVersions[ieXmlHttpVersions.length] = "MSXML2.XMLHttp";
        ieXmlHttpVersions[ieXmlHttpVersions.length] = "Microsoft.XMLHttp";

        var i;
        for (i=0; i < ieXmlHttpVersions.length; i++) {
            try
            {
                var xmlhttp = new ActiveXObject(ieXmlHttpVersions[i]);
                break;
            }
            catch (err2) {    return false;    }
        }
    }
    return xmlhttp;
}

این کدها رو توی فایل ajaxRequest.js که گفته بودم بسازید، قرار بدید.

 

همونجوری که حتما به کدهای HTML بالا دقت کردید، زمان فشرده شدن دکمه، تابع ajaxAction اجرا میشه. ما هم این تابع رو میسازیم:
اول می خوایم مقدار فیلد موجود توی فرم رو بگیریم و شیء آژاکس رو توسط تابع AjaxRequest که بالا ساختیم ایجاد کنیم:

function ajaxAction() {
    var field = document.getElementById("ajaxField").value;
    var response = document.getElementById("ajaxResponse");
    var xmlHttp = AjaxRequest();
    .
    .
    .
}


حالا برای ارسال درخواست، باید از متد open استفاده کنیم. این متد 5 تا پارامتر داره که دو تا اولی اجباری هستند:

پارامتر توضیح
نوع ارسال یکی از عبارات GET ، POST ، HEAD
URL ارسال آدرس فایل یا URL برای ارسال و دریافت اطلاعات
نحوه ارسال true و false برای تعیین به ترتیب، ارسال غیرهمزمان و همزمان
نام کاربری تعیین نام کاربری برای ارسال
کلمه عبور تعیین کلمه عبور برای ارسال

پس:

function ajaxAction() {
    var field = document.getElementById("ajaxField").value;
    var response = document.getElementById("ajaxResponse");
    var xmlHttp = AjaxRequest();
    xmlHttp.open("GET" , "ajaxServer.php?name=" + field, true);
    .
    .
    .
}

همونطور که میبینید، من یه کوئری به فایل ajaxServer.php فرستادم که کلیدش name هست و مقدارش، مقدار فیلد توی صفحه. نوع ارسال هم GET مشخص شده.
اگر بجای GET از HEAD استفاده می کردم، نتیجه اطلاعات header می بود.

از لحظه درخواست تا پایان عملیات، شیء آژاکس مراحل رو دریافت می کنه و این وظیفه ماست که این مراحل رو بازیابی کنیم. xmlHttp پنج مرحله رو پشت سر میذاره و این مراحل بصورت شماره در مشخصه(Property) به نام readyState ذخیره میشه. مقادیر به این صورت هستند:

وضعیت توضیح
0 هیچ عملیاتی صورت نگرفته
1 اطلاعات در حال لود شدن هستند
2 عملیات لود به اتمام رسید
3 خاتمه دادن عملیات
4 پایان عملیات

تغییرات غیرهمزمان در یک Property به نام onreadystatechange صورت میگیره که باید توسط یه تابع Callback، چک بشه:

function ajaxAction() {
    var field = document.getElementById("ajaxField").value;
	var response = document.getElementById("ajaxResponse");
    var xmlHttp = AjaxRequest();
    xmlHttp.open("GET" , "ajaxServer.php?name=" + field, true);
    xmlHttp.onreadystatechange=function()
    {
        if(xmlHttp.readyState == 0)    response.innerHTML = "uninitialized";
        if(xmlHttp.readyState == 1)    response.innerHTML = "loading";
        if(xmlHttp.readyState == 2)    response.innerHTML = "loaded";
        if(xmlHttp.readyState == 3)    response.innerHTML = "interactive";
        if(xmlHttp.readyState == 4)    response.innerHTML = "complete";
    }
    .
    .
}

 

نتیجه عملیات آژاکس، در مشخصه responseText ذخیره میشه (اگه متنی باشه). پس:

function ajaxAction() {
    var field = document.getElementById("ajaxField").value;
	var response = document.getElementById("ajaxResponse");
    var xmlHttp = AjaxRequest();
    xmlHttp.open("GET" , "ajaxServer.php?name=" + field, true);
    xmlHttp.onreadystatechange=function()
    {
        if(xmlHttp.readyState == 1)
		    response.innerHTML = "Loading...";

	   if(xmlHttp.readyState == 4 && xmlHttp.status == 200)
            response.innerHTML = xmlHttp.responseText;
    }
    .
    .
}

اگر وضعیت 1 بود یعنی اطلاعات در حال لود هستند پس باید پیغام Loading یا از این عکسهای چرخونک چاپ شه و اگر وضعیت 4 بود یعنی عملیات تموم شده و باید جواب چاپ بشه ولی برای اینکه از موفقیت آمیز بودن عملیات مطمئن بشیم، status رو هم چک می کنیم.

برای اتمام درخواست آژاکس باید یه متد دیگه رو هم اجرا کنیم.
متد send اگر اطلاعاتی بصورت data وجود داشته باشه رو ارسال می کنه ولی چون ما از روش GET استفاده کردیم و اطلاعات مورد نیاز رو توسط کوئری ارسال کردیم، دیگه چیز دیگه ای نداریم پس:

function ajaxAction() {
    var field = document.getElementById("ajaxField").value;
	var response = document.getElementById("ajaxResponse");
    var xmlHttp = AjaxRequest();
    xmlHttp.open("GET" , "ajaxServer.php?name=" + field, true);
    xmlHttp.onreadystatechange=function()
    {
        if(xmlHttp.readyState == 1)
		    response.innerHTML = "Loading...";

	   if(xmlHttp.readyState == 4 && xmlHttp.status == 200)
            response.innerHTML = xmlHttp.responseText;
    }
   xmlHttp.send(null);
}

اگر نوع ارسال POST بود، ارسال اطلاعات بصورت data می تونستیم داشته باشیم. برای این کار باید درخواست رو بعنوان اطلاعات فرم کد کنیم در نتیجه یک header جدید و مناسب باید ایجاد کنیم. در این حالت:

function ajaxAction() {
    var field = document.getElementById("ajaxField").value;
	var response = document.getElementById("ajaxResponse");
    var xmlHttp = AjaxRequest();
    xmlHttp.open("POST" , "ajaxServer.php", true);
    xmlHttp.onreadystatechange=function()
    {
        if(xmlHttp.readyState == 1)
		    response.innerHTML = "Loading...";

	   if(xmlHttp.readyState == 4 && xmlHttp.status == 200)
            response.innerHTML = xmlHttp.responseText;
    }
   xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");
   xmlHttp.send("hello=yes&name=" + field);
}

در حالت POST کوئری هایی که به URL اضافه میشن، در سرور GET شناخته میشن و اونهایی که به متد send داده میشن، POST درنظر گرفته میشن.

تا اینجا کدهای بخش کلاینت بخوبی ایجاد شد حالا باید اسکریپت سمت سرور رو که اینجا ajaxServer.php اسمش بود رو بسازیم. این اسکریپت در حالت GET، فقط یک متغیر با نام name بهش ارسال میشه و کافیه اون رو بگیریم و نتیجه رو توسط زبان سمت سرورمون چاپ کنیم:

$name = $_GET['name'];
print "چطوری <b>$name</b>؟";

چیزی که این بخش چاپ می کنه مستقیم به داخل responseText میره و جاوااسکریپت هم اون رو مدیریت و نمایش میده....
به همین سادگی بود!

 

فرم زیر دموی زنده یک درخواست آژاکس مشابه آموزش بالاست. تست کنید:

اسمت چیه:

پاسخ سرور اینجا قرار میگیره...

 

تو چی فکر می کنی؟


Abedi : ممنون ، خیلی مفید بود
(1 سال و 4 ماه و 4 روز و 7 ساعت و 46 دقیقه پیش)

امیرمهدی : ممنون کاربردی و مفید بود
(1 سال و 3 ماه و 22 روز و 19 ساعت و 48 دقیقه پیش)

امیر حسین : سلام
من خوب فکر میکنم!
زحمت کشیدی
(1 سال و 3 ماه و 16 روز و 20 ساعت و 11 دقیقه پیش)

10David : الان وقت ندارم کامل بخونم Save میکنم بعدا بخونم ولی مطمئنم مثل همیشه عالیه.
(1 سال و 3 ماه و 5 روز و 11 ساعت و 28 دقیقه پیش)

یک دوست : فقط می تونم بگم ایول، خوب و خوش و سلامت باشید.
بسیار مطالب مفید رو گفتین.
ممنون
موفق باشید
(1 سال و 1 ماه و 29 روز و 14 ساعت و 5 دقیقه پیش)

یک دوست : با سلام خدمت دوست عزیز

واقعا عالی بود

همینطور به کارتون ادامه بدید

انشاالله موفقیت های بزرگترتون رو ببینم

موفق باشید ...
(1 سال و 14 روز و 14 ساعت و 17 دقیقه پیش)

علی : مطلب جالبی بود.
از لحن طنزگونت خیلی خوشم میاد. ان شاءالله همیشه شاد باشی.
(11 ماه و 23 روز و 3 ساعت و 37 دقیقه پیش)

حسین مرادقلی : خیلی مفید بود.
یه مقدار در مورد متود POST توضیح بیشتری میدی ؟
من برام سواله که خوب چطور این اطلاعات رو ارسال کنم چون عملا در تود GET محدودیت هایی وجود داره.
ممنون
(10 ماه و 17 روز و 11 ساعت و 13 دقیقه پیش)

امیرحسین : @ حسین مرادقلی:
متد POST اطلاعات رو کد می کنه ولی GET نمی کنه و این تا یه حد کوچیکی می تونه تو امنیت اطلاعات تاثیر داشته باشه (خیلی کم).
روش GET یکم (بازم خیلی کم) سریعتر از POST هست و اینکه IE واسه فرم در حالت GET، برای داده های بلند محدودیت داره یعنی نمیشه یه متن 10 خطی رو توی IE توسط فرم GET ارسال کرد. من جایی خوندم که IE کلا اینطوره یعنی حتی در حالت آژاکس.....
(10 ماه و 16 روز و 11 ساعت و 4 دقیقه پیش)

یزدان : با سلام خدمت شما دوست عزیز وممنون بخ خاطر مطلب خوبتون خسته نباشید

من با این کد نتونستم یک صفحه aspx را داخل تگ دایو لود کنم مشکل کجاست؟

ممنون میشم
(10 ماه و 2 روز و 15 ساعت و 20 دقیقه پیش)

یک دوست : میشه بر اساس ASPX هم بنویسیئ
(7 ماه و 28 روز و 20 ساعت و 32 دقیقه پیش)

امیرحسین : من متاسفانه ASP.NET کار نکردم ولی اینجا یه نمونه ساده ازش پیدا کردم که امیدوارم کمک کنه:
http://ajax.net-tutorials.com
سرچ کنید حتما آموزش و نمونه های بیشتر پیدا می کنید.


موفق باشید
(7 ماه و 28 روز و 11 ساعت و 48 دقیقه پیش)

میلاد : همش همین ؟

چا ساده چه خوشمزه ، پودر کیک رشد !

آقا یه زحمتی میکشی در مورد این اشاء توی جاوا اسکریپت هم توضیح بدی ؟ مثلا من همیشه سر اینجاها که میشه غاط میزنم :
document.getelementbyid ....
یه مقدار که چه عرض کنم ، خیلی با PHP و حتی C فرق داره !
(6 ماه و 15 روز و 8 ساعت و 14 دقیقه پیش)

مهدی : با تشکر
چه کار کنیم با فارسی هم درست کارکنه ؟
(2 ماه و 28 روز و 13 ساعت و 40 دقیقه پیش)

امیرحسین : @مهدی:
با فارسی چه مشکلی داره؟ اون دمویی که آخر همین آموزش هست. مگه فارسی نیست؟
(2 ماه و 28 روز و 11 ساعت و 41 دقیقه پیش)

سوسک : اگه میشه در مورد ارسال name و ... توسط لینک هم توضیح بدید!
"(onclick="javascript:ajaxAction(25
شاید همیشه از input استفاده نشه :دی
(19 روز و 16 ساعت و 35 دقیقه پیش)
نام:
ایمیل: (منتشر نخواهد شد!)
وب سایت:

کد امنیتی: اگر در خواندن این کد مشکلی دارید، اینجا کلیک کنید تا صفحه بازخوانی شود.

 

me امیرحسینم. اسمم رو دوست دارم، خودم رو دوست دارم. تهران زندگی می کنم. دانشجوی رشته صنایع هستم شغل درست و حسابی ندارم. طراحی وب می کنم ولی همه اش واسه سرگرمی بوده. برنامه نویس PHP هستم. برنامه نویسی و وقت گذرونی با کامپیوتر تنها کاریه که خسته ام نمی کنه.
آدم خیلی سردی هستم، اینو دور و وری هام میگن. ولی به نظر خودم سرد نیستم در واقع گرمای خودم رو کم بروز می دم! آدما رو اغلب دوست دارم غیر از اون مواقعی که اونا من رو نادیده میگیرن!

این سایت رو بعد از کلی اینور اونور دوباره راه انداختم تا هرچی دوست دارم توش بنویسم، چه کسی بخونه چه نخونه.
خلاصه اینجا خونه منه،

به خونه امیرحسین خوش اومدی...

MODx | Template World