Niektóre narzędzia do sprawdzania kodu implementują to, aby umożliwić kopiowanie kodu z jednej strony porównania "na boku". Sprawdziłem, jak ReviewBoard wyciąga go.
Istotą jest:
- Gdy rozpoczyna się wybór kolumny, styl komórki we wszystkich innych kolumn z
user-select: none
(i jego warianty, if necessary prefiksem). Spowoduje to utworzenie wyglądu kolumny. Pozostałe kolumny są nadal potajemnie wybrane, więc musisz ...
- Przechwycić zdarzenie
copy
i zmienić jego ładunek, aby odzwierciedlić zawartość wybranej kolumny.
Kod weryfikacyjny w tym celu składa się z this CSS i this JavaScript.
Wyciągnąłem go do dość minimalnego jsbin demo.
Oto CSS do tworzenia wyglądu wyboru jednej kolumny (trzeba dodać klasę selecting-left
do stołu, gdy lewa kolumna jest zaznaczona, lub selecting-right
do prawej):
.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;
}
Oto JavaScript, żeby przechwycić zdarzenie copy
i podłączyć wartości pojedynczej kolumny danych:
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;
}
jest też kilka mniej interesujący kod, aby dodać selecting-left
i selecting-right
cl ocenia na początku selekcji. Wymagałoby to nieco więcej pracy do uogólnienia na tabele z kolumną n.
Wydaje się, że działa to dobrze w praktyce, ale to zaskakujące, jak trudne!
+1 za dobre pytanie, ale podejrzewam, że to niemożliwe. Czy zdajesz sobie sprawę z tego, że użytkownik może ręcznie zrobić to samo? – nnnnnn
Nie, nie w prosty sposób ... – cbp