В настоящее время я пытаюсь получить содержимое тела iframe без искажения содержимого браузером.
Я мог бы сделать это, включив содержимое в текстовую область, однако я хочу этого избежать.
использование .innerHTML приводит к специальным символам, таким как <
>
и &
преобразуется в <
, >
и &
соответственно.
Для тестирования создайте HTML-файл, содержащий:
{
"id": 5,
"testtext":"I am > than this & < that",
"html":"<div>\"worky\"</div>"
}
, а затем другую страницу, которая включает этот файл вiframe:
<!doctype html>
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
<iframe id="myIframe" name="myIframe" src="test.html"></iframe><br />
Result:<br />
<textarea id='result'></textarea>
<script>
$("#myIframe").load(function(){
var iframeBody = window.frames.myIframe.document
.getElementsByTagName("body")[0], result;
result = iframeBody.innerHTML;
$("#result").val(result);
});
</script>
</body>
</html>
Я пробовал это:
result = $(iframeBody).contents().map(function(){
return this.nodeValue ? this.nodeValue : this.innerHTML;
}).get().join("");
однако он теряет div.
РЕДАКТИРОВАТЬ:
У меня есть какое-то решение,
var iframeBody, result;
$("#myIframe").load(function(){
iframeBody = window.frames.myIframe.document
.getElementsByTagName("body")[0];
result = $(iframeBody).contents().map(function(){
if (this.nodeValue) {
return this.nodeValue
}
else {
return $(this).clone().wrap('<p>').parent().html();
}
}).get().join("");
$("#result").val(result);
});
Однако оно по-прежнему будет кодировать вещи в html, которые не являются html.Я не уверен, если я в порядке с этим.
ИЗМЕНИТЬ СНОВА
Вот немного больше контекста.Я изменяю транспорт jjery iframe ajax для работы, не требуя textarea в iframe для хранения контента, когда контент не является HTML.По большей части он работает нормально без текстовой области, однако в конечном итоге искажает любые специальные символы HTML, когда вы извлекаете этот текст с использованием .innerHTML.Один из способов избежать искажения - получить текст с помощью .nodeValue, однако это не сработает, когда вы натолкнетесь на элемент html.Если по какой-либо причине вы возвращаете json, который содержит строку html, он должен иметь возможность извлекать эту строку json точно так, как она была возвращена в iframe, что означает, что все символы остаются без изменений.
Для целейтестирование, это jsfiddle достаточно теста.Представьте, что div, используемый в скрипте, является телом iframe, и вы можете проверить результаты в jsfiddle.Проблема, которая у меня есть, на самом деле не имеет ничего общего с iframe или событием загрузки.
http://jsfiddle.net/P623a/2/
В этой скрипке единственной проблемой является & преобразование в & изнутриdiv внутри json.
Решение
Я просто потребую, чтобы страница была правильно закодирована (application / json, script или plain / text)если ответ является json / jsonp / script и содержит элемент dom.Если при этих условиях он не закодирован должным образом, запускается обработчик ошибок.
При правильном кодировании iframe в конечном итоге будет иметь тег body, содержащий your content
, который можно получить с помощью .innerText
при сохранении специальных символов.