Use existing html nodes with socket
This commit is contained in:
parent
28c8fac046
commit
1207194e1e
|
@ -2,6 +2,7 @@
|
||||||
var debug = false;
|
var debug = false;
|
||||||
|
|
||||||
const nodes = {};
|
const nodes = {};
|
||||||
|
const hasText = {};
|
||||||
|
|
||||||
let socket = null;
|
let socket = null;
|
||||||
|
|
||||||
|
@ -56,8 +57,6 @@ function ooui (rootElementPath) {
|
||||||
var initialSize = getSize ();
|
var initialSize = getSize ();
|
||||||
saveSize (initialSize);
|
saveSize (initialSize);
|
||||||
|
|
||||||
return;
|
|
||||||
|
|
||||||
var wsArgs = (rootElementPath.indexOf("?") >= 0 ? "&" : "?") +
|
var wsArgs = (rootElementPath.indexOf("?") >= 0 ? "&" : "?") +
|
||||||
"w=" + initialSize.width + "&h=" + initialSize.height;
|
"w=" + initialSize.width + "&h=" + initialSize.height;
|
||||||
|
|
||||||
|
@ -142,12 +141,22 @@ function getNode (id) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getOrCreateElement (id, tagName) {
|
||||||
|
var e = document.getElementById (id);
|
||||||
|
if (e) {
|
||||||
|
if (e.firstChild && e.firstChild.nodeType == Node.TEXT_NODE)
|
||||||
|
hasText[e.id] = true;
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
return document.createElement (tagName);
|
||||||
|
}
|
||||||
|
|
||||||
function msgCreate (m) {
|
function msgCreate (m) {
|
||||||
const id = m.id;
|
const id = m.id;
|
||||||
const tagName = m.k;
|
const tagName = m.k;
|
||||||
const node = tagName === "#text" ?
|
const node = tagName === "#text" ?
|
||||||
document.createTextNode ("") :
|
document.createTextNode ("") :
|
||||||
document.createElement (tagName);
|
getOrCreateElement (id, tagName);
|
||||||
if (tagName !== "#text")
|
if (tagName !== "#text")
|
||||||
node.id = id;
|
node.id = id;
|
||||||
nodes[id] = node;
|
nodes[id] = node;
|
||||||
|
@ -183,6 +192,17 @@ function msgSetAttr (m) {
|
||||||
if (debug) console.log ("SetAttr", node, m.k, m.v);
|
if (debug) console.log ("SetAttr", node, m.k, m.v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function msgRemAttr (m) {
|
||||||
|
const id = m.id;
|
||||||
|
const node = getNode (id);
|
||||||
|
if (!node) {
|
||||||
|
console.error ("Unknown node id", m);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
node.removeAttribute(m.k);
|
||||||
|
if (debug) console.log ("RemAttr", node, m.k);
|
||||||
|
}
|
||||||
|
|
||||||
function msgCall (m) {
|
function msgCall (m) {
|
||||||
const id = m.id;
|
const id = m.id;
|
||||||
const node = getNode (id);
|
const node = getNode (id);
|
||||||
|
@ -192,6 +212,12 @@ function msgCall (m) {
|
||||||
}
|
}
|
||||||
const isJQuery = m.k.startsWith ("$.");
|
const isJQuery = m.k.startsWith ("$.");
|
||||||
const target = isJQuery ? $(node) : node;
|
const target = isJQuery ? $(node) : node;
|
||||||
|
if (m.k === "insertBefore" && m.v[0].nodeType == Node.TEXT_NODE && m.v[1] == null && hasText[id]) {
|
||||||
|
// Text is already set so it clear it first
|
||||||
|
if (target.firstChild)
|
||||||
|
target.removeChild (target.firstChild);
|
||||||
|
delete hasText[id];
|
||||||
|
}
|
||||||
const f = isJQuery ? target[m.k.slice(2)] : target[m.k];
|
const f = isJQuery ? target[m.k.slice(2)] : target[m.k];
|
||||||
if (debug) console.log ("Call", node, f, m.v);
|
if (debug) console.log ("Call", node, f, m.v);
|
||||||
const r = f.apply (target, m.v);
|
const r = f.apply (target, m.v);
|
||||||
|
@ -246,6 +272,9 @@ function processMessage (m) {
|
||||||
case "setAttr":
|
case "setAttr":
|
||||||
msgSetAttr (m);
|
msgSetAttr (m);
|
||||||
break;
|
break;
|
||||||
|
case "remAttr":
|
||||||
|
msgRemAttr (m);
|
||||||
|
break;
|
||||||
case "call":
|
case "call":
|
||||||
msgCall (m);
|
msgCall (m);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue