Reputation: 1409
Looking for a method to target selected text and perform an action on it in Javascript. What kind of methods should I be using? Is this a job for jQuery? Thanks so much!
EDIT: Earlier answers regarded targeting a CSS class. I'm looking for clicking and highlighting/selecting text and then acting on that in JS. Thanks!
EDIT 2: I've been asked for an example of this function. Here's one but the code has poor reviews. Let me know what you think.
Upvotes: 6
Views: 2627
Reputation: 147513
It is quite difficult to write a cross browser, generic "get selected text" function. If you can limit your requirements to say only text selected in a page, then life is simpler.
But if you want to be able to get text selections from anywhere (inside form controls, button labels, general text), then life is tough.
Here's a function I wrote some time ago, it worked well enough for the application it was used in:
/*
* This function returns the selected text in a document.
* If no text selected, returns an empty string.
*
* Call on one of the following events:
*
* mouseup - most appropriate event
* for selection by mousedown, drag to select, mouseup
* may select only whitespace
*
* dblclick - not as appropriate as mouseup
* for selection of word by double click
* may select only whitespace
*
* Note that text can be selected in ways that do not dispatch
* an event, e.g. selecting all the text in the document using:
* ctrl + a
* context menu -> Select All
* edit menu -> Select All
* programmatically selecting text
*/
function checkForSelectedText(e) {
var e = e || window.event;
var el = e.target || e.srcElement;
var tagName = el.tagName && el.tagName.toLowerCase();
var t;
var d = document;
// Try DOM 2 Range - for most browsers, including IE 6+
// However, doesn't get text selected inside form controls
// that allow selection of text content (input type text,
// textarea)
if (d && d.selection && d.selection.createRange) {
t = d.selection.createRange().text;
// Otherwise try HTML5 - note that getSelection returns
// a string with extra properties. This may also get
// text within input and textarea
} else if (d.getSelection) {
t = d.getSelection();
}
// If didn't get any text, see if event was inside
// inupt@type=text or textarea and look for text
if (t == '') {
if (tagName == 'textarea' ||
(tagName == 'input' && el.type == 'text')) {
// Check selectionStart/End as otherwise if no text
// selected, IE returns entire text of element
if (typeof el.selectionStart == 'number' &&
el.selectionStart != el.selectionEnd) {
t = el.value.substring(el.selectionStart, el.selectionEnd)
}
}
}
return t;
}
Upvotes: 5
Reputation: 75777
Try window.getSelection
, you should also be reading up on Selection and Range.
Upvotes: 4