مثال ساده و کاربردی از تکنولوژی AJAX و مشکل cach با این تکنولوژی...

NabiKAZ

Well-Known Member
فکر میکنم برنامه زیر ساده ترین شکل ممکن برای نشون دادن طرز کار تکنولوژی آژاکس است. که امیدوارم دوستان استفاده کنند.

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

PHP:
<?php
if(isset($_GET['subreq'])) {
    echo date('l dS \of F Y h:i:s A');
    exit(0);
}
?>
<script>
function ajax_do( thisurl , thisid){
    var xmlhttp=false;

 /*@cc_on @*/
/*@if (@_jscript_version >= 5)
try {
xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');
} catch (e) {
try { xmlhttp = new ActiveXObject('Microsoft.XMLHTTP'); } 
catch (E) 
{ xmlhttp = false; }
}
@end @*/


    if(!xmlhttp) { xmlhttp=new XMLHttpRequest(); }
    xmlhttp.open('GET','index.php?subreq='+thisurl, true);
    xmlhttp.onreadystatechange = function() {
        if(xmlhttp.readyState==4) { document.getElementById(thisid).innerHTML = xmlhttp.responseText; }
    }
    xmlhttp.send(null);
}
</script>

<img src=/icons/a.png onClick="javascript:ajax_do( '<?=$_SERVER['PHP_SELF']?>' , 'output_div');">
<div id='output_div'>click image above to put date here</div>


لطفا راهنمایی کنید.
باتشکر
نبی
 

Ali_Farhadi

Member
با سلام

برای رفع مشکل کش شدن بهترین و راحت ترین راه حل اینه که به انتهای url های آژاکسی یک پارامتر راندوم اضافه کنید.
مثلا به انتهای هر url زمان رو بر حسب timestamp اضافه کنید. مثال :
کد:
xmlhttp.open('GET','index.php?subreq='+thisurl+'&r='+(new Date().getTime()), true);

اما راه حل دیگه اینه که با استفاده از دستور header جلوی کش شدن رو بگیرید.
کد:
// already expired
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

// always modified
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
	
// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Cache-Control: max-age=0", false);
	
// HTTP/1.0
header("Pragma: no-cache");

// Setting Etag each time a unique value
header('Etag: '.time());

ضمنا جناب mehdivirus لطفا حتی المکان لینک ندهید و عین مطلب رو (در صورت لزوم با ذکر منبع) بنویسید.
چون سایتها همیشه در حال تغییرند و لینکها ممکنه پایدار نباشند.

حداقل اگر میخواهید لینک بدهید به خود مطلب لینک بدهید نه صفحه اول سایت !!!
من هم میتونستم به صفحه اول گوگل لینک بدم ;)
 

NabiKAZ

Well-Known Member
mehdvirus گفت:

سایت خوبی بود.
ولی تازه استارت خورده بود و مطالبش بسیار محدود بود!


Ali_Farhadi گفت:
با سلام
برای رفع مشکل کش شدن بهترین و راحت ترین راه حل اینه که به انتهای url های آژاکسی یک پارامتر راندوم اضافه کنید.
مثلا به انتهای هر url زمان رو بر حسب timestamp اضافه کنید. مثال :
:
:

روش اول جالب بود به خوبی کار کرد.
اما روش دوم در مورد header کار نکرد ! یعنی هیچکدومش!


هادی ابراهیمی گفت:
ببخشید دوستان منبعی برای اختلاف ajax و php یا بهتر بگم آموزش ajax میشناسید
این مقایسه اصلا اشتباه است !
ajax تنها امکانی رو فراهم اورده که یک url در بخشی از صفحه که id خاصی دارد نمایش داده شود.
سورسی هم که در بالا گذاشتم سر نخ بسیار خوبی است و مابقی به خلاقیت خودتون در برنامه بنویسی برمیگرده.

شاید این مثال هم جالب باشد:



html file:
HTML:
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<script>
function ajax_do( thisurl , thisid){
    var xmlhttp=false;

 /*@cc_on @*/
/*@if (@_jscript_version >= 5)
try {
xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');
} catch (e) {
try { xmlhttp = new ActiveXObject('Microsoft.XMLHTTP'); } 
catch (E) 
{ xmlhttp = false; }
}
@end @*/

    if(!xmlhttp) { xmlhttp=new XMLHttpRequest(); }
    xmlhttp.open('GET',thisurl, true);
    xmlhttp.onreadystatechange = function() {
        if(xmlhttp.readyState==4) { 
        document.getElementById(thisid).innerHTML = xmlhttp.responseText; 
        }
    }
    xmlhttp.send(null);
}
 function checkname(thisidshow){
 find_name = encodeURIComponent(document.getElementById("name").value);
 ajax_do('myphpfile.php?name='+find_name , thisidshow);
 }

</script>

</head>

<body>
<div id="show_data"></div>

<table border="0" width="400" cellspacing="0" cellpadding="0" dir="rtl" class="login_form" id="table1">
<tr>
        <td>نام</td>
        <td width="46%">
<INPUT size=30 name="name" id="name" dir="ltr" >
</td>
        <td width="16%">
        <input type="submit" value="چک کردن" name="sub" onClick="checkname('show_data'); return false;"></td>
       </tr>
      </table>

</body>

</html>

php file:
PHP:
<?
$thisname = addslashes(trim(htmlspecialchars(urldecode (@$_GET['name']))));
  if( $thisname =="nabi"){
  print'<b>your name is true '.$thisname.'</b>';
  }else{
  print'false'.$thisname.'';
  }
?>

منبع سایت: http://www.gavbandy.blogfa.com
 
آخرین ویرایش:

mosi20

Active Member
چقدر این سورس بالا آشناست فکر میکنم خودم نوشته باشمش.
http://www.gavbandy.blogfa.com
لطفا منبع را ذکر کن
اگه اینجوری مطالب وبلاگم به سرقت بره بقیه ی چیزایی که میدونم را شاید ننویسمشون.
 

NabiKAZ

Well-Known Member
mosi20 گفت:
چقدر این سورس بالا آشناست فکر میکنم خودم نوشته باشمش.
http://www.gavbandy.blogfa.com
لطفا منبع را ذکر کن
اگه اینجوری مطالب وبلاگم به سرقت بره بقیه ی چیزایی که میدونم را شاید ننویسمشون.

سلام
درسته! حق با شماست! مطالب رو از وبلاگ شما برداشتم ، قصد سرقت نداشتم ! (دزد خودتی!!!)
ضمنا ممنون میشم شما لطف بفرمائید و توضیح بدید که اینها چین؟! :
http://php.techie-blogs.com/content/idx.php?option=ajax
http://www.techie-blogs.com/smallestajax/view-index.php
شاید اونها هم از وب لاگ شما سرقت کرده باشند!!! البته مطمئن نیستم که مدیر اون سایت فارسی بلد باشه !!!
منتظر توضیحتون هستم !
 

mosi20

Active Member
اگه دقت کرده باشی من در مورد این پست آخرت این حرف را زدم نه در مورد پست های قبلش.
وگرنه زودتر از اینها این حرف را میزدم.
در ضمن دارم یه سایت برپایه ی آژاکس طراحی میکنم تا 10 مرداد تموم میشه اونو بیا ببین تا متوجه بشی آژاکس یعنی چی؟؟؟
این هم آدرس اون سایت http://www.parsibox.com 10 مرداد منتظر باش
 
آخرین ویرایش:

NabiKAZ

Well-Known Member
mosi20 گفت:
اگه دقت کرده باشی من در مورد این پست آخرت این حرف را زدم نه در مورد پست های قبلش.
وگرنه زودتر از اینها این حرف را میزدم.
پس قبول دارید؟!
اتفاقا منم منظورم پست اولم بود ! اما نه در مورد خودم ! بلکه در مورد خودتون !
منظورم اینه که قبول کردید سورس اول از خودتون نبوده . شما که خودتون تو وب لاگتون منبع رو ذکر نکردید چطور انتظار دارید دیگران ذکر کنند.
ضمنا در مورد سورس دوم هم خیلی مطمئن نیستم کار خودتون باشه ، گر چه اگرم باشه ، خیلی شاهکار نیست ، من خودم قبل از اینکه تو وب لاگتون این رو بنویسید این متد رو تو سایتم پیاده کردم ...

mosi20 گفت:
در ضمن دارم یه سایت برپایه ی آژاکس طراحی میکنم تا 10 مرداد تموم میشه اونو بیا ببین تا متوجه بشی آژاکس یعنی چی؟؟؟
این هم آدرس اون سایت http://www.parsibox.com 10 مرداد منتظر باش
چرا باید در انتظار سایتتون باشم ؟! که متوجه بشم که آژاکس یعنی چی؟! مگه من ادعایی کردم ؟! این شمایید که آموزش طراحی وب به صورت حرفه ای میدید !!!
راستی یه چیزی رک میگم ناراحت نشید.
نوشته های ابتدایی و قبلی وب لاگتون رو که خوندم نظرم در موردتون عوض شد...منظورم در مورد حرفه ای بودن بود...

موفق باشید
نبی
 
آخرین ویرایش:

NabiKAZ

Well-Known Member
جناب mosi20 بایدم سکوت کنید !!! چون جوابی ندارید !

ضمنا 10 مرداد گذشت، هیچ اتفاقی هم نیافتاد !
 

جدیدترین ارسال ها

بالا