Получить HTML внутри iframe с помощью jQuery

вот моя ситуация.

у меня есть файл с названием iframe.html, в котором содержится код для слайд-шоу. Код-то вроде

<html>
  <head>
    <!-- Have added title and js files (jquery, slideshow.js) etc. -->
  </head>

  <body>
    <!-- Contains the images which are rendered as slidehow. -->
    <!-- have hierarchy like 'div' inside 'div' etc. -->
  </body>
</html>

пользователи могут использовать код вставки для добавления слайд-шоу в свои блоги или веб-сайты (могут быть из разных доменов). Предположим, пользователь должен встроить слайд-шоу в index.html, они могут добавить, добавив следующие строки:

<iframe id="iframe" src="path_to_iframe.html" width="480" height="320" scrolling="no" frameborder="0"></iframe>

это принесет полный HTML-код из iframe.html to index.html, теперь мне нужно способ доступа к элементам в iframe для настройки некоторых их свойств.

как и в коде, ширина и высота iframe устанавливаются Пользователем в некоторые фиксированные размеры. Я хотел бы настроить размер слайд-шоу (и содержащихся в нем изображений) на размер контейнера iframe. Как лучше всего это сделать?

я безуспешно пытался получить доступ к компонентам iframe из index.html что-то вроде

$('#iframe').contents();

но получить ошибка:

TypeError: не удается вызвать метод "содержимое" null

Итак, я думаю реализовать логику в iframe.html где слайд-шоу должно проверить ширину и высоту родителя и установить его высоту соответственно.

Я очень сильно смущает, надеюсь, что мой вопрос имеет смысл для большинства. Пожалуйста, не стесняйтесь спрашивать дальнейшие объяснения. Ваша помощь ценится.

10 ответов


эта строка будет извлекать весь HTML-код фрейма. Используя другие методы вместо innerHTML вы можете пересечь DOM внутреннего документа.

document.getElementById('iframe').contentWindow.document.body.innerHTML

следует помнить, что это будет работать только в том случае, если Источник кадра находится в том же домене. Если он из другого домена, защита от межсайтовых сценариев (XSS) сработает.


попробуйте этот код:

$('#iframe').contents().find("html").html();

это вернет весь html в вашем iframe. Вместо .find("html") вы можете использовать любой селектор, например:.find('body'),.find('div#mydiv').


var iframe = document.getElementById('iframe');
  $(iframe).contents().find("html").html();

$(editFrame).contents().find("html").html();

Если у вас Div в одном окне iframe

 <iframe id="ifrmReportViewer" name="ifrmReportViewer" frameborder="0" width="980"

     <div id="EndLetterSequenceNoToShow" runat="server"> 11441551 </div> Or

     <form id="form1" runat="server">        
       <div style="clear: both; width: 998px; margin: 0 auto;" id="divInnerForm">          

            Some Text

        </div>
     </form>
 </iframe>

затем вы можете найти текст Div используя следующий код

var iContentBody = $("#ifrmReportViewer").contents().find("body");
var endLetterSequenceNo = iContentBody.find("#EndLetterSequenceNoToShow").text();

var divInnerFormText = iContentBody.find("#divInnerForm").text();

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


это работает для меня, потому что он отлично работает в IE8.

$('#iframe').contents().find("html").html();

но если вы хотите использовать javascript в стороне для jquery, вы можете использовать это

var iframe = document.getElementById('iframecontent');
var innerDoc = iframe.contentDocument || iframe.contentWindow.document;
var val_1 = innerDoc.getElementById('value_1').value;

просто для справки. Вот как это сделать с jQuery (полезно, например, когда вы не можете запроса по id элемента):

$('#iframe').get(0).contentWindow.document.body.innerHTML

Это может быть другое решение, если jquery загружен в iframe.формат html.

$('#iframe')[0].contentWindow.$("html").html()

почему бы не попробовать Ajax, проверить часть кода 1 или часть 2 (использовать комментарий).

$(document).ready(function(){ 
	console.clear();
/*
    // PART 1 ERROR
    // Uncaught SecurityError: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Sandbox access violation: Blocked a frame at "http://stacksnippets.net" from accessing a frame at "null".  Both frames are sandboxed and lack the "allow-same-origin" flag.
	console.log("PART 1:: ");
	console.log($('iframe#sandro').contents().find("html").html());
*/
	// PART 2
	$.ajax({
		url: $("iframe#sandro").attr("src"),
		type: 'GET',
		dataType: 'html'
	}).done(function(html) {
		console.log("PART 2:: ");
		console.log(html);
	});

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<html>
<body>
<iframe id="sandro" src="https://jsfiddle.net/robots.txt"></iframe>
</body>
</html>

$('#iframe').load(function() {
    var src = $('#iframe').contents().find("html").html();
    alert(src);
});