Или используя ES6:
class Circular {
constructor() {
this.value = "Hello World";
this.self = this;
}
}
circular = new Circular();
У меня была точно та же проблема в прошлом и единственном способе, которым я нашел для фиксации его, должен был добавить обратный вызов в iframe страницу. Конечно, тот единственные работы, когда Вы управляете iframe содержанием.
У меня есть подобный код в моих проектах, который хорошо работает. Адаптируя мой код к Вашей функции, решение могло быть следующим:
function xssRequest(url, callback)
{
var iFrameObj = document.createElement('IFRAME');
iFrameObj.id = 'myUniqueID';
document.body.appendChild(iFrameObj);
iFrameObj.src = url;
$(iFrameObj).load(function()
{
callback(window['myUniqueID'].document.body.innerHTML);
document.body.removeChild(iFrameObj);
});
}
, Возможно, у Вас есть пустой innerHTML потому что (одна или обе причины): 1. необходимо использовать его против элемента тела 2. Вы удалили iframe из своей страницы DOM
Сначала идя именем функции xssRequest это кажется на попытку перекрестного запроса сайта - который, если правильно, Вы не собираетесь быть способными считать содержание iframe.
, С другой стороны, если URL iframe находится на Вашем домене, можно получить доступ к телу, но я нашел, что, если я использую тайм-аут для удаления iframe, обратный вызов хорошо работает:
// possibly excessive use of jQuery - but I've got a live working example in production
$('#myUniqueID').load(function () {
if (typeof callback == 'function') {
callback($('body', this.contentWindow.document).html());
}
setTimeout(function () {$('#frameId').remove();}, 50);
});
Я должен был сделать это в случаях, где документы, такие как документы в формате Word и pdfs передавались потоком к iframe и находились решение, которое работает вполне прилично. Ключ обрабатывает onreadystatechanged
событие на iframe.
Позволяет, говорят, что название Вашего кадра является "myIframe". Сначала где-нибудь в Вашем запуске кода (я, это встраивает любого, где после iframe), добавляет что-то вроде этого для регистрации обработчика событий:
document.getElementById('myIframe').onreadystatechange = MyIframeReadyStateChanged;
я не смог использовать атрибут onreadystatechage на iframe, я не могу помнить, почему, но приложение должен был работать в IE 7 и Safari 3, так, чтобы май фактор.
Вот пример, как получить полное состояние:
function MyIframeReadyStateChanged()
{
if(document.getElementById('myIframe').readyState == 'complete')
{
// Do your complete stuff here.
}
}
Я думаю, что событие загрузки правильное. Неправильно то, как вы извлекаете контент из dom содержимого iframe.
Вам нужен html страницы, загруженной в iframe, а не html объекта iframe.
Что вам нужно сделать - получить доступ к документу содержимого с помощью iFrameObj.contentDocument
.
Это возвращает dom страницы, загруженной внутри iframe, если она находится в том же домене, что и текущая страница.
Я бы извлек содержимое перед удалением iframe.
Я тестировал в firefox и opera.
Тогда, я думаю, вы можете получить свои данные с помощью $ (childDom) .html ()
или $ (childDom) .find ('some selector') ...
Внутренний HTML-код вашего iframe пуст, потому что ваш тег iframe не окружает никакого содержимого в родительском документе. Чтобы получить контент со страницы, на которую указывает атрибут src iframe, вам необходимо получить доступ к свойству contentDocument iframe. Однако будет выдано исключение, если src находится из другого домена. Это функция безопасности, которая предотвращает выполнение произвольного JavaScript на чужой странице, что может создать уязвимость межсайтового скриптинга. Вот пример кода, который иллюстрирует то, о чем я говорю:
<script src="http://prototypejs.org/assets/2009/8/31/prototype.js" type="text/javascript"></script>
<h1>Parent</h1>
<script type="text/javascript">
function on_load(iframe) {
try {
// Displays the first 50 chars in the innerHTML of the
// body of the page that the iframe is showing.
// EDIT 2012-04-17: for wider support, fallback to contentWindow.document
var doc = iframe.contentDocument || iframe.contentWindow.document;
alert(doc.body.innerHTML.substring(0, 50));
} catch (e) {
// This can happen if the src of the iframe is
// on another domain
alert('exception: ' + e);
}
}
</script>
<iframe id="child" src="iframe_content.html" onload="on_load(this)"></iframe>
Чтобы продолжить пример, попробуйте использовать это как содержимое iframe:
<h1>Child</h1>
<a href="http://www.google.com/">Google</a>
<p>Use the preceeding link to change the src of the iframe
to see what happens when the src domain is different from
that of the parent page</p>