使用Javascript选择完整的表格(用于复制到剪贴板)
问题:如何使用JavaScript选择一个完整的表格(以便复制到剪贴板)?
原因:在IE 9“标准模式”下,代码无法正常工作,控制台会显示一个关于无法完成操作的错误信息,错误代码为800a025e,与代码中的range.select();
相关。该问题在Quirks模式下和将浏览器模式设置为IE 8时可以正常工作。
解决方法:在代码中添加一个解决方法,使用document.createRange()
和window.getSelection()
来选择元素的内容,并在range.selectNodeContents(el)
抛出异常时使用range.selectNode(el)
。
代码如下:
function selectElementContents(el) { var body = document.body, range, sel; if (document.createRange && window.getSelection) { range = document.createRange(); sel = window.getSelection(); sel.removeAllRanges(); try { range.selectNodeContents(el); sel.addRange(range); } catch (e) { range.selectNode(el); sel.addRange(range); } } else if (body.createTextRange) { range = body.createTextRange(); range.moveToElementText(el); range.select(); } }
使用方法:
<table id="tableId" border="1">
<thead>
<tr><th>Heading 1</th><th>Heading 2</th></tr>
</thead>
<tbody>
<tr><td>cell 1</td><td>cell 2</td></tr>
</tbody>
</table>
<input type="button" value="select table" onclick="selectElementContents( document.getElementById('tableId') );">
以上就是使用JavaScript选择完整表格并复制到剪贴板的方法。
问题的原因是在Javascript中选择一个完整的表格(以便复制到剪贴板)时,代码只能选择DIV元素,而不能直接选择HTML表格。解决方法是在需要选择的表格周围添加一个包装的DIV元素,然后将其作为参数传递给SelectContent函数。在函数中,使用不同的方法来选择和复制内容,根据不同的浏览器兼容性。
// 修改HTML按钮代码 // Javascript函数 function SelectContent(el) { var elemToSelect = document.getElementById(el); if (window.getSelection) { // 所有浏览器,除了IE9之前的版本 var selection = window.getSelection(); var rangeToSelect = document.createRange(); rangeToSelect.selectNodeContents(elemToSelect); selection.removeAllRanges(); selection.addRange(rangeToSelect); } else if (document.body.createTextRange) { // IE9之前的版本 var rangeToSelect = document.body.createTextRange(); rangeToSelect.moveToElementText(elemToSelect); rangeToSelect.select(); } else if (document.createRange && window.getSelection) { // 其他浏览器 range = document.createRange(); range.selectNodeContents(el); sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); } } // 使用示例
数据
通过以上代码,我们可以在点击按钮时选择整个表格,并将其内容复制到剪贴板中。需要注意的是,这个方法只适用于选择DIV元素包含的表格,而不适用于直接选择HTML表格。
问题的原因是在复制表格内容时,会额外复制一个空白行。但是在HTML中并没有这个空白行。
解决方法是在选择表格内容之前,先排除掉空白行。具体代码如下:
function selectElementContents(el) { var body = document.body, range, sel; if (document.createRange && window.getSelection) { range = document.createRange(); sel = window.getSelection(); sel.removeAllRanges(); try { // 排除空白行 var firstRow = el.getElementsByTagName("tr")[0]; if(firstRow && firstRow.childNodes.length > 0){ var firstCell = firstRow.childNodes[0]; if(firstCell){ range.setStartAfter(firstCell); } } range.selectNodeContents(el); sel.addRange(range); } catch (e) { range.selectNode(el); sel.addRange(range); } document.execCommand("copy"); } else if (body.createTextRange) { range = body.createTextRange(); range.moveToElementText(el); range.select(); range.execCommand("Copy"); } }
这样修改后的代码会先找到表格的第一个单元格,然后将选择范围设置在第一个单元格之后,从而排除了空白行的复制。