как получить выделенный текст из iframe с помощью javascript?

<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>

с функцией smth я могу получить выделенный текст из некоторого div, но он не работает с iframe. есть идеи, как получить выделенный текст из iframe?


person mm.    schedule 24.09.2009    source источник


Ответы (5)


документ.getSelection

Находится во внешнем документе. Чтобы получить выбор документа в iframe, вам нужно захватить внутренний документ:

var iframe= document.getElementById('my');
var idoc= iframe.contentDocument || iframe.contentWindow.document; // ie compatibility

idoc.getSelection()

Однако обратите внимание, что WebKit не поддерживает document.getSelection() или document.selection. Попробуйте заменить его на window.getSelection(), который работает как в Firefox, так и в WebKit, но возвращает объект выбора (коллекцию/оболочку вокруг диапазонов), для которого требуется строка:

var idoc= iframe.contentDocument || iframe.contentWindow.document;
var iwin= iframe.contentWindow || iframe.contentDocument.defaultView;

''+iwin.getSelection()

Я не уверен, в чем смысл этого:

if (window.RegExp) {
  var regstr = unescape("%20%20%20%20%20");
  var regexp = new RegExp(regstr, "g");
  str = str.replace(regexp, "");
}

RegExp — это базовый JavaScript, относящийся к самой ранней версии; он всегда будет там, вам не нужно его нюхать. URL-кодирование нескольких пробелов совершенно не нужно. Вам даже не нужен RegExp как таковой, замена строки может быть записана как:

str= str.split('     ').join('');
person bobince    schedule 24.09.2009
comment
window.getSelection() возвращает объект выбора, а не диапазон. Однако toString при выборе даст вам текст выбора. - person Tim Down; 24.09.2009
comment
Да, ''+ — это идиома для toString. - person bobince; 24.09.2009
comment
Да, я знаю. Я исправлял небольшую ошибку в том, что вы ссылались на объект выбора, возвращаемый из window.getSelection() как на диапазон, но соглашался с вами, что ваш код будет работать. - person Tim Down; 24.09.2009
comment
Ой! да, я понимаю, что вы имеете в виду. исправлю, та! - person bobince; 24.09.2009
comment
Я получал неопределенный контентWindow для iframe. Кажется, что правильный способ получить окно для iframe - использовать «window.frames». window.frames[0].getSelection() дает мне то, что я искал - person vivek.m; 14.04.2016

Вам нужно получить выбор из документа/окна в 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));
person Tim Down    schedule 24.09.2009

Вы не можете получить доступ к данным внутри iframe домена, отличного от вашего. Это связано с политикой единого происхождения.

person Luca Matteis    schedule 24.09.2009
comment
хорошо, извините за неправильный пример, в iframe у меня есть текст, я использую iframe для редактора wysiwig, поэтому он не находится в другом домене. - person mm.; 24.09.2009

Следующий код вернет выбранный текст.

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 ''; 
}

Надеюсь, это поможет кому-то.

person Nandha    schedule 13.02.2013
comment
В firefox в консоли: Ошибка: Отказано в доступе к свойству «документ». Это в строке где находится: var frameDocument = [...]. - person Piotrek; 30.06.2013

Этот код работает во всех современных браузерах:

var iframe = document.getElementById('my');
var idoc = iframe.contentDocument || iframe.contentWindow.document; // ie compatibility
var text = idoc.getSelection().toString();
person ykay says Reinstate Monica    schedule 17.07.2017