Looking to disable highlighting a table's first column.
<table>
<tbody>
<tr><td class="unselectable" unselectable="on"><button value="1" unselectable="on" class="unselectable"><div unselectable="on" class="unselectable">✘</div></button></td><td>Row 1</td></tr>
<tr><td class="unselectable" unselectable="on"><button value="2" unselectable="on" class="unselectable"><div unselectable="on" class="unselectable">✘</div></button></td><td>Row 2</td></tr>
<tr><td class="unselectable" unselectable="on"><button value="3" unselectable="on" class="unselectable"><div unselectable="on" class="unselectable">✘</div></button></td><td>Row 3</td></tr>
</tbody>
</table>
*.unselectable {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: -moz-none;
-ms-user-select: none;
user-select: none;
}
http://jsfiddle.net/2LQfg/1/
When the user selects and drags the mouse button over the table, the button text (✘) appears highlighted (undesired behaviour). When the user copies and pastes the values, the value (✘) is not included (desired behaviour).
To clarify, this is the current behaviour (undesired):
The following image shows the desired behaviour after dragging the mouse across the table:
Most users probably will not care, but it is a slightly misleading user experience. Whatever a user highlights text and copies it, it is expected that all highlighted text is copied. By adding the unselectable
class, the buttons' (✘) value is highlighted, but it will not be copied. The user simply should not be able to highlight (select) the (✘) because it is set to unselectable
.
I am using Firefox 19.0.2 on Xubuntu, but I seek a cross-browser solution.
What is a cross-browser way to prevent the user from highlighting the first table column (containing the buttons)?
You can use the user-select property to disable text selection of an element. In web browsers, if you double-click on some text it will be selected/highlighted. This property can be used to prevent this.
To disable text selection highlighting in Google Chrome browser using CSS just set -user-select CSS property to none. And no prefix is required for Google Chrome and Opera Browsers.
Browsers won't seem to copy the content if it's set via the content
CSS rule. Hopefully you don't need to support IE7
button.unselectable:after {
content: "\2718";
}
http://jsfiddle.net/ExplosionPIlls/2LQfg/50/
So far I have only found a rather inconvenient workaround for this. It hides all the "actual" text in the unselectable
element and replaces it with pseudo-text through a :before
pseudo-element. Note: if there is no need to actually have "actual" text in the html, then the nested span
elements (and therefore some of the redundant html) and associated css below can be eliminated, but that all depends on how "important" the text is in your real application (for screen readers, search engines, etc.).
Fiddle example.
HTML
<table>
<tbody>
<tr><td><button value="1"><div class="unselectable" data-content="✘"><span>✘</span></div></button></td><td>Row 1</td></tr>
<tr><td><button value="2"><div unselectable="on" class="unselectable" data-content="✘"><span>✘</span></div></button></td><td>Row 2</td></tr>
<tr><td><button value="3"><div unselectable="on" class="unselectable" data-content="✘"><span>✘</span></div></button></td><td>Row 3</td></tr>
</tbody>
</table>
CSS
*.unselectable {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: -moz-none;
-ms-user-select: none;
user-select: none;
}
*.unselectable span {
display: none;
}
*.unselectable:before {
content: attr(data-content);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With