EDIT: Alles funktioniert; Die Stöße funktionieren. Das einzige Problem ist, dass bei jedem Drücken der #load_info div
auf leer zurückgesetzt wird. Wie kann ich den ursprünglichen Inhalt innerhalb der div
beibehalten, obwohl der Inhalt die aktualisierte Version von sich selbst wäre, wie die XML-Datei erneut verschoben wird.Long Polling zum Aktualisieren von DOM unter Beibehaltung kumulierter Attribute von jQuery
Ich habe ein PHP-Skript für lange Abfrage einer XML-Datei und Codierung als JSON-Array. Es wird vom Frontend mit dem JSON als Parameter aufgerufen.
$filename= dirname(__FILE__)."/people.xml";
$lastmodif = isset($_GET['timestamp'])? $_GET['timestamp']: 0 ;
$currentmodif=filemtime($filename);
while ($currentmodif <= $lastmodif) {
usleep(10000);
clearstatcache();
$currentmodif =filemtime($filename);
}
$response = array();
$xObj = simplexml_load_file($filename);
// Loop for #loadMe.
foreach($xObj as $person){
$concat_buttons .= "<button class='mybutton' value='" . (string)$person->id . " '> " . (string)$person->fullName . "</button>";
}
// Loop for #toadMe.
foreach($xObj as $person){
$concat_info .= "<div class='div div_' data-person-id='" . (string)$person->id . "' id='" . (string)$person->id . "'><h1> " . (string)$person->job . "</h1></div>";
}
// Output for AJAX.
$response['msg'] = $concat_buttons;
$response['msg2'] = $concat_info;
$response['timestamp'] = $currentmodif;
echo json_encode($response);
Dann habe ich eine jQuery-Skript das JSON-Objekt für Instancing (msg2
) für jeden Knoten in ein div
Anhängen genannt #load_data
. Meine Frage ist warum funktioniert die jQuery unten nicht? Meine Vermutung ist entweder $(window).find
funktioniert nicht in der get_person(id)
Funktion und/oder meine Funktionen sind außerhalb des Geltungsbereichs mit der Abfrage. Zu beachten, dass PHP und JS zu 100% funktionierten, bevor ich anfing, die Funktionen show_person()
und get_person()
zu integrieren. Wenn man innerhalb von #load_button
div
auf eine bestimmte Schaltfläche klickte, wurde ein Teil der Informationsansicht mit einer id
umgestellt, die dem Attribut value
der Schaltfläche mit .show()
entsprach, das ursprünglich verborgen war; dann, wenn eine andere Taste geklickt wurde, würde die alte Information mit versteckt werden und die neuen Daten würden gesehen werden. Dies war meine runde Lösung für die Verwendung von Long-Polling, um DOM-Elemente zu aktualisieren, indem Sie sie alle am Anfang laden, aber wenn eine Information während einer neuen Abfrage angezeigt wird (var
timestamp
wird aktualisiert), dann die Elemente im Inneren von #load_info
wird vorübergehend aus dem DOM verloren, was zu einem leeren führt, bis die nächste Schaltfläche geklickt wird. Also versuche ich, einige zusätzliche Funktionen hinzuzufügen, um DOM-Daten innerhalb der var
$person
zu speichern, so dass nach einer Umfrage, was vorher gezeigt wurde, wieder erscheinen würde. Was kann geändert oder hinzugefügt werden, damit dieses jQuery-Skript wie gewünscht funktioniert? Danke im Voraus!
var timestamp=null;
function waitForMsg() {
$.ajax({
type: "GET",
url: "getData.php?timestamp="+timestamp,
async: true,
cache: false,
success: function(data) {
var json=eval('('+data+ ')');
if (json['msg'] != "") {
$("#load_buttons").empty();
$("#load_buttons").append(json['msg']);
// Update any person divs that were already visible.
$('#load_info .person').each(function() {
// Grabs the ID from data-person-id set earlier.
var id = $(this).data('person-id');
show_person(id);
});
}
timestamp = json["timestamp"];
setTimeout("waitForMsg()",1000);
},
error: function(XMLHttpRequest,textStatus,errorThrown) {
setTimeout("waitForMsg()",15000);
}
});
}
$(document).on('click', '.mybutton', function() {
$('#load_info').empty();
show_person(this.value);
});
function show_person(id) {
$('#person-detail-' + id).remove();
get_person(id).appendTo('#load_info');
}
function get_person(id) {
var $person = $(window).find('id:contains(id)');
var $div = $('<div>', {
'class': 'person',
'data-person-id': id,
id: id
});
$person.find(h1).text.appendTo($div);
return $div;
}
Was ist Ihre Absicht mit '$ (window) .find ('id: enthält (id)');'? – Kyle
@Kyle Kyle, ich versuche, es als Mittel zu verwenden, um eine Variable für die Aufnahme der aktuellen Element (e) im Container # load_info zu erstellen, daher kann die Variable verwendet werden, um das/die Element (e) erneut anzuzeigen wurde/wurden vor dem nächsten Push angezeigt; Wenn etwas vorher angezeigt wurde, klicken Sie auf den Button. – Jim22150