2013-03-07 5 views
1

У меня есть эта функция javascript, которая служит для запроса AJAX для внешнего скрипта PHP, я хочу, чтобы это автоматически обновляло HTML <div>, если новая проверка отличается от старой проверки.Auto Refresh JS Array при изменении содержимого?

<script> 
window.setInterval(function() 
{ 
    $(function() 
    { 
    $.ajax({          
     url: 'api.php', data: "", dataType: 'json', success: function(rows)   
     { 
      for (var i in rows) 
      { 
       var row = rows[i];   
       var id = row[0]; 
       var vname = row[1]; 
       var Password = row[2] 
       $('#output').append("<hr />").append("<b>id: </b>"+id+"<b> name: </b>"+vname+" <b>Password: </b>"+Password); 
      } 
     } 
    });  
    }); 
}, 5000); 
    </script> 

В настоящее время это успешно возвращает и обновляет DIV с содержимым из массива, проблема, так как добавление window.setInterval(function() строки, он будет сервером соединения каждые 5 секунд и обновить <div> с дублированием данных .. когда все, что я хочу, это для того, чтобы повторить новые данные (если есть пу)

Вот мой другой PHP скрипт:

$STD = new mysqli ("localhost", "root", "hidden", "ajaxrequests"); 

     $array = array(); 
    $Query = $STD->prepare ("SELECT * FROM ajaxdata"); 
    $Query->execute(); 
    $Query->bind_result($ID, $Name, $Password); 

    while ($Query->fetch()) 
    { 
     $array[] = array ($ID, $Name, $Password); 
    } 

    echo json_encode($array); 
+0

Зачем использовать append вместо написания всего вывода? Кроме того, если вы хотите работать с самой строкой JSON и предполагать, что строка JSON не слишком велика, возможно, вы просто сохраните последнюю строку переменной, сравните ее с входящей строкой и ничего не сделаете, если они совпадут. Если они не совпадают, перезапишите весь элемент DOM новыми данными. –

+0

@MikeBrant Не могли бы вы привести пример? – user2146021

+0

@MikeBrant Кроме того, поскольку он настроен, он уже отправляет запросы каждые 5 секунд и сохраняет ответ. Почему бы просто не заменить контент с каждым запросом? Сравнение возвращаемого содержимого и текущего содержимого займет больше времени, чем просто обновление DOM независимо (поскольку кеш браузера очень эффективен). Если ваш ответ действительно большой, вы можете захотеть хэшировать его на стороне сервера и сравнить только хэширование браузера, чтобы проверить наличие обновлений. –

ответ

0

Просто добавьте вызов empty() до вашего цикла.

<script> 
window.setInterval(function() 
{ 
    $(function() 
    { 
    $.ajax({          
     url: 'api.php', data: "", dataType: 'json', success: function(rows)   
     { 
      $('#output').empty(); 
      for (var i in rows) 
      { 
       var row = rows[i];   
       var id = row[0]; 
       var vname = row[1]; 
       var Password = row[2] 
       $('#output').append("<hr />").append("<b>id: </b>"+id+"<b> name: </b>"+vname+" <b>Password: </b>"+Password); 
      } 
     } 
    });  
    }); 
}, 5000); 
</script> 

Конечно, если ваш размер данных большой, это будет не очень оптимальным. Я бы предположил, что сервер PHP отправит значение timestamp с его ответом. Затем вы можете передать это обратно в последующих запросах AJAX и определить сервер, действительно ли есть обновления для доставки с этой последней метки времени. Затем вы можете отправить сервер только эти обновленные записи, которые вы могли бы добавить/обновить, подобно тому, как вы это делаете.

+0

Я бы добавил +1, но у меня нет 15 ре. Но я буду принимать это как ответ, когда таймер вверх. Спасибо за ответ, и я не прошу примера. Но как я повлиял, есть ли более простой способ разобраться в этом? просто простой ответ «да» или «нет» будет заниматься серфингом – user2146021

+0

@ user2146021 Как и во всем мире программирования, лучший подход часто используется для вашего прецедента. Если бы я имел дело с большими наборами данных, я бы, конечно, не хотел бы передавать полный набор данных каждые 5 секунд, а затем попросить браузер клиента обновить его полностью. Я бы посмотрел, как передавать только инкрементные изменения данных между сервером и клиентом. Ваш нынешний подход прост и может удовлетворить ваши потребности в обозримом будущем. Только вы можете решить, стоит ли вам пытаться реализовать более оптимизированный подход. –

+0

Большое спасибо за ваше время! благодаря! – user2146021