Estoy haciendo algo de manipulación de TextNodes en JavaScript, y yo (lamentablemente) necesito soportar IE6. Node.normalize() se cuelga, y necesito solucionar esto. Mi primera inclinación es simplemente volver a implementarlo usando otros métodos DOM. ¿Cómo implementaría esto?Node.normalize() se bloquea en IE6
Respuesta
La siguiente versión es más corta y más eficientes que otros publicados aquí. Las mejoras son:
- No repetidas llamadas a
node.childNodes
ynode.childNodes.length
- hay creación de nodos de texto adicionales; en cambio, para cada combinación, guardar el primer nodo de texto existente y utilizar su método
appendData()
- Shorter
El código:
function normalize(node) {
var child = node.firstChild, nextChild;
while (child) {
if (child.nodeType == 3) {
while ((nextChild = child.nextSibling) && nextChild.nodeType == 3) {
child.appendData(nextChild.data);
node.removeChild(nextChild);
}
} else {
normalize(child);
}
child = child.nextSibling;
}
}
Tendría que buscar recursivamente a través de todos los nodos secundarios del nodo actual. Al considerar un nodo, debe eliminar los nodos de texto vacíos y combinar los nodos de texto adyacentes.
function myNormalize(node)
for each child node of node do
if child is not text
normalize(child)
else
if child node is empty
delete
continue
else
sibling = next node
while sibling exists and sibling is a text node
if sibling is empty
delete sibling
else
combine sibling with child
get next sibling
end
end
end
end
end
buen pseudocódigo. ¿podrías traducirlo también a javascript? –
basado en pseudocódigo de tvanfosson, esto es lo que se me ocurrió en javascript:
var ELEMENT_NODE = 1;
var TEXT_NODE = 3;
function normalize(node) {
for (i=0; i<node.childNodes.length; i++) {
var child = node.childNodes[i];
if (child.nodeType == ELEMENT_NODE) {
normalize(child);
continue;
}
if (child.nodeType != TEXT_NODE) { continue; }
var next = child.nextSibling;
if (next == null || next.nodeType != TEXT_NODE) { continue; }
var combined_text = child.nodeValue + next.nodeValue;
new_node = node.ownerDocument.createTextNode(combined_text);
node.insertBefore(new_node, child);
node.removeChild(child);
node.removeChild(next);
i -= 1;
}
}
Realmente odio aceptar mi propia respuesta, pero confié fuertemente en tvanfosson para llegar a esto, y ya lo he votado. –
La solución anterior estaba funcionando muy lento y estrellarse Firefox para mí. Así que lo optimicé un poco y está funcionando bien ahora (el problema principal fue hacer referencias repetidas al objeto de colección HTML node.childNodes).
Gracias por el gran punto de partida, pero pensé que merecía la pena publicación:
function myNormalize(node) {
for (var i=0, children = node.childNodes, nodeCount = children.length; i<nodeCount; i++) {
var child = children[i];
if (child.nodeType == 1) {
myNormalize(child);
continue;
}
if (child.nodeType != 3) { continue; }
var next = child.nextSibling;
if (next == null || next.nodeType != 3) { continue; }
var combined_text = child.nodeValue + next.nodeValue;
new_node = node.ownerDocument.createTextNode(combined_text);
node.insertBefore(new_node, child);
node.removeChild(child);
node.removeChild(next);
i--;
nodeCount--;
}
}
creo que la solución descrita anteriormente no es del todo correcto. Fwiw, aquí es una función normalizar trabajo y una función de pegamento que utiliza el normalizar nativa si está disponible:
function _myNormalizeNode(node) {
if (! node) {
return;
}
var ELEMENT_NODE = 1;
var TEXT_NODE = 3;
var child = node.firstChild;
while (child) {
if (child.nodeType == ELEMENT_NODE) {
this._myNormalizeNode(child);
}
else if (child.nodeType == TEXT_NODE) {
var next;
while ((next = child.nextSibling) && next.nodeType == TEXT_NODE) {
var value = next.nodeValue;
if (value != null && value.length) {
child.nodeValue = child.nodeValue + value;
}
node.removeChild(next);
}
}
child = child.nextSibling;
}
}
function _normalizeNode(node) {
if (! node) {
return;
}
if (typeof node.normalize == "function") {
return node.normalize();
}
return _myNormalizeNode(node);
}
Un comentario sobre mi respuesta habría sido útil si no es correcto. Además, ¿qué has corregido en realidad? –
- 1. Android se bloquea en ListPreference
- 2. WebRequest.GetResponse se bloquea?
- 3. JSON en IE6 (IE7)
- 4. Javascript se bloquea UIWebview
- 5. JavaScript multiproceso en IE6?
- 6. iOS se bloquea en CFStringGetLength en CoreFoundation
- 7. Consumidor de ActiveMQ se bloquea
- 8. @ font-face se bloquea IE8
- 9. UIDocumentInteractionController se bloquea al salir
- 10. UITextField se bloquea al tocar
- 11. muy sencillo programa WPF se bloquea (se bloquea) en el teclado del cambio de diseño
- 12. RoR 'nuevo' comando se bloquea
- 13. android gridview se bloquea en Galaxy 3
- 14. ¿Cómo se bloquea session_start en PHP?
- 15. ¿Por qué se bloquea glClear en OpenGLES?
- 16. Thread Message Loop se bloquea en Delphi
- 17. SecTrustCreateWithCertificates se bloquea en el iPad
- 18. El simulador se bloquea en AQMEIOManager
- 19. iOS Aplicación se bloquea en el lanzamiento
- 20. F # se bloquea en Mono 2.10
- 21. lugares poniente en OS X se bloquea
- 22. UITableView se bloquea en el desplazamiento
- 23. MediaRecorder se bloquea al iniciar
- 24. Desenfoque El evento no se desencadena en IE7 e IE6
- 25. objeto JSON en IE6 - ¿Cómo?
- 26. IE6 min-height dilema
- 27. IE6 fondo-posición (?) Problema
- 28. ¿Bloquea() {} bloquea un recurso o bloquea un fragmento de código?
- 29. depuración javascript para IE6
- 30. Detectando IE6 usando jQuery.support
1 para '(por desgracia)' – SLaks