نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی. پرتال اطلاعاتی
  • خانه
  • سیستم عامل
  • AJAX: چیست، تأثیر بر سئو، مزایا و معایب فناوری. با استفاده از Ajax

AJAX: چیست، تأثیر بر سئو، مزایا و معایب فناوری. با استفاده از Ajax

AJAX مخفف عبارت Asynchronous Javascript و XML است. در واقع، AJAX یک فناوری جدید نیست، زیرا جاوا اسکریپت و XML برای مدتی طولانی وجود داشته‌اند و AJAX ترکیبی از این فناوری‌ها است. AJAX معمولاً با اصطلاح Web 2.0 همراه است و به عنوان جدیدترین برنامه وب معرفی می شود.

هنگام استفاده از AJAX، نیازی به آپدیت کل صفحه در هر بار نیست، زیرا تنها قسمت خاصی از آن به روز می شود. این بسیار راحت تر است، زیرا لازم نیست مدت طولانی صبر کنید، و مقرون به صرفه تر است، زیرا همه اینترنت نامحدود ندارند. درست است، در این مورد، توسعه دهنده باید اطمینان حاصل کند که کاربر از آنچه در صفحه اتفاق می افتد آگاه است. این را می توان با استفاده از نشانگرهای بارگذاری، پیام های متنی که داده ها با سرور رد و بدل می شوند، پیاده سازی کرد. همچنین باید بدانید که همه مرورگرها از AJAX (مرورگرهای قدیمی و مرورگرهای متنی) پشتیبانی نمی کنند. Plus Javascript می تواند توسط کاربر غیرفعال شود. بنابراین، نباید از استفاده از فناوری سوء استفاده کنید و به روش های جایگزین برای ارائه اطلاعات در وب سایت متوسل شوید.

بیایید مزایای AJAX را خلاصه کنیم:

  • امکان ایجاد یک رابط وب کاربر پسند
  • تعامل فعال با کاربر
  • راحتی استفاده
AJAX از دو روش برای کار با یک صفحه وب استفاده می کند: تغییر صفحه وب بدون بارگیری مجدد و تماس پویا با سرور. دومی را می توان به چندین روش انجام داد، به ویژه XMLHttpRequest، که در مورد آن صحبت خواهیم کرد، و با استفاده از تکنیک قاب پنهان.

تبادل اطلاعات

برای تبادل داده ها باید یک شی XMLHttpRequest در صفحه ایجاد شود که نوعی واسطه بین مرورگر کاربر و سرور است (شکل 1). با استفاده از XMLHttpRequest می توانید درخواستی را به سرور ارسال کنید و همچنین پاسخی را در قالب انواع مختلف داده دریافت کنید.

دو راه برای تبادل اطلاعات با سرور وجود دارد. راه اول درخواست GET است. در این درخواست، شما به یک سند روی سرور دسترسی دارید و آرگومان هایی را از طریق خود URL به آن ارسال می کنید. در همان زمان، در سمت کلاینت، منطقی است که از تابع فرار جاوا اسکریپت استفاده کنیم تا برخی از داده ها درخواست را قطع نکنند.

بخش کلاینت که به زبان جاوا اسکریپت نوشته شده است باید قابلیت های لازم را برای برقراری ارتباط امن با سرور فراهم کند و روش هایی را برای تبادل داده ها به هر یک از روش های فوق ارائه دهد. بخش سرور باید داده های ورودی را پردازش کند و بر اساس آنها اطلاعات جدیدی تولید کند (مثلاً کار با پایگاه داده) و آن را به مشتری بازگرداند. به عنوان مثال، برای درخواست اطلاعات از سرور، می توانید از یک درخواست GET معمولی با انتقال چند پارامتر و پارامترهای کوچک استفاده کنید و برای به روز رسانی اطلاعات یا افزودن اطلاعات جدید، باید از درخواست POST استفاده کنید، زیرا امکان انتقال را به شما می دهد. حجم زیادی از داده ها

همانطور که قبلا ذکر شد، AJAX از انتقال داده های ناهمزمان استفاده می کند. این بدان معناست که در حین انتقال داده ها، کاربر می تواند سایر اقدامات مورد نیاز خود را انجام دهد. در این زمان باید به کاربر اطلاع داده شود که نوعی تبادل داده در حال انجام است، در غیر این صورت کاربر فکر می کند اشتباهی رخ داده است و می تواند سایت را ترک کند یا به نظر خود عملکردی را که "هنگ" کرده است دوباره فراخوانی کند. نشان دادن در حین ارتباط در یک برنامه Web 2.0 نقش بسیار مهمی ایفا می کند: بازدیدکنندگان ممکن است هنوز به این روش های به روز رسانی صفحه عادت نداشته باشند.

همانطور که از نام فناوری پیداست، پاسخ سرور می تواند نه تنها XML باشد. علاوه بر XML، می‌توانید پاسخی را به صورت متن ساده یا JSON (جاوا اسکریپت شیء نشان‌گذاری) دریافت کنید. اگر پاسخ به صورت متن ساده دریافت شده باشد، می توان آن را بلافاصله در یک ظرف در صفحه نمایش داد. هنگامی که یک پاسخ XML دریافت می شود، سند XML حاصل معمولاً در سمت مشتری پردازش می شود و به (X)HTML تبدیل می شود. هنگام دریافت پاسخ JSON، کلاینت فقط باید کد دریافتی (عملکرد eval جاوا اسکریپت) را برای به دست آوردن یک شی جاوا اسکریپت کامل اجرا کند. اما در اینجا باید دقت کنید و این نکته را در نظر بگیرید که کدهای مخرب با استفاده از این فناوری قابل انتقال هستند، بنابراین قبل از اجرای کدهای دریافتی از سرور باید به دقت بررسی و پردازش شود. چنین عملی به عنوان درخواست "بیکار" وجود دارد که در آن هیچ پاسخی از سرور دریافت نمی شود، فقط داده های سمت سرور تغییر می کند.

در مرورگرهای مختلف، این شی دارای خواص متفاوتی است، اما در کل یکسان است.

XMLHttpRequest شیء روش

توجه داشته باشید که نام متدها به همان سبک (Camel-style) با سایر توابع جاوا اسکریپت نوشته شده است. هنگام استفاده از آنها مراقب باشید.

سقط جنین ()- درخواست فعلی به سرور را لغو کنید.

getAllResponseHeaders()- تمام سرصفحه های پاسخ را از سرور دریافت کنید.

getResponseHeader ("header_name")- عنوان مشخص شده را دریافت کنید.

open("نوع_درخواست"، "URL"، "ناهمزمان"، "نام کاربری"، "رمز عبور")- مقدار دهی اولیه درخواست به سرور، با مشخص کردن روش درخواست. نوع درخواست و URL پارامترهای مورد نیاز هستند. آرگومان سوم یک مقدار بولی است. معمولاً همیشه روی true یا اصلاً تنظیم نشده است (پیش فرض درست است). آرگومان های چهارم و پنجم برای احراز هویت استفاده می شوند (ذخیره کردن داده های احراز هویت در اسکریپت بسیار ناامن است، زیرا اسکریپت توسط هر کاربری قابل مشاهده است).

ارسال ("محتوا")- یک درخواست HTTP به سرور ارسال کنید و پاسخ دریافت کنید.

setRequestHeader ("header_name"، "value")- مقادیر هدر درخواست را تنظیم کنید.

ویژگی های شی XMLHttpRequest

onreadystatechangeیکی از مهمترین ویژگی های شی XMLHttpRequest است. به کمک این خاصیت، یک هندلر تنظیم می شود که هر زمان که وضعیت شیء تغییر کند، فراخوانی می شود.

حالت آماده- عددی که وضعیت جسم را نشان می دهد.

پاسخ متن- نمایش پاسخ سرور به صورت متن ساده (رشته).

answerXML- یک شی سند سازگار با DOM دریافت شده از سرور.

وضعیت- وضعیت پاسخ از سرور.

وضعیت متن- نمایش متنی وضعیت پاسخ از سرور.

بیایید نگاهی دقیق تر به ویژگی readyState بیندازیم:

  • 0 - شی مقداردهی اولیه نشده است.
  • 1 - شی در حال بارگذاری داده است.
  • 2 - شی داده های خود را بارگذاری کرده است.
  • 3 - شی به طور کامل بارگذاری نشده است، اما می تواند توسط کاربر با آن تعامل داشته باشد.
  • 4 - شی به طور کامل مقدار دهی اولیه شده است. پاسخی از سرور دریافت کرد.
بر اساس وضعیت آمادگی جسم است که می توانید اطلاعاتی در مورد مرحله تبادل داده با سرور در اختیار بازدید کننده قرار دهید و احتمالاً به صورت بصری به وی اطلاع دهید.

ایجاد یک شی XMLHttpRequest

همانطور که در بالا ذکر شد، ایجاد این شی برای هر نوع مرورگر یک فرآیند منحصر به فرد است.

به عنوان مثال، برای ایجاد یک شی در مرورگرهای سازگار با Gecko، Konqueror و Safari، از عبارت زیر استفاده می کنید:

VarRequest = new XMLHttpRequest();

و برای اینترنت اکسپلورر از موارد زیر استفاده می شود:

VarRequest = ActiveXObject جدید ("Microsoft.XMLHTTP");

Var Request = new ActiveXObject("Msxml2.XMLHTTP");

اکنون، برای دستیابی به سازگاری بین مرورگرها، باید تمام عملکردها را به یکی اضافه کنید:

تابع CreateRequest() (var Request = false; if (window.XMLHttpRequest) (//مرورگرهای سازگار Gecko، Safari، Konqueror Request = new XMLHttpRequest(); ) در غیر این صورت (window.ActiveXObject) ( //Internet explorer try (Request new ActiveXObject("Microsoft.XMLHTTP"); ) catch (CatchException) ( Request = new ActiveXObject("Msxml2.XMLHTTP"); ) ) if (!Request) ( هشدار("Unable to create XMLHttpRequest"); ) Request بازگشت; )

پس از همه اینها، می توانید این شی را ایجاد کنید و نگران عملکرد در مرورگرهای محبوب نباشید. اما شما می توانید یک شی را در مکان های مختلف ایجاد کنید. اگر آن را به صورت جهانی ایجاد کنید، در یک مقطع زمانی خاص فقط یک درخواست به سرور امکان پذیر خواهد بود. شما می توانید هر بار که درخواستی به سرور ارسال می شود یک شی ایجاد کنید (این کار تقریباً به طور کامل مشکل را حل می کند).

درخواست سرور

الگوریتم درخواست سرور به شکل زیر است:

  • بررسی وجود XMLHttpRequest.
  • راه اندازی اتصال به سرور
  • ارسال درخواست به سرور
  • پردازش داده های دریافتی
برای ایجاد یک درخواست به سرور، ما یک تابع کوچک ایجاد می کنیم که عملکرد درخواست های GET و POST را ترکیب می کند.

/* تابعی برای ارسال درخواست به فایلی در سرور r_method - نوع درخواست: GET یا POST r_path - مسیر فایل r_args - آرگومان هایی مانند a=1&b=2&c=3... r_handler - تابعی برای مدیریت پاسخ از سرور */ تابع SendRequest(r_method, r_path, r_args, r_handler) (//Create a request var Request = CreateRequest(); //بررسی وجود درخواست دوباره اگر (!Request) ( return; ) //تخصیص یک کنترل کننده سفارشی Request.onreadystatechange = function() ( // اگر تبادل داده کامل شود اگر (Request.readyState == 4) ( //کنترل را به کاربر کنترل کننده r_handler(Request) بدهید) //بررسی کنید که آیا درخواست GET لازم است if (r_method.toLowerCase() == "get" && r_args.length > 0) r_path += "?" + r_args; //آغاز کردن اتصال Request.open(r_method, r_path, true)؛ if (r_method.toLowerCase( ) == "post") ( //اگر این یک درخواست POST است //Set header Request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=utf-8"); //در حال ارسال m درخواست Request.send(r_args); ) else ( //اگر این یک درخواست GET است //ارسال یک درخواست تهی Request.send(null)؛ )

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

تابع ReadFile(نام فایل، کانتینر) ( //ایجاد تابع کنترلر var Handler = function(Request) ( document.getElementById(container).innerHTML = Request.responseText; ) //ارسال درخواست SendRequest("GET"،نام فایل," "، هندلر)؛

به این ترتیب تعامل با سرور انجام می شود.

پردازش پاسخ

در مثال قبلی، یک تابع درخواست به سرور ایجاد کردیم. اما در واقع ناامن است، زیرا ما وضعیت شی و وضعیت پاسخ را از سرور پردازش نمی کنیم.

بیایید به کد خود اضافه کنیم تا بتواند یک اعلان بصری در مورد فرآیند بارگذاری نمایش دهد.

Request.onreadystatechange = function() (//اگر تبادل داده تکمیل شود اگر (Request.readyState == 4) (//کنترل را به کاربر کنترل کننده r_handler(درخواست) بدهید (//به کاربر در مورد دانلود اطلاع دهید ))...

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

Request.onreadystatechange = function() ( //اگر تبادل داده تکمیل شود اگر (Request.readyState == 4) ( if (Request.status == 200) ( //انتقال کنترل به کنترل کننده کاربر r_handler(Request); ) else (// به کاربر در مورد خطای رخ داده اطلاع دهید)) else (//اطلاع رسانی به کاربر در مورد دانلود))...

گزینه های پاسخ سرور

چندین نوع داده را می توان از سرور دریافت کرد:

  • متن ساده
اگر متن ساده دریافت کردید، می توانید بلافاصله آن را به ظرف، یعنی به خروجی ارسال کنید. هنگام دریافت داده ها به صورت XML، باید داده ها را با استفاده از توابع DOM پردازش کنید و نتیجه را با استفاده از HTML ارائه دهید.

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

نمونه کد JSON:
( "داده": ( "متفرقه": [ ( "نام" : "عنصر JSON یک", "نوع" : "عنوان فرعی 1" ), ( "نام" : "عنصر JSON دو", "نوع" : " زیرنویس 2 " ) ] ))

پس از دریافت چنین کدی، عمل زیر را انجام می دهیم:

var answerdata = eval("(" + Request.responseText + ")")

پس از اجرای این کد، شی در دسترس شما قرار می گیرد داده های پاسخ.

کار با زبان های برنامه نویسی سمت سرور

چنین کاری با کارهای معمول تفاوتی ندارد. برای مثال، من PHP را به عنوان زبان سمت سرور در نظر می‌گیرم. هیچ چیز در سمت کلاینت تغییر نکرده است، اما سمت سرور اکنون با یک فایل PHP نشان داده می شود.

طبق سنت، بیایید با تبریک به دنیای شگفت انگیز خود شروع کنیم:

پژواک "سلام، جهان!"؛

هنگام دسترسی به این فایل، رشته Hello, World به مشتری بازگردانده می شود. همانطور که می دانید، این نشان دهنده گسترده ترین امکانات برای ساخت برنامه های کاربردی است. با ارسال آرگومان ها هنگام فراخوانی سرور با XMLHttpRequest، می توانید خروجی را پارامتری کنید و در نتیجه عملکردی غنی برای برنامه وب ارائه دهید.

به غیر از PHP، از هر زبان برنامه نویسی سمت سرور دیگری می توان استفاده کرد.

AJAX - چیست؟

وقتی فرصت‌های موجود کم باشد و جایی برای بهبود فرصت‌های موجود وجود نداشته باشد، آنگاه یک پیشرفت تکنولوژیکی رخ می‌دهد. چنین پیشرفتی AJAX (جاوا اسکریپت ناهمزمان و XML) است - رویکردی برای ایجاد رابط های کاربری برای برنامه های کاربردی وب، که در آن صفحه وب، بدون بارگیری مجدد، خود داده های مورد نیاز کاربر را بارگیری می کند. AJAX یکی از اجزای مفهوم DHTML است.

چه چیزی این فناوری را به ما می دهد. در حال حاضر، توسعه برنامه های کاربردی وب تمایل دارد بین سمت مشتری و سمت سرور تمایز قائل شود و این دلیل استفاده گسترده از قالب هایی مانند Smarty و XSLT است. پروژه‌ها در حال حاضر پیچیده‌تر می‌شوند و درهم تنیدگی فناوری‌های مختلف برای زمان توسعه‌دهندگان بسیار گران‌تر می‌شود. بنابراین، برای مثال، تمام سبک‌های قالب‌بندی در فایل‌های CSS یا XSL ارائه می‌شوند، داده‌های HTML یا XML در بخش‌های دیگر، کنترل‌کننده‌های سرور در بخش سوم، پایگاه‌های داده در بخش چهارم ذخیره می‌شوند. و اگر 5-6 سال پیش، تقریباً در همه جا می توانستید در هم تنیده شدن همه اینها را در یک فایل ببینید، اکنون به طور فزاینده ای به یک نادر تبدیل می شود.

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

نیاز به تفکیک کار وجود دارد. بنابراین، برای مثال، یک طراح کار خود را انجام می دهد، یک کدنویس کار خود را انجام می دهد، یک برنامه نویس کار خود را انجام می دهد، و در عین حال هیچکس با یکدیگر تداخل نخواهد داشت. در نتیجه، هر شرکت کننده در پروژه فقط باید اطلاعاتی را بداند که باید با آنها کار کند. در این صورت بهره وری گروه و کیفیت پروژه به میزان قابل توجهی افزایش می یابد. در حال حاضر، این مشکل با استفاده از قالب ها با موفقیت حل شده است، اما این نیز مشکلات خاصی را ایجاد می کند، زیرا برای مثال، اتصال Smarty، باید ماژول نرم افزار پردازش قالب را متصل کنید و به وضوح آن را با ساختار پروژه مرتبط کنید. اما این همیشه امکان پذیر نیست و نیاز به هزینه های خاصی دارد. هنگام استفاده از بسته XML + XSL کمی ساده تر است، زیرا آنها گزینه های بیشتری را ارائه می دهند، اما این یک جایگزین است، نه بیشتر. اما اگر به چیزی کاملاً جدید نگاه کنیم، که به ما امکان می دهد با استفاده از امکانات موجود، همه چیز را بهتر ترکیب کنیم، چه؟ سعی کنید جاوا اسکریپتی را تصور کنید که تمام قدرت PHP یا Perl از جمله گرافیک و پایگاه داده را داشته باشد، قابلیت توسعه و کاربرد بسیار بهتری داشته باشد و همچنین کراس پلتفرم باشد.

پس AJAX چیست؟ آژاکس برای اولین بار پس از مقاله فوریه 2005 "بازنگری برنامه های کاربردی وب" توسط جسی جیمز گرت صحبت شد. Ajax یک فناوری مستقل نیست. این یک ایده بر دو اصل اصلی است.

استفاده از DHTML برای تغییر پویا محتوای صفحه.

استفاده از XMLHttpRequest برای پرس و جو از سرور در حال پرواز.

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

بنابراین با جزئیات بیشتر: اگر مدل کلاسیک برنامه WEB را در نظر بگیریم:

مشتری، با تایپ آدرس منبع مورد علاقه خود در نوار جستجو، به سرور می رسد، از آن درخواست می کند. سرور محاسبات را مطابق درخواست انجام می دهد، به پایگاه داده دسترسی پیدا می کند و ... پس از آن داده های دریافتی به مشتری می رود و در صورت نیاز به قالب ها جایگزین می شود و توسط مرورگر پردازش می شود. نتیجه صفحه ای است که می بینیم و 80 درصد جمعیت کشور واقع در وب آن را اینترنت می نامند. این یک مدل کلاسیک است که توانسته خود را ثابت کند و جایگاه افتخاری در زیر نور خورشید کسب کند. این ساده ترین مدل تعامل و در نتیجه رایج ترین است. با این حال، به طور فزاینده ای ناکافی می شود. یک بازی آنلاین "کشتی جنگی" را تصور کنید که توسط دو دوست نابکار - یک ساکن آفریقای جنوبی و یک ساکن ژاپن - بازی می شود. چگونه می توان از چنین مدلی برای لذت بردن هر چه بیشتر بازی آنها استفاده کرد؟ در هر صورت داده های کشتی های غرق شده در سرور ذخیره می شود و برای بررسی اینکه آیا حریف شبیه بوده است، باید هر بار صفحه را به روز کرد و داده های قدیمی را غلیظ کرد. "اما مردم به فکر ذخیره کش افتادند" - می گویید، و کاملاً درست می گویید، اما این کار را آسان تر نمی کند. کش کردن تنها زمان تعامل با سرور را سرعت می بخشد، اما نیازی به بارگذاری مجدد صفحه را از بین نمی برد. از طرف دیگر، می‌توانید زمان مشخصی برای خود به‌روزرسانی تنظیم کنید، اما در این صورت، صفحه کاملاً بارگیری می‌شود.

حال بیایید به مدل تعامل AJAX نگاه کنیم:

توالی اقدامات مشتری ذخیره می شود و او به احتمال زیاد متوجه نخواهد شد که چه اتفاقی خواهد افتاد و کلمه AJAX فقط با نام باشگاه فوتبال همراه خواهد بود. اما در سمت سرور، همه چیز متفاوت به نظر می رسد.

هنگام دسترسی به سرور، صفحه ای ایجاد می شود که به کاربر نمایش داده می شود و به او پیشنهاد می دهد تا دنباله ای از اقدامات مورد علاقه خود را انجام دهد. با انتخاب آگاهانه (البته نه لزوما) مشتری، درخواست او به ماژول AJAX ارجاع می‌شود، که تمام محاسبات مورد علاقه او را انجام می‌دهد و با سرور به این صورت کار می‌کند. اما نوآوری چیست؟ تفاوت اصلی این است که این روش به ما این امکان را می دهد که به صورت پویا به سرور دسترسی داشته باشیم و اقدامات مورد نظر خود را انجام دهیم. به عنوان مثال، ما باید یک فراخوانی از پایگاه داده انجام دهیم و داده های مورد نظر خود را دریافت کنیم که سپس از آنها استفاده خواهیم کرد. ما داده ها را در یک فایل XML که به صورت پویا تولید می شود ذخیره می کنیم، به این ترتیب:

یک شی جاوا اسکریپت جدید ایجاد کنید:

Var req = ActiveXObject جدید ("Microsoft.XMLHTTP"); (برای اینترنت اکسپلورر) var req = new XMLHttpRequest(); (برای هر چیز دیگری)

سپس با استفاده از این شی یک تابع می نویسیم

ورق; تابع loadXMLDoc(url) (// شعبه برای شیء بومی XMLHttpRequest if (window.XMLHttpRequest) ( req = new XMLHttpRequest(); req.onreadystatechange = processReqChange; req.open("GET", url, true)؛ req.send( null)؛ // شاخه برای IE/Windows نسخه ActiveX ) other if (window.ActiveXObject) ( req = ActiveXObject جدید ("Microsoft.XMLHTTP")؛ if (req) ( req.onreadystatechange = processReqChange; req.open("GET ", url, true); req.send(); ) ) )

در بدنه فایل HTML، یک اسکریپت می نویسیم که:

تابع checkName(ورودی، پاسخ) ( if (response != "")( // Response mode message = document.getElementById("nameCheckFailed"); if (response == "1")( message. className = "error"; )else( message.className = "مخفی"؛ ) )else( // url حالت ورودی = "http://localhost/xml/checkUserName.php?q=" \\ + ورودی; loadXMLDoc(url); ) )

در فایل localhost/xml/checkUserName.php، داده های دریافتی از خط فرمان را در این مورد در متغیر q پردازش می کنیم. و نتیجه در ساختار XML ذخیره می شود که در همان فایل ذخیره می شود. بنابراین می توانیم داده های دریافتی از پایگاه داده یا چیز دیگری را که نیاز داریم دریافت و پردازش کنیم. علاوه بر این، سرور فقط داده‌هایی را که باید به‌روزرسانی کنیم پردازش می‌کند و در صورت بارگیری مجدد، کل صفحه را پردازش نمی‌کند.

حالا بیایید به دو دوست - عاشقان نبردهای دریایی برگردیم: با توجه به ظاهر این نوآوری، می توانیم موارد زیر را انجام دهیم: هر سه ثانیه از فایل XML را بررسی کنید، این بررسی شامل بررسی پایگاه داده برای یک ورودی جدید است. ، برای حرکتی که حریف انجام داده است. اگر حرکت انجام شود، صفحه بدون بارگیری مجدد کشتی ها را غرق می کند و در نتیجه روحیه شرکت کنندگان در نبردهای آبی را خراب می کند. این قابلیت با استفاده ابتدایی از جاوا اسکریپت و شیوه نامه ها به دست می آید. این مثال کاملا واضح است، اما به دور از کامل بودن، استفاده از این فناوری بسیار مهمتر است.

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

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

مشکل دوم سازگاری بین مرورگرها است. شی XMLHttpRequest هنوز بخشی از هیچ استانداردی نیست (اگرچه چیزی مشابه قبلاً در مشخصات بارگیری و ذخیره سطح 3 W3C DOM پیشنهاد شده است). بنابراین، دو روش مختلف برای فراخوانی این شی در کد اسکریپت وجود دارد. در اینترنت اکسپلورر، شی ActiveX به صورت زیر فراخوانی می شود:

Var req = ActiveXObject جدید ("Microsoft.XMLHTTP");

در موزیلا و سافاری، این کار آسان‌تر است (زیرا یک شی ساخته شده در جاوا اسکریپت است):

varreq = new XMLHttpRequest();

همه مرورگرهای مدرن از این شی پشتیبانی می کنند و تنها 1.8 درصد از کاربران (طبق آمار SpyLog) که از نسخه های بسیار قدیمی مرورگرهایی که از این شی پشتیبانی نمی کنند استفاده می کنند، با مشکل مواجه خواهند شد.

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

تولید صفحه، مقادیر منحصر به فردی تولید می کنیم که سپس آن را در متغیرهای سرور قرار می دهیم. و در کوکی های مرورگر، سپس در حین مجوز، نام کاربری و رمز عبور را دریافت می کنیم که باید آنها را به ماژول پردازش در سرور منتقل کنیم.

پس از اینکه کاربر داده‌ها را وارد کرد و روی دکمه ارسال کلیک کرد، رمز عبور او در کوکی‌ها وارد می‌شود و نام کاربری به صورت آشکار - برای مثال از طریق پیوند، منتقل می‌شود. http://www.mubestajax.com/ajax.php?login=pupkinهنگام دریافت داده ها، سرور ابتدا داده های دریافتی را بررسی می کند. از آنجایی که مقادیری که از شروع سرور ایجاد کرده ایم و سپس آنها را به متغیرهای جهانی سرور و کوکی ها ارسال کرده ایم باید مطابقت داشته باشند، پس هنگام بررسی یکپارچگی داده های ارسال شده، در صورت عدم تطابق برنامه از کار می افتد. اگر همه چیز به خوبی پیش رفت، تمام داده های لازم استخراج می شود و محاسبات و کارهای لازم انجام می شود. این روش حفاظتی بسیار ساده و موثر است. اما برای پروژه های بزرگ مناسب نیست.

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

در خاتمه می‌خواهم بگویم که AJAX از یک سو جهشی بزرگ در مهندسی وب است، اما از سوی دیگر، این یک مرحله تکاملی طولانی مدت است که افق‌های جدیدی را در زمینه توسعه نرم‌افزار باز کرده است. . در عین حال ، این فناوری هنوز کاملاً "خام" است ، زیرا استفاده از آن در حال حاضر استثنایی دلپذیر است. اما من مطمئن هستم که همه بیش از یک بار در مورد آن خواهند شنید.

اکثر وب سایت های مدرن از فناوری به نام AJAX برای تعامل سریع و موثر با بازدید کننده استفاده می کنند. AJAX به روشی بسیار محبوب برای دریافت داده ها از سرور در پس زمینه و به روز رسانی پویا صفحه تبدیل شده است.

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

در این مجموعه آموزشی، اصول ساخت درخواست های AJAX با jQuery را پوشش خواهیم داد. موضوعات زیر پوشش داده خواهد شد:

  • فناوری AJAX چیست؟ چگونه کار می کند؟ مزایای آن چیست؟
  • چگونه با jQuery انواع درخواست های AJAX ایجاد کنیم؟
  • ارسال داده ها به سرور با استفاده از درخواست های AJAX.
  • پردازش و استخراج داده ها از پاسخ های AJAX از سرور.
  • چگونه می توان مدیریت AJAX جی کوئری را سفارشی کرد و تنظیمات پیش فرض را تغییر داد؟

توجه: دروس بر روی بخش جاوا اسکریپت سمت کلاینت تمرکز دارد. اما توسعه سمت سرور نیز بسیار ساده است. برای اطلاعات بیشتر، مطالب مربوط به زبان های برنامه نویسی سمت سرور مانند PHP را مطالعه کنید.

AJAX چیست و چرا مفید است؟

AJAX یک تکنیک توسعه برنامه وب است که در آن کد جاوا اسکریپت اجرا شده در مرورگر بازدیدکننده با یک وب سرور به صورت ناهمزمان، یعنی در پس زمینه، ارتباط برقرار می کند. تفاوت برنامه های وب معمولی به شرح زیر است:

  • صفحه وب معمولیحاوی پیوندها یا فرم هایی است که وقتی روی آنها کلیک یا ارسال می شود، یک URL جدید در سرور وب درخواست می کند. سرور یک صفحه HTML کاملاً جدید را ارسال می کند، که مرورگر آن را ارائه می دهد و جایگزین صفحه اصلی می شود. این رویکرد زمان زیادی می برد و تأثیر بدی روی بازدیدکننده می گذارد، زیرا باید منتظر بارگذاری صفحه جدید باشد.
  • هنگام استفاده از فناوری AJAX،کد جاوا اسکریپت درخواستی را به URL روی سرور ارسال می کند. کد همچنین می تواند داده ها را همراه با درخواست ارسال کند. کد جاوا اسکریپت سپس پاسخ سرور را پردازش می کند و بر اساس آن عمل می کند. به عنوان مثال، محاسبات را می توان با داده های برگشتی انجام داد، ویجت را می توان در صفحه اضافه یا به روز کرد، پیامی در مورد به روز رسانی پایگاه داده در سرور برای بازدید کننده صادر می شود.

از آنجایی که درخواست AJAX در پس‌زمینه اجرا می‌شود، کد جاوا اسکریپت (و بازدیدکننده) می‌توانند در زمانی که درخواست در حال پردازش است به کار روی صفحه ادامه دهند. این فرآیند از دید بازدیدکننده پنهان می شود و نیازی به ترک صفحه ای که در حال حاضر مشاهده می کند نیست. این رویکرد باعث می شود که کار با صفحات AJAX بسیار لذت بخش باشد.

نکته اساسی AJAX شی جاوا اسکریپت XMLHttpRequest است. تعدادی روش مانند open() ، send() و onreadystatechange() را ارائه می دهد که می توانند هنگام ارسال درخواست های AJAX به سرور و پردازش پاسخ ها در پس زمینه استفاده شوند.

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

برای کسانی که بیشتر کنجکاو هستند، کلمه AJAX مخفف حروف اول عبارت در انگلیسی است. آهمزمان جی avascript آ nd ایکس ML" (جاوا اسکریپت ناهمزمان و XML). با این حال، این عبارت ممکن است گمراه کننده باشد - درخواست لازم نیست ناهمزمان باشد، و لازم نیست از XML برای ارسال داده استفاده کند.

ایجاد یک درخواست GET با $.get()

متد jQuery $.get() یک راه آسان و راحت برای ایجاد یک درخواست ساده AJAX فراهم می کند. درخواست را با استفاده از روش HTTP GET (که برای دریافت URL هایی مانند صفحات و تصاویر استفاده می شود) به جای روش POST (که به طور سنتی برای ارسال داده های فرم استفاده می شود) انجام می دهد.

در ساده‌ترین شکل آن، می‌توانید متدی مانند زیر را فراخوانی کنید:

جایی که url URL منبعی است که از آن پاسخ انتظار می رود. این معمولاً یک اسکریپت سمت سرور است که اقداماتی را انجام می دهد و ممکن است برخی از داده ها را برگرداند:

$.get("http://example.com/getForecast.php");

اگرچه می توانید یک سند ثابت نیز درخواست کنید:

$.get("http://example.com/mypage.html");

هنگام درخواست URL، می توانید داده ها را همراه با درخواست ارسال کنید. شما می توانید داده ها را در رشته پرس و جو ارسال کنید، درست مانند یک درخواست GET معمولی:

$.get("http://example.com/getForecast.php?city=rome&date=20120318");

درست است که همین کار را با ارسال آبجکت داده به عنوان پارامتر دوم به متد ()$.get انجام دهید. شی داده باید حاوی اطلاعاتی به شکل جفت نام ویژگی/مقدار خاصیت باشد. برای مثال:

var data = (شهر: "رم"، تاریخ: "20120318"); $.get("http://example.com/getForecast.php"، داده)؛

همچنین، می‌توانید داده‌ها را به‌عنوان یک رشته به متد $.get() ارسال کنید:

Var data = "city=rom&date=20120318"; $.get("http://example.com/getForecast.php"، داده)؛

دریافت اطلاعات از سرور

تا کنون، ما فقط نمونه‌هایی از استفاده از $.get() برای ارسال درخواست‌ها به سرور را بررسی کرده‌ایم، بدون توجه به پاسخی که ممکن است یک اسکریپت سمت سرور ایجاد کند. اما در بیشتر موارد، کد جاوا اسکریپت شما منتظر پاسخ یک اسکریپت سمت سرور می ماند و داده های دریافتی را پردازش می کند.

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

باید بنویسی تابع بازگشت، که با تکمیل درخواست AJAX و ارسال پاسخ توسط سرور به طور خودکار اجرا می شود. حداقل، تابع شما باید داده های بازگردانده شده توسط سرور را به عنوان اولین آرگومان خود در نظر بگیرد:

تابع myCallback(returnedData) (// انجام پردازش داده بازگشت داده ها)

هنگامی که تابع callback ایجاد شد، می توانید آن را به عنوان آرگومان سوم به متد $.get() ارسال کنید:

var data = (شهر: "رم"، تاریخ: "20120318"); $.get("http://example.com/getForecast.php"، داده، myCallback)؛

تعیین نوع داده پاسخ

به طور معمول، سمت سرور داده ها را در یکی از چندین فرمت رایج، از جمله XML، JSON، جاوا اسکریپت یا HTML منتقل می کند. به طور پیش فرض، jQuery سعی می کند مناسب ترین فرمت را تعیین کند و داده ها را بر اساس آن تجزیه و تحلیل کند. اما بهتر است فرمت را به صراحت تعریف کنید.

برای تعیین فرمت، آرگومان چهارم باید به متد ()$.get ارسال شود. این آرگومان می تواند رشته ای از لیست زیر باشد:

  • "xml"
  • "json"
  • "اسکریپت"
  • "html"

برای مثال، اگر می‌دانید که اسکریپت سرور داده‌ها را با فرمت JSON برمی‌گرداند، متد $.get() را به این صورت فراخوانی کنید:

$.get("http://example.com/getForecast.php"، داده، myCallback، "json");

مثالی از استفاده از متد $.get().

در اینجا مثالی از ایجاد یک درخواست AJAX با استفاده از متد $.get() و مدیریت ساده پاسخ آورده شده است. برای اینکه مثال کار کند، باید یک فایل متنی ساده روی سرور به نام getForecast.txt ایجاد کنید که حاوی متن زیر باشد:

( "شهر": "واسیوکی"، "تاریخ": "18 مارس 2012"، "پیش‌بینی": "سرما شدید و لجن‌بار"، "maxTemp": +1 )

این فایل پاسخ JSON را تقلید می کند که ممکن است توسط یک اسکریپت پیش بینی آب و هوا در سرور ایجاد شده باشد.

سپس صفحه showForecast.html را در همان پوشه getForecast.txt ایجاد می کنیم:

پیش بینی آب و هوا

showForecast.html را در یک مرورگر باز کنید و روی دکمه "دریافت پیش بینی آب و هوا" کلیک کنید. در پنجره پیام ما پیش بینی آب و هوا را از سرور خود دریافت خواهیم کرد.

در اینجا نحوه کار این کد آمده است:

  1. showForecast.html حاوی یک عنصر دکمه "دریافت پیش بینی آب و هوا" با شناسه getForecast است.
  2. جاوا اسکریپت بالای صفحه به محض بارگیری صفحه و آماده شدن DOM اجرا می شود.
  3. کد جاوا اسکریپت ابتدا یک کنترل کننده رویداد کلیک را به دکمه #getForecast متصل می کند. این کنترل کننده یک درخواست AJAX GET برای getForecast.txt می کند و نام شهر و تاریخ پیش بینی را ارسال می کند. همچنین یک تابع callback() موفقیت را تعریف می کند که پس از تکمیل درخواست اجرا می شود. فرمت داده های برگردانده شده توسط سرور به صورت JSON تعریف می شود.
  4. فایل getForecast.txt داده های پیش بینی را با فرمت JSON به مرورگر برمی گرداند.
  5. تابع success() فراخوانی می شود. jQuery داده های JSON دریافتی از getForecast.txt را تجزیه می کند، آن را به یک شی جاوا اسکریپت تبدیل می کند و به تابع ارسال می کند.
  6. تابع یک شی داده forecastData را برمی‌گرداند و پیامی را نشان می‌دهد که حاوی چندین ویژگی شی، از جمله نام شهر، پیش‌بینی و دما است.

یک مثال ساده و چند خطی نشان می دهد که چگونه درخواست AJAX با استفاده از متد $.get() کار می کند.

پنج سال پیش، اگر XML نمی دانستید، جوجه اردک زشت بودید (هیچکس با او صحبت نمی کرد). هجده ماه پیش، روبی در کانون توجه قرار گرفت و برنامه نویسانی که نمی دانستند چه خبر است، به مخزن آب سرد دعوت نشدند. امروز، اگر می خواهید به حزب فناوری برسید، به Ajax نیاز دارید.

با این حال، آژاکس است خیلی دورنه یک هوس، بلکه یک رویکرد قدرتمند برای ساختن وب سایت هایی که یادگیری آن به اندازه یک زبان جدید سخت نیست.

قبل از اینکه به جزئیات آژاکس بپردازم، اجازه دهید چند دقیقه وقت بگذاریم تا بفهمیم چیست میکندآژاکس وقتی این روزها برنامه ای می نویسید، دو گزینه اصلی دارید:

  • برنامه های دسکتاپ
  • برنامه های کاربردی وب

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

مهمتر از آن، جایی که کد در این برنامه ها اجرا می شود، نحوه رفتار آنها و نحوه تعامل شما با آنها را تعیین می کند. برنامه های دسکتاپ معمولاً بسیار سریع هستند (در رایانه شما اجرا می شوند؛ لازم نیست منتظر اتصال به اینترنت باشید)، دارای رابط های کاربری عالی (معمولاً با سیستم عامل شما در تعامل هستند) و به طور باورنکردنی پویا هستند. می‌توانید کلیک کنید، تایپ کنید، از منوهای کشویی و بازشو استفاده کنید و تقریباً بدون تأخیر در میان پنجره‌ها پیمایش کنید.

از طرف دیگر، برنامه های کاربردی وب معمولاً به روزترین هستند و ویژگی هایی را ارائه می دهند که هرگز نمی توانید در رایانه خود داشته باشید (به Amazon.com و eBay فکر کنید). با این حال، با قدرت وب انتظار می‌رود—انتظار برای پاسخ از سوی سرور، انتظار برای به‌روزرسانی صفحه، انتظار برای پاسخ به درخواست، و ایجاد صفحه جدید.

واضح است که همه اینها یک ساده سازی است، اما شما ایده کلی را دریافت می کنید. همانطور که قبلاً ممکن است مشکوک باشید، Ajax تلاش می کند شکاف بین عملکرد و تعامل یک برنامه دسکتاپ و یک برنامه وب همیشه به روز را پر کند. می توانید از رابط های کاربری پویا مشابه آنچه در برنامه دسکتاپ یافت می شود اما در برنامه وب موجود است استفاده کنید.

پس منتظر چی هستیم؟ بیایید شروع به بررسی Ajax و چگونگی تبدیل رابط های وب بد خود به برنامه های کاربردی حساس Ajax کنیم.

تکنولوژی قدیمی، ترفندهای جدید

وقتی صحبت از Ajax به میان می‌آید، واقعیت این است که فناوری‌های زیادی را پوشش می‌دهد - برای تسلط بر آن، باید چندین فناوری مختلف را بررسی کنید (به همین دلیل است که من چند مقاله اول این مجموعه را به بخش‌های مستقل تقسیم می‌کنم). خبر خوب این است که احتمالاً قبلاً در مورد بسیاری از این فناوری‌ها اطلاعات کافی دارید - یادگیری بیشتر این فناوری‌های فردی آسان است (قطعاً به سختی یک زبان برنامه‌نویسی کامل مانند جاوا یا روبی نیست).

تعریف آژاکس

به هر حال، Ajax مخفف جاوا اسکریپت ناهمزمان و XML (و DHTML و غیره) است. این عبارت توسط جسی جیمز گرت از Adaptive Path ابداع شد (به بخش مراجعه کنید) و به گفته جسی، نهقرار بود مخفف باشد

در اینجا فناوری های اصلی درگیر در برنامه های Ajax آمده است:

  • HTML برای ایجاد فرم های وب و تعیین فیلدهایی که در برنامه شما استفاده می شود استفاده می شود.
  • کد جاوا اسکریپت کد اصلی است که برنامه های Ajax را اجرا می کند و با برنامه های سرور تعامل دارد.
  • DHTML یا Dynamic HTML به شما کمک می کند تا فرم ها را به صورت پویا به روز کنید. شما از div، span و سایر عناصر HTML پویا برای علامت گذاری HTML خود استفاده خواهید کرد.
  • DOM، Document Object Model، (از طریق کد جاوا اسکریپت) برای کار با ساختار HTML شما و (در برخی موارد) XML دریافت شده از سرور استفاده خواهد شد.

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

شی XMLHttpRequest

اولین موردی که می خواهید در مورد آن بدانید ممکن است جدیدترین مورد برای شما باشد. XMLHttpRequest نامیده می شود. این یک شی جاوا اسکریپت است و همانطور که در نشان داده شده است ایجاد آن آسان است.

فهرست 1. ایجاد یک شی XMLHttpRequest جدید

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

در برنامه های وب معمولی، کاربران فیلدهای فرم را پر می کنند و روی یک دکمه کلیک می کنند. ارسال(تایید). سپس فرم به طور کامل به سرور ارسال می‌شود، سرور اسکریپت را پردازش می‌کند (معمولاً PHP یا جاوا، شاید یک فرآیند CGI یا چیزی مشابه)، و سپس کل صفحه جدید را برمی‌گرداند. این صفحه می تواند یک صفحه HTML با یک فرم جدید با برخی از داده های پر شده، یا یک صفحه تایید، یا شاید یک صفحه با برخی از انتخاب ها بر اساس داده های وارد شده در فرم اصلی باشد. طبیعتاً تا زمانی که اسکریپت یا برنامه روی سرور پردازش نشود و فرم جدیدی برگردانده شود، کاربران باید منتظر بمانند. با دریافت داده های جدید از سرور، صفحه نمایش آنها پاک می شود و دوباره ترسیم می شود. اینجاست که تعامل کم ظاهر می شود - کاربران بازخورد فوری دریافت نمی کنند و قطعاً احساس متفاوتی نسبت به زمانی که از برنامه های دسکتاپ استفاده می کنند دارند.

Ajax اساساً فناوری جاوا اسکریپت و شی XMLHttpRequest را قرار می دهد بینفرم وب و سرور شما هنگامی که کاربران فرم ها را پر می کنند، داده ها به جای اینکه مستقیماً به سرور منتقل شوند، به برخی از کدهای جاوا اسکریپت منتقل می شوند. در عوض، کد جاوا اسکریپت داده های فرم را جمع آوری کرده و درخواست را به سرور ارسال می کند. در حالی که این اتفاق می افتد، فرم روی صفحه کاربر سوسو نمی زند، چشمک نمی زند، ناپدید نمی شود، یا مسدود نمی شود. به عبارت دیگر، کد جاوا اسکریپت درخواست را در پس زمینه ارسال می کند. کاربر حتی متوجه نمی شود که درخواستی از سرور وجود دارد. علاوه بر این، درخواست به صورت ناهمزمان ارسال می شود، به این معنی که کد جاوا اسکریپت شما (و کاربر) منتظر پاسخ سرور نمی ماند. یعنی کاربران می توانند به وارد کردن داده ها، اسکرول صفحه و کار با برنامه ادامه دهند.

سپس سرور داده ها را به کد جاوا اسکریپت شما (هنوز در فرم وب شما) ارسال می کند، که تصمیم می گیرد با داده ها چه کاری انجام دهد. می‌تواند فیلدهای فرم را در لحظه به‌روزرسانی کند، و به برنامه شما احساسی فوری بدهد - کاربران بدون ارسال یا به‌روزرسانی فرم‌های خود، داده‌های جدیدی را دریافت می‌کنند. کد جاوا اسکریپت حتی می تواند داده ها را دریافت کند، محاسباتی انجام دهد و درخواست دیگری ارسال کند، همه اینها بدون دخالت کاربر! این قدرت XMLHttpRequest است. او می تواند به میل خود با سرور ارتباط برقرار کند و کاربر حتی نمی داند واقعا چه اتفاقی می افتد. در نتیجه پویایی، حساسیت، تعامل بالای اپلیکیشن دسکتاپ به همراه تمامی امکانات اینترنت را به دست می آوریم.

اضافه کردن کد جاوا اسکریپت

هنگامی که XMLHttpRequest را درک کردید، بقیه کد جاوا اسکریپت تبدیل به یک کار طاقت فرسا می شود. در واقع، شما از کد جاوا اسکریپت برای تعداد کمی از وظایف اصلی استفاده خواهید کرد:

برای انجام دو کار اول، باید با متد getElementById() که در .

فهرست 2. جمع آوری و تنظیم مقادیر فیلد با جاوا اسکریپت

// مقدار فیلد "phone" را دریافت کنید و آن را در متغیر تلفن ذخیره کنید var phone = document.getElementById("phone").value; // مقادیر را در فرم با استفاده از آرایه پاسخ تنظیم کنید document.getElementById("order").value = answer; document.getElementById("آدرس").value = پاسخ;

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

تکمیل با DOM

آخرین اما نه کم اهمیت ترین DOM، مدل شیء سند است. برای برخی از شما، شایعات در مورد DOM ممکن است کمی ترسناک باشد - اغلب توسط طراحان HTML استفاده نمی شود، و حتی برای کدنویسان جاوا اسکریپت کمی نامشخص است (مگر اینکه واقعاً برنامه نویسی سطح بالا انجام می دهید). می‌توانید استفاده گسترده‌ای از DOM در برنامه‌های سنگین نوشته شده در جاوا و C/C++ پیدا کنید. در واقع، این امر باعث شده است که DOM به دلیل پیچیده بودن و یادگیری دشوار شهرت داشته باشد.

خوشبختانه، استفاده از DOM در فناوری جاوا اسکریپت آسان و بیشتر بصری است. حالا احتمالاً باید به شما می‌گفتم چگونه از DOM استفاده کنید، یا حداقل چند نمونه کد به شما می‌دادم، اما حتی این شما را به بیراهه می‌برد. نکته این است که شما می توانید با Ajax بدون نیاز به مخلوط کردن در DOM بسیار جلو بروید، و این دقیقاً راهی است که من می خواهم به شما نشان دهم. در مقاله آینده به DOM بازخواهم گشت، اما در حال حاضر، فقط بدانید که در جایی وجود دارد. همانطور که شروع به ارسال داده های XML بین کد جاوا اسکریپت و تغییرات واقعی فرم HTML می کنید، عمیق تر در DOM کاوش خواهید کرد. در عین حال، می توانید بدون DOM با Ajax به طور موثر کار کنید، پس بیایید فعلا آن را کنار بگذاریم.

دریافت یک شی درخواست

با داشتن این نمای کلی، آماده هستید تا نگاه دقیق تری داشته باشید. از آنجایی که XMLHttpRequest برای برنامه های Ajax مرکزی است (و احتمالاً برای بسیاری از شما جدید است)، من با آن شروع می کنم. همانطور که در مشاهده کردید، ایجاد این شی و استفاده از آن باید آسان باشد، درست است؟ یک دقیقه صبر کن.

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

کار با مرورگرهای مایکروسافت

مرورگر مایکروسافت اینترنت اکسپلورر از تجزیه کننده MSXML برای پردازش XML استفاده می کند (پیوندهای اطلاعات بیشتر در مورد MSXML را می توانید در بخش پیدا کنید). بنابراین وقتی برنامه های Ajax را می نویسید که باید در اینترنت اکسپلورر اجرا شوند، باید شی را به روشی خاص ایجاد کنید.

با این حال، آنقدرها هم آسان نیست. در واقع دو نسخه مختلف از MSXML در حال استفاده است. نسخه MSXML به نسخه جاوا اسکریپت نصب شده در اینترنت اکسپلورر بستگی دارد، بنابراین باید کدی بنویسید که برای هر دو نسخه کار کند. به کد ایجاد XMLHttpRequest در مرورگرهای مایکروسافت نگاهی بیندازید.

فهرست 3. ایجاد یک شی XMLHttpRequest در مرورگرهای مایکروسافت

varxmlHttp = false; امتحان کنید ( xmlHttp = جدید ActiveXObject("Msxml2.XMLHTTP"); ) catch (e) ( try (xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); ) catch (e2) (xmlHttp = false; ) )

همه اینها ممکن است هنوز منطقی نباشد، اما اشکالی ندارد. قبل از پایان این مقاله به برنامه نویسی جاوا اسکریپت، مدیریت خطا، کامپایل شرطی و موارد دیگر خواهید پرداخت. در این بین، باید دو خط اصلی را در ذهن خود بنویسید:

xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");

xmlHttp = ActiveXObject جدید ("Microsoft.XMLHTTP"); .

به طور خلاصه، این کد سعی می کند با استفاده از یک نسخه از MSXML یک شی ایجاد کند. در صورت عدم موفقیت، یک شی برای نسخه دوم ایجاد می شود. برازنده، درست است؟ اگر هیچ چیزی کار نکرد، متغیر xmlHttp روی false تنظیم می شود تا به کد شما نشان دهد که مشکلی وجود دارد. در این مورد، ممکن است از یک مرورگر غیر مایکروسافت استفاده کنید و برای انجام کار نیاز به استفاده از کدهای مختلف داشته باشید.

کار با مرورگرهای موزیلا و غیر مایکروسافت

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

var xmlHttp = شیء جدید XMLHttpRequest. .

این خط بسیار ساده‌تر یک شی XMLHttpRequest را در موزیلا، فایرفاکس، سافاری، اپرا و تقریباً هر مرورگر غیر مایکروسافتی که از Ajax به هر شکل یا طعمی پشتیبانی می‌کند، ایجاد می‌کند.

یک انجمن

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

لیست 4. ایجاد یک شی XMLHttpRequest برای همه مرورگرها

/* یک شی XMLHttpRequest جدید برای صحبت با سرور وب ایجاد کنید */ var xmlHttp = false; /*@cc_on @*/ /*@if (@_jscript_version >= 5) امتحان کنید ( xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); ) ) catch (e2) (xmlHttp = false; ) ) @end @*/ if (!xmlHttp && typeof XMLHttpRequest != "undefined") (xmlHttp = new XMLHttpRequest();)

در حال حاضر، نظرات و برچسب های مبهم مانند @cc_on را نادیده بگیرید. اینها دستورات ویژه کامپایلر جاوا اسکریپت هستند که در مقاله بعدی من به تفصیل به آنها خواهیم پرداخت، که همه چیز در مورد XMLHttpRequest خواهد بود. اساس این کد را می توان به سه مرحله تقسیم کرد:

  1. یک متغیر xmlHttp برای ارجاع به شی XMLHttpRequest ایجاد کنید.
  2. در بلوک try، یک شی در مرورگرهای مایکروسافت ایجاد کنید:
    • در بلوک try، یک شی با استفاده از شی Msxml2.XMLHTTP ایجاد کنید.
    • اگر موفق نشد، در بلوک try، یک شی با استفاده از شی Microsoft.XMLHTTP ایجاد کنید.
  3. اگر هنوز xmlHttp تنظیم نشده است، یک شی برای مرورگرهای دیگر ایجاد کنید.

در پایان این فرآیند، xmlHttp باید به یک شیء معتبر XMLHttpRequest، صرف نظر از مرورگری که کاربر استفاده می کند، مراجعه کند.

چند کلمه در مورد حفاظت

حفاظت چطور؟ مرورگرهای مدرن به کاربران این امکان را می دهند که امنیت را افزایش دهند، فناوری جاوا اسکریپت را غیرفعال کنند و بسیاری از تنظیمات را در مرورگر خود غیرفعال کنند. در این مواقع کد شما احتمالا تحت هیچ شرایطی کار نخواهد کرد. برای چنین موقعیت هایی، شما باید مشکلات را به زیبایی حل کنید - حداقل یک مقاله در مورد آن وجود دارد، و یکی بعداً خواهم نوشت (احتمالاً یک سری طولانی خواهد بود، اما نگران نباشید - قبل از پایان به همه چیز مسلط خواهید شد. از این سری مقالات). در عین حال، شما کد قوی اما نه کامل می نویسید که برای یادگیری Ajax عالی است. بعداً به کدهای بهتر باز خواهید گشت.

درخواست/پاسخ در دنیای آژاکس

بنابراین، شما قبلاً با Ajax آشنا هستید و درک اولیه ای از شی XMLHttpRequest و نحوه ایجاد آن دارید. اگر با دقت مطالعه کنید، حتی متوجه می شوید که این فناوری جاوا اسکریپت است که با هر برنامه وب روی سرور صحبت می کند، نه فرم HTML شما که مستقیماً ارسال کرده اید.

چه چیزی را از دست دادیم؟ نحوه استفاده واقعی از XMLHttpRequest. از آنجایی که این یک کد حیاتی است که در برخی از اشکال از آن استفاده خواهید کرد هر کسبرنامه Ajax شما، بیایید نگاهی گذرا به مدل اصلی درخواست/پاسخ Ajax بیاندازیم.

اجرای یک درخواست

شما شی جدید XMLHttpRequest خود را دارید. بیایید آن را به حرکت در آوریم اول، ما به یک روش جاوا اسکریپت نیاز داریم که صفحه وب شما بتواند آن را فراخوانی کند (به عنوان مثال، زمانی که کاربر متنی را وارد می کند یا گزینه ای را از یک منو انتخاب می کند). سپس، شما باید همان الگوی اولیه را در تقریباً همه برنامه های Ajax خود دنبال کنید:

  1. برخی از داده ها را از یک فرم وب دریافت کنید.
  2. یک URL اتصال ایجاد کنید.
  3. اتصال به سرور را باز کنید.
  4. تابعی را برای سرور تنظیم کنید تا پس از پاسخ آن اجرا شود.
  5. ارسال درخواست.
فهرست 6. رسیدگی به پاسخ از سرور

تابع updatePage() (اگر (xmlHttp.readyState == 4) ( پاسخ var = xmlHttp.responseText؛ document.getElementById ("zipCode"). مقدار = پاسخ؛ ) )

باز هم، کد دشوار یا پیچیده نیست. صبر می کند تا سرور آن را با حالت آماده مورد نظر فراخوانی کند و سپس از مقداری که سرور برمی گرداند (در این مورد کد پستی شهر و ایالت وارد شده توسط کاربر) برای تنظیم فیلد فرم دیگری استفاده می کند. در نتیجه، قسمت zipCode به طور غیرمنتظره ای با یک کد پستی ظاهر می شود، اما کاربر هرگز روی دکمه کلیک نکرد! این رفتار برنامه دسکتاپ است که قبلاً در مورد آن صحبت کردم. کارایی، حس پویایی و... و همگی با کد کوچک آژاکس.

خوانندگان ناظر ممکن است متوجه شده باشند که فیلد zipCode یک فیلد متنی معمولی است. پس از اینکه کد پستی توسط سرور برگردانده شد و متد updatePage() این فیلد را با مقدار کد پستی شهر/ایالت تنظیم کرد، کاربران ممکن استاین مقدار را نادیده بگیرید. این کار عمداً به دو دلیل انجام می شود: ساده نگه داشتن این مثال و نشان دادن اینکه گاهی اوقات می خواهید کاربران بتوانند مقادیر بازگردانده شده توسط سرور را لغو کنند. هر دو نکته را در نظر داشته باشید؛ آنها در طراحی رابط کاربری خوب مهم هستند.

رهگیری در فرم های وب

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

لیست 7. شروع فرآیند Ajax

شهر: onChange="callServer();" />

دولت: onChange="callServer();" />

کد پستی:

اگر به نظر می رسد فقط یک بخش دیگر از روال است، تا حدی، کد - حق با شماست، درست است! هنگامی که کاربر مقدار جدیدی را برای هر یک از فیلدهای شهر یا ایالت وارد می کند، متد callServer() فعال می شود و تابع Ajax شروع می شود. آیا احساس می کنید که در حال شروع به درک ماهیت چیزها هستید؟ خوب!

سرانجام

در این مرحله، ممکن است برای خروج و نوشتن اولین برنامه Ajax آماده نباشید، حداقل تا زمانی که کاوش نکرده باشید. با این حال، شما می توانید از قبل شروع به درک ایده اصلی در مورد نحوه کار این برنامه ها و اینکه شی XMLHttpRequest چیست، شروع کنید. در مقالات آینده، شما در مورد این شی یاد خواهید گرفت، نحوه کنترل تعاملات جاوا اسکریپت به سرور و کار با فرم های HTML و حتی درک DOM.

در حال حاضر، کمی وقت بگذارید و به این فکر کنید که برنامه های Ajax چقدر می توانند قدرتمند باشند. فرم وب را تصور کنید که نه تنها با کلیک کردن روی یک دکمه، بلکه زمانی که داده‌ها را در یک فیلد وارد می‌کنید، زمانی که گزینه‌ای را از فهرستی از گزینه‌ها انتخاب می‌کنید، و حتی زمانی که نشانگر خود را روی صفحه حرکت می‌دهید، پاسخ می‌دهد. به معنای واقعی کلمه فکر کنید نامتقارن. به کد جاوا اسکریپت در حال اجرا فکر کنید و انتظار نداشتندر حالی که سرور به درخواست های خود پاسخ می دهد. با چه مشکلاتی می توانید مواجه شوید؟ چه چیزهایی باید مراقب بود؟ و چگونه طراحی فرم شما برای تطبیق با این رویکرد برنامه نویسی جدید تغییر خواهد کرد؟

صرف زمان بر روی این نکات به شما ارزش بیشتری نسبت به دریافت کدی می دهد که بتوانید بدون درک واقعی آن را کپی و در برنامه خود جایگذاری کنید. در مقاله بعدی این ایده ها را عملی خواهید کرد. من جزئیات کدی را که برای کارکردن برنامه های مشابه نیاز دارید ارائه خواهم کرد. تا آن زمان از قدرت آژاکس لذت ببرید.

منابع

یاد بگیرید

  • مقاله اصلی.
  • Adaptive Path یکی از شرکت های پیشرو در زمینه طراحی رابط کاربری است. شما می توانید اطلاعات زیادی در مورد Ajax با مرور صفحات آنها بدست آورید. (developerWorks، اکتبر 2005) پنج راه را برای سریال سازی داده ها در برنامه های Ajax نشان می دهد. (O"Reilly Media, Inc.، فوریه 2006) ایده های برجسته شده در این مقاله و کل مجموعه را می گیرد و آنها (و خیلی بیشتر) را در قالبی نوآورانه و پیشرفته برای شما به ارمغان می آورد.
  • جاوا اسکریپت: راهنمای کاملنسخه چهارم (O"Reilly Media, Inc.، نوامبر 2001) یک منبع عالی برای جاوا اسکریپت و کار با صفحات وب پویا است.

بحث و گفتگو

  • Ajax.NET Professional یک وبلاگ عالی در مورد همه چیز Ajax است.
  • با شرکت در انجمن developerWorks بپیوندید.

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

من اولین بار در بهار امسال در مورد AJAX شنیدم. من بلافاصله به این فناوری علاقه مند شدم و همانطور که در چنین مواردی باید باشد، به دنبال مقالاتی رفتم که بتوانند به سؤالات من پاسخ دهند: "این چیست؟ چگونه کار می کند؟ و چه مزایایی دارد؟ به چه چیزی نیاز دارم؟ برای کار با AJAX بر روی سرور / مشتری نصب شود؟ چگونه می توانم از آن در سایت خود استفاده کنم؟". بعد از خوندن ده ها مقاله فقط برای دو سوال اول جواب گرفتم ولی جواب بقیه رو جایی پیدا نکردم. و تنها پس از خواندن چندین نشریه به زبان انگلیسی، سرانجام متوجه شدم که چه اتفاقی می افتد. این باعث شد که این مقاله را بنویسم.

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

در طول ارائه، اصطلاح "مرورگر" به معنای مرورگرها خواهد بود: Internet Explorer 5.0+، Safari 1.3 و 2.0+، Netscape 7+، Opera 8.5+، Mozilla Firefox (به علاوه به معنای این نسخه و جدیدتر است). اگر در مورد نسخه های دیگر صحبت کنیم، به طور جداگانه به این موضوع اشاره می شود "چیست؟ چگونه کار می کند و چه مزیت هایی دارد؟"

برای درک مزایای AJAX، باید بدانید که برنامه های کاربردی وب در حال حاضر چگونه کار می کنند. و آنها بر روی فناوری مشتری-سرور کار می کنند (شکل 1).

کاربر صفحه ای را در مرورگر باز می کند صفحه. صفحه دارای پیوندهایی است که به صفحات دیگر منتهی می شود. وقتی روی هر کدام از آنها کلیک می کنید، مرورگر درخواستی را ارسال می کند URLبه سروری که این پیوند به آن پیوند داده شده است. اگر در طبیعت هیچ سرور مرتبط با این پیوند وجود نداشته باشد (مثلاً هنگام تایپ URL در نوار آدرس، نام منبع را اشتباه نوشتید)، یا در اتصال به اینترنت مشکلاتی وجود داشته باشد، مرورگر صفحه مشابهی ایجاد می کند. به چیزی که در تصویر نشان داده شده است (در Opera اینگونه به نظر می رسد):

اگر سرور وجود داشته باشد، اما هیچ سندی در درخواست مشخص نشده باشد، خود سرور یک صفحه HTML با شرح خطا ایجاد می کند. به عنوان مثال، ممکن است خطای معروف 404 باشد (سند یافت نشد). یا اگر همه چیز درست باشد، سرور در پاسخ صفحه جدیدی را برمی گرداند. در هر صورت، یک صفحه جدید در مرورگر بارگذاری می شود. صفحه جدید،حتی اگر با قدیمی مقایسه شود، فقط چند کلمه در آن تغییر کرده است. یک نقطه ضعف قابل توجه این فناوری است. علاوه بر این، کار در حالت همزمان انجام می شود. یعنی بعد از اینکه مرورگر درخواستی را برای سرور ارسال کرد، انتظار پاسخ از آن را دارد و تا زمانی که پاسخ دریافت نشود کاری انجام نمی شود. و گاهی اوقات پاسخ، و بارگذاری یک صفحه جدید ممکن است خیلی طول بکشد. آنقدر طولانی که کاربر ممکن است منتظر بارگذاری صفحه نباشد و به سادگی آن را ببندد. بنابراین برنامه نویسان وب به ترفندهایی متوسل می شوند.

خواص:

فقط خواندنی onreadystatechange عملکرد

یک تابع فراخوانی را مشخص می کند که هر بار که تغییری رخ می دهد فراخوانی می شود. حالت آمادهویژگی. با وجود فراخوانی تابع، پارامترها را نمی توان به آن منتقل کرد. اما بیشتر در مورد آن در ادامه مثال.

فقط خواندنی حالت آماده عدد صحیح

وضعیت درخواست می تواند مقادیر را بگیرد:
  • 0 - نه بدون مقدار اولیه(تقدیم نشده)، روش باز کن()هنوز فراخوانی نشده است؛
  • هنوز تماس نگرفته است
  • 2 - لود شده(بارگذاری شده)، روش ارسال()فراخوانی شد و سرصفحه/وضعیت پاسخ (ویژگی وضعیت) اخذ شده؛
  • 3 - در ارتباط بودن(تعاملی)، داده هایی دریافت می شود که از طریق دارایی در دسترس است پاسخ متن;
  • 4 - تکمیل شد(تکمیل شد)، در پاسخ به درخواست، نه تنها تمامی هدرها و وضعیت دریافت شد، بلکه تمامی داده ها از سرور دریافت شد، پاسخ تکمیل شد.

فقط خواندنی پاسخ متن رشته

پاسخ سرور به صورت متن ساده فقط خواندن.

فقط خواندنی answerXML هدف - شی

پاسخ سرور به عنوان یک شی سند DOM. اگر پاسخ سرور یک سند XML معتبر باشد استفاده می شود. اگر سند معتبر نیست، داده دریافت نشده است یا هنوز ارسال نشده است، ویژگی NULL است. فقط خواندن.

فقط خواندنی وضعیت رشته

وضعیت پاسخگویی به عنوان مثال: 200 (OK)، 404 (سند یافت نشد)، 503 (سرور اضافه بار موقت).

مواد و روش ها:

خالی سقط جنین ()

درخواست HTTP را خاتمه دهید یا داده دریافت کنید. تمام ویژگی های شی را که روی مقادیر اولیه آنها تنظیم شده اند پاک می کند. این روش در ارتباط با یک تایمر مفید است، زمانی که پس از گذشت زمان معینی از درخواست (خروج در بازه زمانی)، پاسخی از سرور دریافت نشده است.

رشته getAllResponseHeaders()

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

رشته getResponseHeader(رشتهسرتیتر)

یک هدر به نام header را برگردانید.

خالی باز کن(رشتهروش، رشتهاوری، [ بولیناهمگام])

درخواستی را برای uri با استفاده از روش متد (POST یا GET) آماده می کند که حالت ناهمگام را مشخص می کند، حالت ناهمزمان یا نه. در نتیجه تماس ملک حالت آمادهبرابر 1 شود.

خالی ارسال(رشتهداده ها)

درخواستی را به سرور آغاز می کند. درخواست داده های داده را ارسال می کند.

خالی setheader(رشتهسرتیتر، رشتهمقدار)

هدر با نام header را روی مقدار مقدار تنظیم می کند. قبل از استفاده از این روش، به یاد داشته باشید که تماس بگیرید باز کن()!
"چگونه می توانید از آن در سایت خود استفاده کنید؟"

اکنون که ما نه تنها دانش نظری لازم را داریم، بلکه ایده ای در مورد آنچه AJAX عملاً بر آن تکیه می کند نیز داریم، می توانیم شروع به نوشتن برنامه خود کنیم. در مرحله بعد، من یک مثال از لحظه فرمول بندی مشکل تا اجرای کامل آن، در قالب یک برنامه کاربردی، ارائه می کنم و برخی از ظرافت های موجود در این مسیر را توضیح می دهم.

بنابراین، ما یک وظیفه داریم: ما باید یک پایگاه داده (DB) از درایورها را برای دستگاه های مختلف پیاده سازی کنیم. در عین حال، پایگاه داده آنقدر بزرگ است که ارسال آن به برنامه مشتری و انتخاب از آن با استفاده از جاوا اسکریپت بی معنی است. به دلیل تغییر در یک مقدار در صفحه، بارگذاری بیش از حد آن نیز نامطلوب است. من شخصاً از PHP برای اسکریپت های سرور برای پیاده سازی این کار استفاده می کنم و از یک فایل XML برای پیاده سازی پایگاه داده استفاده می کنم.

من ساختار پایگاه داده زیر را انتخاب می کنم:

لیست فایل DB data.xml: ATI 9600 128 DDR (128bit) ATI 9600 256 DDR (128bit) ATI 9600XT 256 DDR (128bit) ATI X800GTO 256 DDR (256 بیت) ATI X1300 528bit NDR6201 DDR (256 بیت) ATI X1300Pro 256 DDR (128 بیت) ATI X1600Pro 256 DDR (128 بیت) ATI X1800GTO 256 DDR (256 بیت) ATI X1600Pro 256 DDR (128 بیت) ATI X160Bit (128 بیت) ATI X1510bit ATI X1900XT 512 DDR (256bit) ATI X1900XTX 512 DDR (256bit) ATI X800 Silentpipe 128 DDR (256bit) NVIDIA 6600GT 128 DDR (128bit) NVIDIA 6600GT PCI-A28Dink1 Passiveheats1 X550 128 DDR (128bit) PCI-ATI X800GT UniWise 256 DDR ( 256 بیتی) ATI X800GTO 256 DDR (128 بیتی) Audigy 2 6.1 Audigy 2 ZS 7.1 X-Fi Platinum Audiophile 192 Revolution 5.1 Audiophile Audiophile Fast Track PIXMA iP 90 PIXMA iP4200 PIXMA iP4200 PIXMA iP4200 PIXMA iP4200 رنگی St4010 رنگی kJet 5443 Photo Smart 385 Laser Shot LBP2900 Laser Shot LBP3300 ML 1615 ML 2015 LaserJet 1018 LaserJet 2420 LaserJet 2420DN 4200F LiDE500F LiDE500F LiDE270Fection Perfection2900F

چگونه یک شخص در این پایگاه داده جستجو می کند؟ به احتمال زیاد، او از عنصر ریشه از طریق درخت سند عبور می کند تا زمانی که پیوندی را در شاخه مورد نیاز پیدا کند یا مطمئن شود که درایور این دستگاه در پایگاه داده نیست. ما نیز همین کار را انجام می دهیم و از عبارات زبان XPath برای یافتن گره یا مجموعه ای از گره های مورد نظر استفاده می کنیم.

فهرست فرم برای ارسال داده ها index.htm:

اسکنر چاپگر کارت صدا کارت گرافیک

فرم دارای دو متغیر است: مسیرو پرچم. اولی مسیر درخواستی را ذخیره می کند که به سرور ارسال می شود. از آنجایی که قبلاً یک عنصر در فرم وجود دارد، این متغیر از قبل دارای یک مقدار اولیه است. متغیر دوم برای نشان دادن اینکه یک عنصر خاص باید از سند استخراج شود به اسکریپت سرور استفاده می شود. دستگاه. علاوه بر این، فرمت داده های برگشتی از سرور تغییر خواهد کرد.

حالا بیایید به موتور JS نگاه کنیم. تمام توابع سمت کلاینت در یک اسکریپت جمع آوری می شوند ajax.js: y = New Object(); تابع httpRequest() (اگر (window.XMLHttpRequest) (//ایجاد یک شی برای همه مرورگرها به جز IE requestObj = new XMLHttpRequest(); ) در غیر این صورت اگر (window.ActiveXObject) (//برای IE requestObj = new ActiveXObject("Msxml2. XMLHTTP ")؛ if (!requestObj) ( requestObj = new ActiveXObject("Microsoft.XMLHTTP"); ); ); ); تابع sendRequest (url,data) (httpRequest(); //تعریف تابع فراخوانی requestObj.onreadystatechange = answerServer؛ //آماده شدن برای ارسال داده، readyState=1 requestObj.open("POST",url,true)؛/ * T از آنجایی که داده ها با روش POST ارسال می شوند، سرور باید یک هدر ارسال کند که به آن اطلاع دهد */ requestObj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-" 8")؛ // ارسال داده به سرور requestObj.send(data); ); تابع answerServer() ( if (requestObj.readyState == 4) ( var status = requestObj.status; if (status == 200) ( addSelect(y); ) other if (وضعیت == 400) ( هشدار ("درخواست بد "); ) else if (وضعیت == 500) ( هشدار ("خطای سرور داخلی")؛ ) other if (وضعیت == 503) ( var time = requestObj.getResponseHeader("Retry-After")*1000; هشدار ( "سرور بیش از حد بارگیری شده است. درخواست در عرض: "+time+" ثانیه"؛ setTimeout(sendRequest(url، مسیر)، time)؛ ) else (هشدار ("Error Response Server"); )؛ ) تکرار می شود. ; تابع sendData(obj) ( var Elpath = document.form.path؛ var url = "index.php"؛ if (document.form.flag.value == "0") ( var path = Elpath.value + "/" + obj.value; ) else ( var path = Elpath.value + "/Device["" + obj.value + ""]"؛ /* با استفاده از روش GET اطلاعاتی را به اسکریپت سرور ارسال می کنیم که عنصر دستگاه خاص است. مورد نیاز است */ url = "index.php?flag=1"; )؛ // متغیر فرم مسیر را به مقدار درخواست فعلی تنظیم کنید Elpath.value = مسیر؛ // رمزگذاری مسیر مسیر رشته پاس شده = "path= "+encodeURIcomponent(path); y = obj؛ sendRequest (url, path); ); تابع addSelect(obj) (//پاسخ سرور در متن ساده var docTEXT = requestObj.responseText؛ obj.setAttribute("disabled",true); //create div element var div = document.createElement("div"); // افزودن پاسخ سرور به div div.innerHTML = docTEXT;//افزودن پاسخ سرور div به درخت سند document.form.appendChild(div); ); تابع reset() ( document.form.path.value="(!LANG://Devices"; document.form.flag.value="0"; var NodeListDiv = document.form.getElementsByTagName("div"); var length = NodeListDiv.length; if (length > 1) { while (NodeListDiv != undefined) { document.form.removeChild(NodeListDiv); }; }; document.form.Devices.removeAttribute("disabled"); };!}

همانطور که گفتم در تابع ویژگی onreadystatechangeپارامترها قابل عبور نیستند. به طور دقیق تر، شما نمی توانید پارامترهایی را که اشیاء هستند ارسال کنید. بنابراین، در همان ابتدا یک متغیر ایجاد می کنیم که در آن یک مرجع به شی ای که تابع را فراخوانی می کند ذخیره می کنیم. از آنجایی که این متغیر در محدوده متغیر جهانی قرار دارد، از هر بخشی از برنامه قابل دسترسی است. این تا حد زیادی هوشمندانه ترین راه برای ارسال پارامترهای برگشت به یک تابع ویژگی است. onreadystatechangeهدف - شی.

و اکنون عملکرد موتور را مرحله به مرحله تجزیه و تحلیل خواهیم کرد.

زمانی که یک رویداد رخ می دهد روشن شدن(عنصر انتخاب کنیداز دست رفته تمرکز) تابع فراخوانی می شود sendData()،که داده های POST را برای ارسال درخواست آماده می کند. علاوه بر این، بسته به مقدار متغیر، یک عبارت XPath تولید می کند. پرچم = 0(مثلا، //دستگاه ها/کارت های ویدئویی) یا پرچم=1(مثلا، //Devices/VideoCards/AGP/Sapphire/Device["ATI 9600XT 256 DDR (128bit)"]).

سپس تابع را فراخوانی می کنیم فرستادن درخواست()،که URL اسکریپت سرور و همچنین متغیری از نوع رشته که حاوی داده های آماده POST است را به آن منتقل می کنیم. و ابتدا ایجاد می کنیم XMLHttpRequestشیئی که مرجع آن در یک متغیر ذخیره می شود درخواست Obj. عملکرد httpRequest()متقابل مرورگر است و در همه مرورگرها کار می کند.

یک بار فراخوانی تابع httpRequest()من بلافاصله هنگام بارگذاری صفحه انجام دادم و ایجاد نکرد XMLHttpRequestیک شی اما همانطور که مشخص شد، این برای همه مرورگرها کار می کند به جز IE که هر بار نیاز به ایجاد یک شی جدید دارد. بنابراین، هر بار قبل از ارسال داده، با این تابع تماس گرفته می شود.

پس از ارسال داده ها، مرورگر منتظر پاسخ سرور می ماند. هر بار که ملک تغییر می کند حالت آمادهتابع فراخوانی خواهد شد پاسخ سرور(). اگر وضعیت پاسخ با کد "200" باشد (همه چیز خوب است)، تابع فراخوانی می شود addSelect()،که داده های دریافتی را به DOM سند جاری اضافه می کند. همه مرورگرها منتظر پاسخ سرور خواهند بود. اما پس از مدتی (تایم اوت) به زور تعیین تکلیف می کنند XMLHttpRequest.readyState = 4و منتظر پاسخ از طرف سرور نباشید. به عنوان مثال، برای Opera، مقدار تایم اوت 10 ثانیه است. با استفاده از وضعیت های دیگر، می توانید یک کنترل کننده خطا را در پاسخ های سرور به موتور اضافه کنید.

عملکرد addSelect()گره دیگری را به DOM سند جاری اضافه می کند دیو،که در آن پاسخ سرور را قرار می دهد. ممکن است تعجب کنید که چرا از این ملک استفاده می شود پاسخ متن، اما نه answerXML? کسی قطعاً می خواهد از این ویژگی برای وارد کردن پاسخ سرور (و اسکریپت سرور در پاسخ یک سند XML ارسال می کند) به طور مستقیم به DOM سند استفاده کند. من هم همین آرزو را داشتم. من می‌خواستم عنصر ریشه فایل XML ارسالی و همه فرزندان آن را با استفاده از روش وارد کنم importNode. اما مرورگر عنصر را بدون فرزند وارد کرد، حتی اگر پارامتر دوم این روش روی تنظیم شده بود درست است، واقعی: importNode(Object importedNode,true). بنابراین اجرای نادقیق این روش فعلاً مانع استفاده از آن می شود.

یک راه حل معادل با استفاده از آن پیدا شد innerHTMLروش عنصر

این کار سمت مشتری را کامل می کند. ویژگی بازبینی نشده باقیمانده تنظیم مجدد ()برای بازگرداندن DOM سند به شکل اصلی طراحی شده است. شما می توانید با رفرش کردن صفحه با F5 به همین هدف برسید، اما موتور AJAX فقط برای جلوگیری از بارگذاری مجدد صفحه نوشته شده است. بنابراین، تمام عناصر اضافه شده به سند توسط اسکریپت نیز باید توسط اسکریپت از آن حذف شود.

در پاسخ به درخواست، اسکریپت سرور داده های XML از فرم را تولید می کند: ChildrenElementName_1 .... childrenElementName_1

اگر گره درخواستی نامگذاری شده باشد دستگاه، متن قالب بندی شده عادی برگردانده می شود. اسکریپت سرور با PHP V5 نوشته شده است و روی نسخه های قبلی این مفسر کار نخواهد کرد، زیرا پسوند DOM تنها از نسخه پنجم به این زبان معرفی شد و جایگزین پسوند DOM XML شد که رابط آن با مشخصات مطابقت نداشت. حالا بیایید به کد اسکریپت سرور نگاه کنیم.

لیست فایل index.php :load("data.xml"); //یک شی XPath ایجاد کنید $DOMXPath = جدید DOMXPath($doc); $DOMNodeList = $DOMXPath -> query($_POST); //طبق درخواست، عنصر مورد نظر را استخراج می کنیم $DOMNode = $DOMNodeList -> item(0); //ایجاد یک شی سند XML $replyXML = new DOMDocument("1.0", "windows-1251"); /* اگر پرچم برابر با یک نباشد، عنصر فعلی یک عنصر Device نیست و لازم است که تمام عناصر فرعی عنصر فعلی DOMNode */ را پیدا کنید اگر ($_GET != 1) ( //دریافت لیستی از همه نوادگان عنصر $childNodes = $DOMNode -> childNodes؛ /* از آنجایی که فرزندان می توانند نه تنها عناصر، بلکه گره نیز باشند، یک آرایه شاخص ایجاد می کنیم که فقط شامل عناصر فرزند */ foreach ($childNodes به عنوان $Node) است (اگر ($Node->nodeType == 1) ($ arrayNodes = $Node; )؛ //ایجاد عنصر ریشه سند XML $root = $replyXML->createElement("select")؛ $optgroup = $replyXML ->createElement("optgroup")؛ /* اگر عناصر-فرزندان Device نباشند، سپس برای عنصر ریشه و عنصر فرزند آن optgroup */ if ($arrayNodes -> nodeName != "Device") ویژگی‌هایی تنظیم می‌کنیم ($root) ->setAttribute("name",$DOMNode->nodeName)؛ $AttributeNode = $arrayNodes->getAttributeNode("title")؛ $optgroup->setAttribute("label",$AttributeNode->value)؛ $root-> setAttribute("onblur", "sendData(this) ")؛ ) else ( /* در غیر این صورت، یک ویژگی با کد JS ایجاد کنید که متغیر را در فرم پرچم روی "1" تنظیم می کند */ $root->setAttribute("onblur", "document.form.flag.value=1;sendData" (این );")); /* حلقه ایجاد عناصر گزینه جدید برای هر عنصر فرزند. چند فرزند، چند عنصر */ foreach ($arrayNodes به عنوان $Node) ($option = $replyXML->createElement("option")؛ $setNode = $Node->nodeName؛ اگر ($Node->nodeName == "دستگاه") ($setNode = $Node->nodeValue؛ ؛ $option-> nodeValue = $setNode؛ $option->setAttribute("value",$setNode)؛ $optgroup->appendChild($option)؛ ) ; //عناصر به دست آمده را در سند XML قرار دهید $replyXML->appendChild($root); $root->appendChild($optgroup); /* اگر flag=1 باشد، عنصر فعلی یک عنصر Device است. عناصر نسل مورد نیاز نیستند، اما ویژگی های عنصر فعلی مورد نیاز است */ ) در غیر این صورت ( //ایجاد عنصر ریشه $root = $replyXML->createElement("pre"); $DOMText = DOMText جدید (" URL OS") ؛ $root - > appendChild($DOMText)؛ $NamedNodeMapAttr = $DOMNode-> ویژگی‌ها؛ $i = 0؛ /* حلقه‌ای که تمام ویژگی‌های عنصر Device را پیدا می‌کند و برای هر ویژگی یک رشته با داده‌های مرجع */ ایجاد می‌کند. (($NodeAttr = $NamedNodeMapAttr -> آیتم($i)) ! = null) ( if ($NodeAttr->name != "id") ($DOMText = new DOMText(" $NodeAttr->name ")؛ $DOMElement = $replyXML->createElement("a")؛ $DOMElement - > setAttribute("href",$NodeAttr->value)؛ $DOMElement -> nodeValue = $NodeAttr->value؛ $root -> appendChild($DOMText)؛ $root -> appendChild($DOMElement); )؛ $i++ $NodeAttr = $NamedNodeMapAttr->item($i); ); $replyXML->appendChild($root); ) //ارسال پاسخ به کلاینت echo $replyXML->saveHTML(); ?>

برترین مقالات مرتبط