Estoy buscando una solución que funcione en navegador cruzado, es decir, IE, Firefox y Safari.¿Cómo puedo averiguar el nodo DOM en el cursor en la ventana de contenido editable de un navegador usando Javascript?
9
A
Respuesta
17
Por "ventana de contenido editable" Voy a suponer que quiere decir un elemento con contenteditable
encendido o un documento con designMode
encendido.
También hay dos casos a tener en cuenta: el caso cuando el usuario ha hecho una selección y el caso donde hay solo un símbolo de intercalación. El código siguiente funcionará en ambos casos y le proporcionará el elemento más interno que contiene la selección por completo. Si la selección está completamente contenida dentro de un nodo de texto, es un poco complicado obtener ese nodo de texto en IE (trivial en otros navegadores), así que no he proporcionado ese código aquí. Si lo necesitas, puedo desenterrarlo.
function getSelectionContainerElement() {
var range, sel, container;
if (document.selection && document.selection.createRange) {
// IE case
range = document.selection.createRange();
return range.parentElement();
} else if (window.getSelection) {
sel = window.getSelection();
if (sel.getRangeAt) {
if (sel.rangeCount > 0) {
range = sel.getRangeAt(0);
}
} else {
// Old WebKit selection object has no getRangeAt, so
// create a range from other selection properties
range = document.createRange();
range.setStart(sel.anchorNode, sel.anchorOffset);
range.setEnd(sel.focusNode, sel.focusOffset);
// Handle the case when the selection was selected backwards (from the end to the start in the document)
if (range.collapsed !== sel.isCollapsed) {
range.setStart(sel.focusNode, sel.focusOffset);
range.setEnd(sel.anchorNode, sel.anchorOffset);
}
}
if (range) {
container = range.commonAncestorContainer;
// Check if the container is a text node and return its parent if so
return container.nodeType === 3 ? container.parentNode : container;
}
}
}
3
También puede utilizar el Rangy Biblioteca:
elementAtCursor = rangy.getSelection().anchorNode.parentNode
Cuestiones relacionadas
- 1. Insertar texto en el cursor en un contenido div editable
- 2. ¿Cómo escribo contenido en otra ventana del navegador usando Javascript?
- 3. JavaScript: ¿Cómo averiguar el ancho y alto del punto de vista en la ventana del navegador?
- 4. Java/DOM: Obtenga el contenido XML de un nodo
- 5. ¿Puedo cambiar el tamaño de la ventana del navegador?
- 6. ¿Cómo recuperar el texto de un nodo de texto DOM?
- 7. Contenido editable de enlace personalizado editable
- 8. Averiguar en qué número de línea se encuentra un elemento en dom en Javascript?
- 9. ¿Cómo puedo averiguar el espacio de nombre de un elemento en PHP DOM?
- 10. ¿Cómo desactivar el cursor parpadeante en la ventana de comandos?
- 11. Minimizar la ventana del navegador usando javascript
- 12. Cómo encontrar detectores de eventos en un nodo DOM usando JavaScript
- 13. ¿Cómo puedo eliminar un nodo secundario en HTML usando JavaScript?
- 14. Accediendo al contenido de otras pestañas en el navegador
- 15. ¿Cómo puedo cambiar el espacio de nombres en cada nodo en un DOM?
- 16. Reemplazando del javascript dom text nodo
- 17. ¿Qué tipo de contenido ejecuta javascript en el navegador?
- 18. cómo obtener el nodo hijo en div usando javascript
- 19. ¿Cuándo el navegador ejecuta Javascript? ¿Cómo se mueve el cursor de ejecución?
- 20. ¿Cómo puedo adjuntar "metadatos" a un nodo DOM?
- 21. En GWT, ¿cómo puedo obtener todos los atributos de un elemento en el HTML DOM?
- 22. ¿Cómo reemplazar el elemento DOM en su lugar usando Javascript?
- 23. Seleccione el siguiente nodo del nodo seleccionado en PHP DOM?
- 24. Cuál es el identificador único para un elemento DOM/nodo
- 25. ¿Cómo puedo bloquear el cursor en el interior de una ventana en Mac OS X?
- 26. ¿Cómo puedo saber qué navegador está usando un usuario?
- 27. Javascript establece el tamaño de la ventana del navegador
- 28. ¿Puedo ejecutar Javascript en función del tamaño de la ventana?
- 29. ¿Cómo se implementa CSS y DOM en el navegador?
- 30. ¿Cómo borro el contenido de un div usando JavaScript?
Tim, esto es exactamente lo que estaba buscando. Le agradecería si también puede cavar en el caso de IE donde la selección está contenida en un nodo de texto. Gracias. –
Por cierto, el caso de IE donde devuelve range.parentElement() siempre parece devolver el elemento de cuerpo aunque el símbolo de intercalación estaba en el texto que dentro de un nodo de anclaje, por ejemplo. En este HTML xyz si el símbolo de intercalación estaba entre 'x' y 'y', ¿no debería parentElement() devolver el nodo 'a'? –
Sí, debería. No he tenido problemas con 'parentElement()' antes. ¿Tiene una página que pueda ver que muestre el problema? –