JavaScript: createRange, работа с выделением

Тема в разделе "Другие языки", создана пользователем dazed, 29 дек 2010.

Модераторы: Цукер
  1. dazed

    dazed

    Регистр.:
    31 мар 2007
    Сообщения:
    208
    Симпатии:
    55
    С наступающим вас товарищи!

    Столкнулся с необходимостью получить из iframe который есть на странице, выделенный мышкой HTML.

    Работал с createRange, при получении выделенного текста в textarea, использовал такой код:

    Код:
    function get_selected(_obj_name)
    {
    
    var area=document.getElementsByName(_obj_name).item(0);
    
    // Mozilla 
    if (document.getSelection)
    { 
     var sel_txt = area.value.substring(area.selectionStart, area.selectionEnd);
    }else
    { // ie
     var sel_txt=document.selection.createRange().text; 
    }
     return sel_txt;
    }
    
    Вроде бы похожие вещи при работе с iframe должны, но не получается. Пробовал различные варианты. Кто нибудь поможет/подскажет с этим вопрос?
     
  2. dazed

    dazed

    Регистр.:
    31 мар 2007
    Сообщения:
    208
    Симпатии:
    55
    Куча материала перелопатил и вот получился работоспособный код:


    Код:
    	
    function get_selected_html_frame(iframe_id) {
      var iframe = document.getElementById(iframe_id);
      var win = iframe.contentWindow;
      var doc = iframe.contentDocument || win.document;
      var selText = "";
      if (win.getSelection) {
                    var selectionRange = win.getSelection();
                    selText = selectionRange.toString ();
                    if (selectionRange.rangeCount > 0) {
                        var range = selectionRange.getRangeAt (0);
                        var docFragment = range.cloneContents ();
                        var tmpDiv = document.createElement ("div");
                        tmpDiv.appendChild (docFragment);
                        var selHTML = tmpDiv.innerHTML;
                    }
    				return selHTML;
      } else if (doc.selection && doc.selection.createRange) {
        return doc.selection.createRange().htmlText;
      }
    }
    

    На удивление IE очень обрадовал. Намного легче получить html и более качественнее выделяется.

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

    Есть ли какоето красивое решение, чтобы разрешить это делать?
    Пока вижу вариант с загрузкой через PHP, но в этом случае по ползет графика.
     
  3. potuga

    potuga

    Регистр.:
    22 сен 2009
    Сообщения:
    376
    Симпатии:
    91
    Через JS родительского документа не получить доступ к дочернему iframe с другого домена. И да, именно в целях безопасности.
     
  4. wal

    wal Постоялец

    Регистр.:
    24 мар 2008
    Сообщения:
    89
    Симпатии:
    30
    iframe на div не получается заменить?

    с div таких проблем возникать не должно...