• 0

كيف أحدّث جزء معين من الصفحة باستعمال ajax/json؟

لدي موقع سبق وأن عملت عليه منذ فترة، ويتوفر الموقع على خاصية المحادثة الفورية، وأريد إظهار المستخدمين المتصلين حاليا، لكن يحدث خطأ مع دالة append، حيث تُضاف البيانات إلى الصفحة عدة مرات، وهذا كود php الخاص بالصفحة:

<?php
public function online(){
    $database = new DB();
    $db = $database->database();
    $array = array();
    $ref = $_SESSION['oc_users_ref'];

    $time_out = time()-5;
    $time = time();

    $query = $db->query("SELECT * FROM oc_users WHERE users_online = 0");

    $updateOnline = $db->query("UPDATE oc_users SET users_online = 1 WHERE users_lastcome < '$time_out'");

    $q = $db->query("SELECT * FROM oc_users WHERE users_ref <> '$ref' AND users_online = 0 ORDER BY users_lastcome DESC");

     while($data = $q->fetch()) {
        if($data['users_online'] == 1){
            $class = "opacity30";
        }else{
            $class = '';
        }
        $array[] = $data;
     }
     print json_encode($array);
} ?>

كود Javascript:

function getOnline(){
	$.ajax({
		url: "conf/users.php?act=online",
		dataType: "text",
		success: function(data) {
			var json = $.parseJSON(data);
			for (var i=0;i<json.length;++i)
			{
				$('#printOnline').append('<li><a href="javascript:void(0);" onclick=javascript:chatWith("'+json[i].users_nickname+'")><i></i>'+json[i].users_nickname+'</a></li>');
			}
		}
	});
}
setInterval('getOnline()',10000);

أين يكمُن المشكل؟ وكيف أستطيع حلّه؟

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0

من الطبيعي حدوث ذلك، لأنك لم تعمل reset لقائمة المتصلين حالياً قبل الإقدام على التحديث، ونفعل ذلك بهذه الطريقة:

function getOnline(){
    $.ajax({
        url: "conf/users.php?act=online",
        dataType: "text",
        success: function(data) {
            $('#printOnline').html("");
            var json = $.parseJSON(data);
            for (var i=0;i<json.length;++i)
            {
                $('#printOnline').append('<li><a href="javascript:void(0);" onclick=javascript:chatWith("'+json[i].users_nickname+'")><i></i>'+json[i].users_nickname+'</a></li>');
            }
        }
    });
}
setInterval('getOnline()',10000);

     شرح ما حدث: ينبغي دائما في القوائم والبيانات التي تُحدّث بشكل تلقائي أن نمسح البيانات السابقة قبل عملية التحديث وذلك حتى لا تتراكم البيانات الجديدة والقديمة، لتظهر الجديدة فقط، فلا يعقل أن نرى مستخدم مكرر مرتين أو أكثر لأنه مع مرور الوقت سيظهر جميع المتصلين بشكل متكرر، وهذا ما لا نريده طبعا، إذن وجب مسح القائمة ثم إعادة توليدها عبر عملية التحديث.

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن