2013-07-19 75 views
0

如何檢查DOM中的值是否有變化?我正在調用Ajax函數從數據庫中提取一些數據。如果新值被推動,我想眨眼或做一些動畫那個特定的DIV。所以當「可用性」變化時,動畫只會一次。僅限於價值發生變化的DIV。檢查並比較新值,並根據該值進行動畫

這裏是我的代碼:

//function the get data from database 
function getRealData() { 
    $.ajax({ 
     url: 'test_api.php', 
     data: "", 
     dataType: 'json', 
     success: function (rows) { 

      var text = ''; 

      for (var i in rows) { 

       var row = rows[i]; 

       var availability = row[3]; 
       var hostName = row[2]; 
       var intranet = row[6]; 
       var timeRespons = row[4]; 


       //console.log(availability); 

       if (availability == 0){ 
        var img = "img/tick.png"; 

       } 

       if (availability == 1){ 
        var img = "img/warning.png"; 
       } 

       if (availability == 2){ 
        var img = "img/alert.png"; 
       } 

       text+= '<section class="square"><h3> ' + intranet + '</h3><img src='+img+' width="70" height="70" rel='+availability+' alt="warning"/><h4><img src="img/time_icon.png" width="20" height="20" alt="clock" class="clock" /> '+ timeRespons+'</h4>'; 
        text += '</section>'; 



       } 
      $("#journey").html(text); 


     } 
    }); 
} 

//this refreshes data every 2seconds 
setInterval(getRealData, 2000); 

//call the function to display data 
getRealData(); 

非常感謝您的幫助!

EDIT

輸出爲:

<div id="journey"> 
    <div class="square>availability: 0 hostName: aaa intranet: ttt timeResponse:0.124</div> 
    <div class="square>availability: 0 hostName: qqq intranet: hhh timeResponse:0.064</div> 
    <div class="square>availability: 0 hostName: www intranet: nnn timeResponse:0.303</div> 
    <div class="square>availability: 0 hostName: rrr intranet: rrr timeResponse:0.019</div> 
    <div class="square>availability: 0 hostName: eee intranet: uuu timeResponse:0.025</div> 
    <div class="square>availability: 0 hostName: ggg intranet: ooo timeResponse:0.158</div> 
</div> 
+0

是'#journey'應該動畫的div嗎? – user1

+0

您是否每次通過數據庫調用都具有相同數量的部分?另外,是intranet字段唯一的名稱段? – James

+0

是#journey是應該做動畫的div – medzi

回答

0

一個簡單的解決辦法是保持一個變量包含當前文本之外的功能,然後寫入該每次您getRealData()函數被調用。例如:

var currentText; 
function getRealData() { 
    $.ajax({ 
    url: "...", data: "...", dataType: "...", 
    success: function(rows){ 
     var text = '' 
     // Process text variable accordingly, as you have 
     if (text != currentText){ 
     $("#journey").html(text).performBlinkEvent(); 
     currentText = text; 
     } 
    } 
    }); 
} 

的performBlinkEvent功能可以與搜索可以容易地發現,例如this是一個交該捲起。

編輯:另一種選擇是通過成功的所有<section class="square">元素進行迭代,寫作上的成功每個元素而不是包含#journey類全:

function (rows) { 
    // Get all squares and iterate over each 
    var squares = $("#journey > .square").each(function(i) { 
    var row = rows[i]; 
    var availability = row[3]; 
    var hostName = row[2]; 
    var intranet = row[6]; 
    var timeRespons = row[4]; 
    // construct img var based on availabiliy 

    var text = ... // Construct content of <section class="square"> 

    if ($(this).text() != text){ 
     $(this).html(text).performBlink(); 
    } 

    }); 
} 

這是假設部分是已經在頁面上,我認爲這是一個合理的假設。它還假設您收到的行與頁面中的章節數之間存在1對1的對應關係。如果不是這樣(即每個響應的平方數會改變),則需要進一步的邏輯。

這是第二個代碼片段的JSFiddle。我用數據填充了幾個元素,然後創建一個包含舊數據和一些新數據的示例響應。該功能將成功確定需要插入哪些數據並突出顯示更新的元素。

它需要根據回調接收的具體數據進行調整(正如我在問題的評論中指出的那樣,似乎不大可能實際上是從JSON響應接收數組的數組),但我希望這演示如何實現您的目標。

+0

我編輯了我的問題。您的解決方案將同時應用於每個div。當數值改變時,我只需要對特定的div進行閃爍。 – medzi

+0

但你有一個ID選擇器。意思是你只能用'id = journey'設置一個div。那麼它將如何適用於所有的divs? – user1

+0

id =旅程是所有數據都到達的唯一容器,現在每個數據都包含在應該生成動畫的class =「square」中。 – medzi

0

好吧,我想我現在明白你的問題。

function getRealData() { 
$.ajax({ 
    url: 'test_api.php', 
    data: "", 
    dataType: 'json', 
    success: function (rows) { 

     var text = ''; 

     for (var i in rows) { 

      var row = rows[i]; 

      var availability = row[3]; 
      var hostName = row[2]; 
      var intranet = row[6]; 
      var timeRespons = row[4]; 


      //console.log(availability); 

      if (availability == 0){ 
       var img = "img/tick.png"; 

      } 

      if (availability == 1){ 
       var img = "img/warning.png"; 
      } 

      if (availability == 2){ 
       var img = "img/alert.png"; 
      } 

      text+= '<section class="square new"><h3> ' + intranet + '</h3><img src='+img+' width="70" height="70" rel='+availability+' alt="warning"/><h4><img src="img/time_icon.png" width="20" height="20" alt="clock" class="clock" /> '+ timeRespons+'</h4>';//added a class called new in the section here 
       text += '</section>'; 



      } 
     $("#journey").html(text); 


    } 
}); 

     $(".square.new").each(function(){//wrote code to animate and remove the new class 
      $(this).effect("highlight", {color: 'red'}, 3000); 
      $(this).removeClass("new"); 
     }); 
} 

    //this refreshes data every 2seconds 
    setInterval(getRealData, 2000); 

    //call the function to display data 
    getRealData(); 
+0

這樣做的問題是,它將把每個'.square'視爲新的,並且將它們全部設置爲動畫,無論數據是否真正改變。如果AJAX調用獲得相同的舊數據並且因此元素保持不變,應該沒有'.new'應用 – Corey

+0

Uncaught TypeError:即使我添加了 medzi

+0

$(this).animate({」background-color「:」紅色「},3000);也不能工作:( – medzi

相關問題