views:

1456

answers:

4
<html>


<body>



 <script type="text/javascript">

   function smth() {

    if (document.getSelection) {
    var str = document.getSelection();
    if (window.RegExp) {
      var regstr = unescape("%20%20%20%20%20");
      var regexp = new RegExp(regstr, "g");
      str = str.replace(regexp, "");
    }
    } else if (document.selection && document.selection.createRange) {
     var range = document.selection.createRange();
     var str = range.text;
    }   

    alert(str);

   }


 </script>


    <iframe id="my"  width="300" height="225">
   .....some html ....
     </iframe>  


 <a href="#" onclick="smth();">AA</a>

</body>



</html>

with smth function i can get selected text from some div, but it doesnt work with iframe. any ideas how to get selected text from iframe ? thanks

+1  A: 

You can't access data inside an iframe that is from a domain different than yours. This is due to the Same origin policy.

Luca Matteis
ok , sorry wrong example, in iframe i have text, i use iframe for wysiwig editor, so it isn't on different domain.
mm
+1  A: 

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));
Tim Down
+3  A: 

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('');
bobince
window.getSelection() returns a selection object, not a Range. toString on the selection will give you the selection text though.
Tim Down
Yep, `''+` is an idiom for toString.
bobince
Yes, I know. I was correcting a minor error in your referring to the selection object returned from window.getSelection() as a Range but agreeing with you that your code would work.
Tim Down
Oh! yes, I see what you mean. will fix, ta!
bobince
A: 

WOOOOOOOWWWW

Tim Down

u are awesome!!! this one really worked for me !!!

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));
Alessandro