instead of moving the cursor to the end by using the input field value's length, we move it to position 1e9, which will certainly be beyond the end of the string.
62 lines
2.9 KiB
C
62 lines
2.9 KiB
C
const char HTTP_SCRIPT_CONSOL[] PROGMEM =
|
|
"var sn=0,id=0,ft,ltm=%d;" // Scroll position, Get most of weblog initially
|
|
"function l(p){" // Console log and command service
|
|
"var c,o='';"
|
|
"clearTimeout(lt);"
|
|
"clearTimeout(ft);"
|
|
"t=eb('t1');"
|
|
"if(p==1){"
|
|
"c=eb('c1');" // Console command id
|
|
"o='&c1='+encodeURIComponent(c.value);"
|
|
"c.value='';"
|
|
"t.scrollTop=99999999;"
|
|
"sn=t.scrollTop;"
|
|
"}"
|
|
"if(t.scrollTop>=sn){" // User scrolled back so no updates
|
|
"if(x!=null){x.abort();}" // Abort if no response within 2 seconds (happens on restart 1)
|
|
"x=new XMLHttpRequest();"
|
|
"x.onreadystatechange=function(){"
|
|
"if(x.readyState==4&&x.status==200){"
|
|
"var z,d;"
|
|
"d=x.responseText.split(/}1/);" // Field separator
|
|
"id=d.shift();"
|
|
"if(d.shift()==0){t.value='';}"
|
|
"z=d.shift();"
|
|
"if(z.length>0){t.value+=z;}"
|
|
"t.scrollTop=99999999;"
|
|
"sn=t.scrollTop;"
|
|
"clearTimeout(ft);"
|
|
"lt=setTimeout(l,ltm);" // webrefresh timer....
|
|
"}"
|
|
"};"
|
|
"x.open('GET','cs?c2='+id+o,true);" // Related to Webserver->hasArg("c2") and WebGetArg("c2", stmp, sizeof(stmp))
|
|
"x.send();"
|
|
"ft=setTimeout(l,20000);" // fail timeout, triggered 20s after asking for XHR
|
|
"}else{"
|
|
"lt=setTimeout(l,ltm);" // webrefresh timer....
|
|
"}"
|
|
"return false;"
|
|
"}"
|
|
"wl(l);" // Load initial console text
|
|
|
|
// Console command history
|
|
"var hc=[],cn=0;" // hc = History commands, cn = Number of history being shown
|
|
"function h(){"
|
|
// "if(!(navigator.maxTouchPoints||'ontouchstart'in document.documentElement)){eb('c1').autocomplete='off';}" // No touch so stop browser autocomplete
|
|
"eb('c1').addEventListener('keydown',function(e){"
|
|
"var b=eb('c1'),c=e.keyCode;" // c1 = Console command id
|
|
"if(38==c||40==c){" // ArrowUp or ArrowDown
|
|
"b.autocomplete='off';" // ArrowUp or ArrowDown must be a keyboard so stop browser autocomplete
|
|
"setTimeout(function(b){" // for best compatibility (chrome) we need to schedule this function
|
|
"b.focus();" // for best compatibility (chrome) we need to (re)focus the input element
|
|
"b.setSelectionRange(1e9,1e9);" // move cursor to the end (hopefully) of the command inserted from history
|
|
"},0,b);"
|
|
"}"
|
|
"38==c?(++cn>hc.length&&(cn=hc.length),b.value=hc[cn-1]||''):" // ArrowUp
|
|
"40==c?(0>--cn&&(cn=0),b.value=hc[cn-1]||''):" // ArrowDown
|
|
"13==c&&(hc.length>19&&hc.pop(),hc.unshift(b.value),cn=0)" // Enter, 19 = Max number -1 of commands in history
|
|
"});"
|
|
"}"
|
|
"wl(h);"; // Add console command key eventlistener after name has been synced with id (= wl(jd))
|
|
|