nodo de referencia HTML de otro elemento
-
28-09-2019 - |
Pregunta
Tengo este script, lo cual pensé que era relativamente simple. Básicamente se hace un árbol-diseño de los contenidos de un iframe. Cuando se revoloteaban partes del árbol, sus correspondientes elementos de marco flotante se 'selected'. Pero no está funcionando, para la vida de mí. Aquí hay un código de pseudo-media rápida:
function traverseTree(c,o){
//c = the tree subset to put more stuff in
//o = the element to traverse
var treeNode = D.createElement('div');
c.appendChild(treeNode);
treeNode.innerHTML = o.tagName;
treeNode['refNode'] = o;
treeNode.addEventListener('mouseover',check,false);
loop(o.children){
traverseTree(treeNode,o.child);
}
}
function check(e){
alert(e.target.refNode);
}
El problema se produce con e.target.refNode. Sólo se da una referencia del elemento con el primer nodo (o la etiqueta HTML). El resto no están definidos. Pero, cuando compruebo treeNode.refNode justo después de su creación, siempre es correcta.
EDIT:
Por lo tanto, me hizo una prueba rápida:
<html>
<head>
<title>Test</title>
<script>
window.onload = function(){
createTree(document.getElementById('tree'),
document.getElementById('page').contentWindow.document);
}
function createTree(c,o){
//get list of children
var children = o.childNodes;
//loop through them and display them
for (var i=0;i<children.length;i++){
if (typeof(children[i].tagName) !== 'undefined'){
//Create a tree node
var node = document.createElement('div');
if (children[i].childNodes.length > 0){
node.style.borderLeft = '1px dotted black';
node.style.marginLeft = '15px';
}
c.appendChild(node);
//Reference to the actual node
node.refNode = children[i];
//Add events
node.addEventListener('mouseover',selectNode,false);
//Display what type of tag it is
node.innerHTML += "<"+children[i].tagName.toLowerCase()+">";
//Add in its child nodes
createTree(node,children[i]);
//ending tag... CRASHES THE PROGRAM
node.innerHTML += "</"+children[i].tagName.toLowerCase()+">";
}
}
}
function selectNode(e){
document.getElementById('info').innerHTML = e.target.refNode;
}
</script>
</head>
<body>
<iframe id='page' src='some_page.html'></iframe>
<div id='info' style='border-bottom:1px solid red;margin-bottom:10px;'></div>
<div id='tree'></div>
</body>
</html>
y me di cuenta de que la adición de innerHTML después de anexar los nodos del árbol niño estaba quitando la propiedad nodo_ref de los niños. Por lo tanto, ahí es donde está ocurriendo el problema.
Solución
Por lo tanto, supongo que la solución no sería más que al cambio .innerHtml
a .appendChild(document.createTextNode(...))
. Mi escritura es sólo para uso local, y sólo se construye para FF3 +, por lo que aparte de eso, no debería haber ningún problema.
Otros consejos
No se puede almacenar objetos en los atributos de los elementos. Lo que se ve si se comprueba la cualidad es la cadena representación del nodo asignado. Si desea utilizar jQuery, que podría implementar con jQuery.data ()