2011-06-14 13 views
11

actualizaciónSelecciones no continuas en cromo?

Recientemente he descubierto que puede crear mediante programación selecciones con Chrome que no son continuas, ya sea por sustitución de elementos/textnodes entre medio de las partes desea esconderse o no seleccionada y luego mostrándoles.

Ejemplo de selecciones no continuos para Chrome: http://jsfiddle.net/niklasvh/YKJBW/

var t = $('div').contents().get(0); 


$.each(t.nodeValue.split(" "),function(i,e){ 
    t = t.splitText(e.length); 
    if (t.length>0){ 
    t = t.splitText(1); 
    } 
}); 



var c = $('div').contents(); 

$.each(c,function(i,e){  
    if (i>0){ 
    if (i%3) { }else{ 
      e.parentNode.replaceChild($('<unselect />').text(e.nodeValue).get(0),e);       
    }  
} 
}); 

$('unselect').hide(); 
window.setTimeout(function(){ 
    $('unselect').show();  
},0); 

Sin embargo cuando se realiza el evento copia, toda la selección se vuelve a seleccionada (incluso si no tiene huecos en el medio), pero por supuesto el mismo método se puede usar para modificar programáticamente la selección antes de que se realice el evento de copia.

La parte engañosa ahora es que se puede usar esta funcionalidad de manera efectiva presionando Ctrl hacia abajo como se puede en Firefox para crear selecciones no continuas. El método actual que uso en el ejemplo divide los TextNodes en muchas piezas, lo que para fines visuales no tiene ninguna importancia. Sin embargo, también usa etiquetas adicionales para romper la selección, que según lo que he descubierto, no se puede eliminar. Sin embargo, se puede alcanzar la misma funcionalidad eliminando TextNodes y agregando nuevos en su lugar. El problema es que solo tendrá en cuenta el último nodo agregado, por lo que si tiene varios espacios en su selección, solo tendrá en cuenta el último cambio de DOM que haya aplicado.

¿Alguien puede pensar en formas no documentadas de aplicar estas selecciones no continuas que no realiza ningún cambio permanente en la selección y sus elementos?

La pregunta original

¿Es posible realizar selecciones que son no continua en Google Chrome? Por ejemplo, si tiene un elemento con el texto de la siguiente manera:

<div>this is some random text</div>

¿Es posible hacer una selección que contiene, por ejemplo, this is y text hacer que el texto no seleccionado en el medio?

Esto parece funcionar bien en FF, donde puede addRanges que no están uno al lado del otro, y la selección se realiza en consecuencia.

Para IE, no parece haber nada que le permita tener múltiples rangos, pero el objeto de selección de IE tiene muchos otros métodos que lo compensan.

Con selecciones no continuas, siempre puede agregar o anteponer una selección a una determinada sección de un sitio web, por ejemplo, al realizar acciones de copia, o forzar al usuario a deseleccionar ciertas partes de sus selecciones, que no desea. copiar.

Ejemplo de selección no continua:

enter image description here

working example (de trabajo al menos en FF4).

edición para realizar el mismo tipo de selección manual, se puede sostener con Firefox ctrl abajo y empezar a arrastrar texto en diferentes posiciones, pero lo realiza en el cromo no funciona.

edición 2 supongo this y this resumir bastante bien. Parece que no hay nada que esperar en lo que respecta a navegadores webkit.

+0

esta es una pregunta sobre el código, se trata de JavaScript - ver arriba: donde puede 'addRanges' –

+1

Ninguno de esos ejemplos parece útil para nada más que molestar a los usuarios. (En el lado positivo, ahora que sé cómo los sitios que lo hacen lo puedo trabajar en contramedidas) – Random832

+1

@ Random832 Algunos clientes quieren evitar que se copie cierto contenido e intentar eliminar ese contenido del portapapeles en lugar de hacerlo todo el contenido en imágenes, por ejemplo, suena ciertamente como una solución más "amigable para el usuario". En lo que respecta a las contramedidas, todo lo que se haga en el lado del cliente siempre se puede eludir, no se trata de imposibilitarlo, sino de llamar la atención de los usuarios acerca de que están haciendo algo que no deberían hacer. – Niklas

Respuesta

4

No. Firefox es el único navegador convencional que admite varios rangos seleccionados. Creo que el principal caso de uso fue permitir la selección de columnas individuales dentro de las tablas, lo que no es posible en caso contrario.

WebKit no tiene previsto admitir varios rangos seleccionados en el corto plazo, por lo que puedo deducir. IE revisó sus API de rango y selección para IE 9 y no lo implementó. No tengo idea de si Opera tiene algún plan para apoyarlo. Consulte this thread from the WHATWG mailing list para obtener más información:

0

No, no hay concepto de selección de texto múltiple. La selección está asociada con el cursor. One caret: una selección.

+0

Si ese es el caso, ¿cómo es que funciona con Firefox? Seguramente uno de los navegadores lo está haciendo incorrectamente, ¿o los resultados serían consistentes? – Niklas

+0

@Niklas: no tengo idea para ser sincero. La selección de texto contiene dos puntos anchorPos y caretPos. Por lo tanto, si tiene selección y moverá el cursor hacia la izquierda/derecha, la selección se eliminará y caretPos se utilizará como punto de referencia. No tengo idea de cómo las múltiples selecciones jugarán con eso. –