Как получить содержание тела 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);