[英]Select text in a column of an html table
是否可以 select HTML 表的一個垂直列中的每個單元格的文本(即突出顯示以便可以復制+粘貼)。
是否有 JavaScript 方法,或者在某些瀏覽器中可能與許多文本編輯器中使用的 Alt-Click-Drag 快捷方式等效?
或者這是不可能的?
您要查找的內容稱為Range
object(IE 中的TextRange
)。
更新:這是執行您建議的工作代碼: http://jsfiddle.net/4BwGG/3/
在捕獲單元格內容時,您可以以任何您希望的方式對其進行格式化。 我只是每次都添加一個新行。
筆記:
另一種方法是應用 CSS 樣式,該樣式模擬單擊 header 列時突出顯示並遍歷所有單元格以捕獲其內容。 這種方法的外觀和感覺可能與原生選擇的外觀不同(除非您以某種方式捕獲 select 事件並更改外觀)。
然后使用 jQuery 復制插件將它們復制到剪貼板。
一些代碼審查工具實現了這一點,以允許從並排差異的一側復制和粘貼代碼。 我研究了ReviewBoard是如何做到這一點的。
要點是:
user-select: none
(及其前綴變體,如有必要)設置所有其他列中的單元格樣式。 這將創建列選擇的外觀。 其他欄目還是偷偷選的,所以你要...copy
事件並更改其有效負載以反映所選列的內容。執行此操作的 ReviewBoard 代碼包含此 CSS和此 JavaScript 。
我將它提取到一個相當小的jsbin 演示中。
這是CSS,可以創建單列選擇的外觀(您將selecting-left
selecting-right
添加到左列被選擇時,
.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;
}
這是 JavaScript 攔截copy
事件並插入單個列的數據:
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;
}
還有一些不太有趣的代碼可以在選擇的開頭添加selecting-left
和selecting-right
類。 這將需要更多的工作來推廣到 n 列表。
這在實踐中似乎效果很好,但令人驚訝的是它有多難!
您可以有一個 div,在單擊時填充列數據並應用 css class 以使列具有被選中的外觀
像這樣的東西:
var $mytable = $("#mytable"),
$copydiv = $("#copy_div");
$mytable.find("td").click(function(){
//get the column index
var $this = $(this),
index = $this.parent().children().index($this);
//find all cells in the same column
$mytable.find("tr:nth-child(" + index + ")").removeClass("selected").each(function () {
var $this = $(this);
$this.addClass("selected");
$copydiv.html($this.html() + "<br />");
});
});
或者您可以為每一列設置一個單獨的表格,但我認為這不值得。
這是一個完全不涉及 javascript 的 hack:
對於 Mac 上的 Chrome,請按command
+ option
+ J
。
對於 Mac 上的 Chrome,單擊檢查器左上角的選擇器圖標進入選擇器模式。
然后單擊表中的隨機單元格。
然后輸入這個規則(你可能想根據你的 HTML 稍微修改一下)
tr td {
display: none; # hide all cells
}
現在所有的細胞都應該消失了。
Go 前面並在該規則之上添加另一條規則:
tr td:nth-child(2) { # replace 2 with the index of the column you want to copy. 2 means the second column
display: table-cell; # display that column
}
現在,您要從中復制的列應該已經重新出現了。
所有其他列應該是不可見的並且不能被選中。
您可以通過刷新來恢復頁面。
如果您只想 select 一兩列,我發現這項工作非常完美。
新的:has()選擇器給了我在沒有 JS 的情況下解決這個問題的希望。 這個想法是禁用所有單元格的文本選擇,並且只為懸停的列的單元格激活它。
所以你會有這樣的規則:
table:has(tr td:nth-child(1):hover) tr td:nth-child(1) {
-webkit-user-select: auto;
user-select: auto;
}
可在此處找到完整示例: https://codepen.io/catlan/pen/XWELegW
這是正在進行中的工作,因為在當前版本的 Safari (15.6.1) 中,文本范圍的顯示在選擇完成后消失,僅在移動 cursor 幾個像素后重新出現。 見https://bugs.webkit.org/show_bug.cgi?id=244445
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.