Algunas herramientas de revisión de código implementan esto para permitir la copia & pegando el código desde un lado de un lado a lado diff. Miré cómo ReviewBoard lo quita.
Lo esencial es:
- Cuando comienza una selección de columna, estilo las células en todas las demás columnas con
user-select: none
(y sus variantes prefijados, if necessary). Esto crea la apariencia de una selección de columna. Las otras columnas todavía se seleccionan en secreto, por lo que debe ...
- Interceptar el evento
copy
y cambiar su carga para reflejar el contenido de la columna seleccionada.
El código de ReviewBoard para hacer esto consiste en this CSS y this JavaScript.
Lo saqué en un mínimo jsbin demo.
Aquí está el CSS para crear la apariencia de una selección de una sola columna (agregar la clase selecting-left
a la mesa cuando se está seleccionando la columna de la izquierda, o selecting-right
de la derecha):
.selecting-left td.right,
.selecting-left td.right *,
.selecting-right td.left,
.selecting-right td.left *,
user-select: none;
}
.selecting-left td.right::selection,
.selecting-left td.right *::selection,
.selecting-right td.left::selection,
.selecting-right td.left *::selection,
background: transparent;
}
Aquí está la JavaScript para interceptar el evento copy
y enchufe en el valor de una sola columna de datos:
tableEl.addEventListener('copy', function(e) {
var clipboardData = e.clipboardData;
var text = getSelectedText();
clipboardData.setData('text', text);
e.preventDefault();
});
function getSelectedText() {
var sel = window.getSelection(),
range = sel.getRangeAt(0),
doc = range.cloneContents(),
nodes = doc.querySelectorAll('tr'),
text = '';
var idx = selectedColumnIdx; // 0 for left, 1 for right
if (nodes.length === 0) {
text = doc.textContent;
} else {
[].forEach.call(nodes, function(tr, i) {
var td = tr.cells[tr.cells.length == 1 ? 0 : idx];
text += (i ? '\n' : '') + td.textContent;
});
}
return text;
}
también hay algo de código sea menos interesante añadir los selecting-left
y selecting-right
cl culos al comienzo de una selección. Esto requeriría un poco más de trabajo para generalizar a las tablas de n columnas.
Esto parece funcionar bien en la práctica, ¡pero es sorprendente lo difícil que es!
+1 para una buena pregunta, pero sospecho que es imposible. ¿Conoce alguna forma en que el usuario pueda hacer lo mismo manualmente? – nnnnnn
No, de ninguna manera directa ... – cbp