2010-07-23 7 views
12

Tengo un cuadro de diálogo jQuery para hacer enlaces en un intervalo de contentEditable. El problema es que presionar un botón para abrir el diálogo hace que la selección se pierda, el ingreso de texto dentro del diálogo también hace que la selección se pierda.Conservar la selección de texto en contenteditable al interactuar con jQuery UI Diálogo y entrada de texto

Puedo arreglar el botón con -moz-user-select: none; pero -webkit-user-select: ninguno no funciona en Chrome.

Puedo arreglar la entrada envolviéndola en un iframe, pero eso es complicado y hacer clic en cualquier otro lugar también mata la selección, por ejemplo, arrastrando el diálogo.

He visto la solución en How to preserve text selection when opening a jQuery dialog, pero eso no funciona en muchos navegadores en un elemento contento, solo entradas reales.

¿Existe una buena solución para mi problema?

Respuesta

25

Puede guardar y restaurar la selección usando funciones simples como las siguientes cuando se abre y cierra el cuadro de diálogo. No estoy lo suficientemente familiarizado con los cuadros de diálogo de jQuery para conocer el mecanismo de enganche en el cuadro de diálogo de apertura y cierre. La primera, saveSelection, que devuelve un objeto Range o TextRange que se debe almacenar en una variable que se pasa más tarde a restoreSelection:

function saveSelection() { 
    if (window.getSelection) { 
     sel = window.getSelection(); 
     if (sel.getRangeAt && sel.rangeCount) { 
      return sel.getRangeAt(0); 
     } 
    } else if (document.selection && document.selection.createRange) { 
     return document.selection.createRange(); 
    } 
    return null; 
} 

function restoreSelection(range) { 
    if (range) { 
     if (window.getSelection) { 
      sel = window.getSelection(); 
      sel.removeAllRanges(); 
      sel.addRange(range); 
     } else if (document.selection && range.select) { 
      range.select(); 
     } 
    } 
} 
+0

¿Cómo podemos utilizar estas funciones en la práctica. En un elemento div digamos

test test
Hussein

+5

Gracias Tim. Usted es el maestro de rango! –

+0

Utilicé el evento selectionChange. Vea aquí http://stackoverflow.com/questions/21730134 Utilicé Dart pero debería tener la idea. –

Cuestiones relacionadas