2016-08-01 5 views
1

Ich habe eine Auswahlliste, die mit meiner Logdatei gefüllt ist. Jede Sekunde sendet Javascript eine GET-Anfrage an den Server, der die Protokolldatei liest und die Liste auffüllt. Aber nach jeder GET-Anfrage scrollt die Liste wieder nach oben. Was ich machen möchte ist, dass die Anfragen die Schriftrolle nicht beeinflussen, so dass ich frei durch die Liste scrollen kann.Pflegen Scroll-Position in der Liste

<select id = "list" name=servers size=38 style=width:1028px> 

<script type="text/javascript"> 
window.onload = function() { 

    if (bytes === undefined) { 
     var bytes=0; 
    } 
    var url = "/test/log.php?q="; 
    function httpGet(url) 
    { 
    var xhttp = new XMLHttpRequest(); 
    xhttp.open("GET", url, true); 
    xhttp.onload = function (e) { 
     if (xhttp.readyState === 4) { 
      if (xhttp.status === 200) { 
       var list = ""; 
       console.log(xhttp.responseText); 
       obj = JSON.parse(xhttp.responseText); 
       for(var key in obj) { 
       list += obj[key]; 
       if (sessionStorage.logfile == null) { 
        sessionStorage.logfile == "Log"; 
       } 

      } 
       bytes = parseInt(list); 
       document.getElementById("list").innerHTML = sessionStorage.logfile + list; 
       sessionStorage.logfile += list; 
      } 
     }; 
     xhttp.onerror = function (e) { 
     console.error(xhttp.statusText); 
     } 
    }; 


    xhttp.send(); 
    } 

    var updateInterval = 1000; 
    function update() { 

    httpGet(url + bytes); 
     setTimeout(update, updateInterval); 
    } 

    update(); 
} 
</script> 
+0

Get selected Schlüssel immer beim Aktualisieren der Liste und set .options [key] .ausgewählt nach der Aktualisierung. –

+0

@GovindSamrow Können Sie genauer sein? – Mirakurun

+0

Sie ersetzen die gesamte Liste, um Ihre Scroll-Position beizubehalten, sollten Sie stattdessen den Wert der Elemente in der Liste aktualisieren. Können Sie eine typische Ajax-Antwort posten, damit wir das Format sehen können, mit dem Sie arbeiten? – Trey

Antwort

1

Vielleicht sollten Sie SSE verwenden, prüfen Sie folgendes: http://www.w3schools.com/html/html5_serversentevents.asp, aber wenn man muss nur der Code funktioniert machen, ist hier, wie:

<select id = "list" name=servers size=38 style=width:1028px> 

<script type="text/javascript"> 

//here, a new global var to keep the index; 
var old_index=-1; 


window.onload = function() { 
//every change on select list, we register in this function.. 
document.getElementById("list").onchange = keepValue; 



    if (bytes === undefined) { 
     var bytes=0; 
    } 
var url = "/test/log.php?q="; 
function httpGet(url) 
{ 
    var xhttp = new XMLHttpRequest(); 
    xhttp.open("GET", url, true); 
    xhttp.onload = function (e) { 
     if (xhttp.readyState === 4) { 
      if (xhttp.status === 200) { 
       var list = ""; 
       console.log(xhttp.responseText); 
       obj = JSON.parse(xhttp.responseText); 
       for(var key in obj) { 
       list += obj[key]; 
       if (sessionStorage.logfile == null) { 
        sessionStorage.logfile == "Log"; 
       } 

      } 
      bytes = parseInt(list); 
      document.getElementById("list").innerHTML = sessionStorage.logfile + list; 
      sessionStorage.logfile += list; 
      //here, back it to the old selected index 
      //when old_index=-1, means first execution 
      if (old_index==-1) 
      {old_index = document.getElementById("list").length-1;} 
      document.getElementById("list").selectedIndex = old_index; 
      } 
     }; 
     xhttp.onerror = function (e) { 
     console.error(xhttp.statusText); 
    } 
    }; 


xhttp.send(); 
} 

var updateInterval = 1000; 
function update() { 
    httpGet(url + bytes); 
    //i will not change your logic here, but you can write it using setInterval instead. 
    setTimeout(update, updateInterval); 
} 

update(); 
} 

//here, the function to register the list index 
function keepValue(evt) 
{ 

old_index = evt.target.selectedIndex; 
//or document.getElementById('list').selectedIndex; 

} 

</script> 

EDIT:

Response ist in JSON-Format

{"key":"2186 <option> 18:42:19.716 7963  [DEBUG main() cnet.cpp:167] Using public ip: 192.168.0.107 </option> 
<option> 18:42:19.716 7963  [DEBUG main() cnet.cpp:168] Using local ip: 192.168.0.107 </option> 
<option> 18:42:19.717 7963  [DEBUG init() redis.cpp:75] Initializing redis client application </option>"} 
+0

Nein, leider funktioniert es nicht. – Mirakurun

+0

Um Ihnen bei der Lösung des Problems zu helfen, würden Sie die Frage bearbeiten und den responseText hinzufügen? – danielarend

+0

Okay, ich habe – Mirakurun