You can't access data inside an iframe
that is from a domain different than yours.
This is due to the Same origin policy.
You need to get the selection from the document/window in the iframe.
function getIframeSelectionText(iframe) {
var win = iframe.contentWindow;
var doc = win.document;
if (win.getSelection) {
return win.getSelection().toString();
} else if (doc.selection && doc.selection.createRange) {
return doc.selection.createRange().text;
}
}
var iframe = document.getElementById("my");
alert(getIframeSelectionText(iframe));
document.getSelection
Is on the outer document. To get the selection of the document in the iframe you need to grab the inner document:
var iframe= document.getElementById('my');
var idoc= iframe.contentDocument || iframe.contentWindow.document; // ie compatibility
idoc.getSelection()
Note however that WebKit does not support document.getSelection()
or document.selection
. Try replacing it with window.getSelection()
which works in both Firefox and WebKit, but returns a selection object (a collection/wrapper around Ranges), which needs stringing:
var idoc= iframe.contentDocument || iframe.contentWindow.document;
var iwin= iframe.contentWindow || iframe.contentDocument.defaultView;
''+iwin.getSelection()
I'm not sure what the point of this is:
if (window.RegExp) {
var regstr = unescape("%20%20%20%20%20");
var regexp = new RegExp(regstr, "g");
str = str.replace(regexp, "");
}
RegExp
is basic JavaScript dating back to the very earliest version; it will always be there, you don't have to sniff for it. The URL-encoding of multiple spaces is quite unnecessary. You don't even need RegExp as such, a string replace could be written as:
str= str.split(' ').join('');
Following code will return the selected text.
function getSelectedText(frameId) {
// In ExtJS use:
// var frame = Ext.getDom(frameId);
var frame = document.getElementById(frameId);
var frameWindow = frame && frame.contentWindow;
var frameDocument = frameWindow && frameWindow.document;
if (frameDocument) {
if (frameDocument.getSelection) {
// Most browsers
return String(frameDocument.getSelection());
}
else if (frameDocument.selection) {
// Internet Explorer 8 and below
return frameDocument.selection.createRange().text;
}
else if (frameWindow.getSelection) {
// Safari 3
return String(frameWindow.getSelection());
}
}
/* Fall-through. This could happen if this function is called
on a frame that doesn't exist or that isn't ready yet. */
return '';
}
Hope this will help to someone.
This code works in all modern browsers:
var iframe = document.getElementById('my');
var idoc = iframe.contentDocument || iframe.contentWindow.document; // ie compatibility
var text = idoc.getSelection().toString();