Как получить содержание тела iframe в Javascript?

<iframe id="id_description_iframe" class="rte-zone" height="200" frameborder="0" title="description">
  <html>
    <head></head>
    <body class="frameBody">
      test<br/>
    </body>
  </html>
</iframe>

Что я хочу получить это:

test<br/>

12 ответов

Точный вопрос в том, как сделать это с чистым JavaScript, а не с jQuery.

Но я всегда использую решение, которое можно найти в исходном коде jQuery. Это всего лишь одна строка нативного JavaScript.

Для меня это лучший, легко читаемый и даже кратчайший способ получить контент для фреймов.

Сначала получите свой iframe

var iframe = document.getElementById('id_description_iframe');

// or
var iframe = document.querySelector('#id_description_iframe');

А затем использовать решение JQuery

var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;

Это работает даже в Internet Explorer, который делает этот трюк во время contentWindow собственность iframe объект. Большинство других браузеров использует contentDocument свойство и это причина, почему мы сначала доказываем это свойство в этом условии ИЛИ. Если не установлено, попробуйте contentWindow.document,

Выберите элементы в iframe

Тогда вы можете обычно использовать getElementById() или даже querySelectorAll() выбрать DOM-элемент из iframeDocument:

if (!iframeDocument) {
    throw "iframe couldn't be found in DOM.";
}

var iframeContent = iframeDocument.getElementById('frameBody');

// or
var iframeContent = iframeDocument.querySelectorAll('#frameBody');

Вызов функций в iframe

Получить только window элемент из iframe вызывать некоторые глобальные функции, переменные или целые библиотеки (например, jQuery):

var iframeWindow = iframe.contentWindow;

// you can even call jQuery or other frameworks
// if it is loaded inside the iframe
iframeContent = iframeWindow.jQuery('#frameBody');

// or
iframeContent = iframeWindow.$('#frameBody');

// or even use any other global variable
iframeWindow.myVar = window.myVar;

// or call a global function
var myVar = iframeWindow.myFunction(param1 /*, ... */);

Заметка

Все это возможно, если вы соблюдаете политику одного происхождения.

Используя JQuery, попробуйте это:

$("#id_description_iframe").contents().find("body").html()

У меня отлично работает

document.getElementById('iframe_id').contentWindow.document.body.innerHTML;

AFAIK, Ифраме не может быть использован таким образом. Вам нужно указать его атрибут src на другую страницу.

Вот как получить содержимое своего тела, используя старый старый javascript. Это работает как с IE, так и с Firefox.

function getFrameContents(){
   var iFrame =  document.getElementById('id_description_iframe');
   var iFrameBody;
   if ( iFrame.contentDocument ) 
   { // FF
     iFrameBody = iFrame.contentDocument.getElementsByTagName('body')[0];
   }
   else if ( iFrame.contentWindow ) 
   { // IE
     iFrameBody = iFrame.contentWindow.document.getElementsByTagName('body')[0];
   }
    alert(iFrameBody.innerHTML);
 }

Использование content в iframe с JS:

document.getElementById('id_iframe').contentWindow.document.write('content');

Я думаю, что размещение текста между тегами зарезервировано для браузеров, которые не могут обрабатывать фреймы, т.е.

<iframe src ="html_intro.asp" width="100%" height="300">
  <p>Your browser does not support iframes.</p>
</iframe>

Вы используете атрибут 's rc', чтобы установить источник HTML-кода iframes...

Надеюсь, это поможет :)

Следующий код является кросс-браузерным. Он работает в IE7, IE8, Fx 3, Safari и Chrome, поэтому нет необходимости решать кросс-браузерные проблемы. Не тестировал в IE6.

<iframe id="iframeId" name="iframeId">...</iframe>

<script type="text/javascript">
    var iframeDoc;
    if (window.frames && window.frames.iframeId &&
        (iframeDoc = window.frames.iframeId.document)) {
        var iframeBody = iframeDoc.body;
        var ifromContent = iframeBody.innerHTML;
    }
</script>

Chalkey верен, вам нужно использовать атрибут src, чтобы указать страницу, которая будет содержаться в iframe. Если вы делаете это, и документ в iframe находится в том же домене, что и родительский документ, вы можете использовать это:

var e = document.getElementById("id_description_iframe");
if(e != null) {
   alert(e.contentWindow.document.body.innerHTML);
}

Очевидно, что вы можете сделать что-то полезное с содержимым, а не просто поставить их в оповещение.

Если вы хотите не просто выбрать тело своего iframe, но также вставить в него некоторый контент и сделать это с помощью чистого JS, без JQuery и без document.write(), у меня есть решение, которого нет в других ответах. .

Вы можете использовать следующие шаги

1.Выберите свой iframe:

      var iframe = document.getElementById("adblock_iframe");

2. Создайте элемент, который вы хотите вставить в рамку, скажем, изображение:

      var img = document.createElement('img');
img.src = "https://server-name.com/upload/adblock" + id + ".jpg";
img.style.paddingLeft = "450px";
//scale down the image is we have a high resolution screen on the client side
if (retina_test_media == true && high_res_test == true) {
    img.style.width = "200px";
    img.style.height = "50px";
} else {
    img.style.width = "400px";
    img.style.height = "100px";
}
img.id = "image";

3. Вставьте элемент изображения в iframe:

      iframe.contentWindow.document.body.appendChild(img);

Чтобы получить содержимое тела из javascript, я попробовал следующий код:

var frameObj = document.getElementById('id_description_iframe');

var frameContent = frameObj.contentWindow.document.body.innerHTML;

где id_description_iframe - идентификатор вашего iframe. У меня этот код работает нормально.

Вы можете получить содержимое тела iframe в одной строке кода:

      document.getElementsByTagName('iframe')[0].contentWindow.document.body.innerText;
      const iframe1 = document.getElementById('iframe1');
const iframeContent = iframe1.contentWindow.document.body.innerHTML;

const iframeContentDiv = document.createElement('div');
iframeContentDiv.innerHTML = iframeContent;

document.body.appendChild(iframeContentDiv);
Другие вопросы по тегам