2017-12-22 1 views
2

Ich baue Push-Benachrichtigungen für mein Messaging-System und habe einen seltsamen Bug.Ajax in while-Schleife

Ich verwende eine Ajax, um die letzten Nachrichten zu erhalten. In meinem PHP-Skript habe ich eine while-Schleife, in der ich meine Ergebnisse durchlaufe. Also jede <li> ist eine "letzte Nachricht".

In meinen Gedanken wäre es einfach. Ich lege eine Ajax-Funktion in die <li> und während es durch die While-Schleife iteriert wird es die Werte aus der Iteration erhalten gesendet. Unten ist mein PHP-Skript.

$output .= " 
    <li> 
    <img src='$profilephoto' class='rm_pp' alt=''> 
     <div class='imNotification'> 
     <script> 
     function getIMNotification() { 
      $.ajax({ 
      url: 'getIMNotification.php', 
      method: 'POST', 
      data:{user2:'$id'}, 
      success:function(data) { 
       $('.imNotification').html(data); 
      } 
      }); 
     } 

     getIMNotification(); 
     </script> 
    </div> 
    </li> 
"; 

Zum Beispiel in meinem getIMNotification.php wenn i echo nur den user2 Wert von meinem AJAX gesendet, wird es den gleichen Wert für jedes Ergebnis Echo. Aber, da es in der While-Schleife ist, sollte es nicht jede Iteration neue Werte erhalten?

Liegt es daran, dass die Funktion aufgerufen wird? Der eine Wert, der wiederholt wird, ist der letzteid in der Schleife. Irgendeine Logik, warum es das macht?

+0

Eine Funktion nur eine haben kann Definition. Wenn Sie die Funktion in einer Schleife definieren, erhalten Sie nur die letzte Version, wenn die Funktion aufgerufen wird. – Barmar

+0

@Barmar Tru, aber er ruft es sofort an, also ist das kaum ein Problem. Es könnte genauso gut keine Funktion sein. –

+0

'$ ('. ImNotification') .html (Daten);' aktualisiert natürlich ALLE '.imNotification' Elemente, nicht nur das in der Nähe des Skript-Tags. –

Antwort

3

Sie sollten die Funktion in der Schleife nicht neu definieren. Sie sollten die Funktion einmal definieren und die ID als Parameter verwenden. Dann können Sie es für jede LI separat aufrufen.

Sie müssen auch das Ergebnis in den spezifischen DIV für diese Nachricht legen. .imNotification wählt alle DIVs mit dieser Klasse aus. Sie können $id in der ID des DIV verwenden, um jedes Ziel zu erreichen.

Die Funktion muss nicht von AJAX kommen, können Sie in der ursprünglichen HTML setzen diese einfach:

function getIMNotification(id, target) { 
    $.ajax({ 
    url: 'getIMNotification.php', 
    method: 'POST', 
    data: { 
     user2: id 
    }, 
    success: function(data) { 
     $('#' + target).html(data); 
    } 
    }); 
} 

, die PHP wäre dann:

$output .= " 
    <li> 
    <img src='$profilephoto' class='rm_pp' alt=''> 
     <div class='imNotification' id='imNotification-$id'> 
     <script> 
     getIMNotification('$id', 'imNotification-$id'); 
     </script> 
    </div> 
    </li> 
"; 
+0

ja, das funktioniert perfekt! Also habe ich etwas Ähnliches versucht, bevor ich ID-Variable als Parameter gesetzt und in der Schleife ähnlich wie Ihre Antwort übergeben, aber es war die ID und das Ziel auf der div, die den Selektor einzeln laden! Vielen Dank für Ihre Zeit und Erklärung! – Ryne