Добавить таблицу стилей в iframe с помощью jQuery
Я создаю редактор HTML, похожий на тот, который я печатаю прямо сейчас, с выводом ниже. Я использую iframe и выкидываю $htmlTextBox.val() в тело iframe.
Я пытаюсь создать таблицу стилей внутри iframe, чтобы она выглядела так же хорошо, как и работает.
Заранее спасибо!
$htmlTextBox.keyup(function(){
SetPreview();
});
function SetPreview()
{
var doc = $preview[0].contentWindow.document;
var $body = $("body", doc);
$body.html($htmlTextBox.val());
}
5 ответов
Хотя вы можете взаимодействовать с документом iframe document.styleSheets, надежным способом старой школы является либо наличие там таблицы стилей в первую очередь (путем написания iframe-src, указывающей на пустой документ с нужной таблицей стилей), либо помещение его на месте с document.write()
, Например:
<body>
<iframe></iframe>
<script type="text/javascript">
var d= frames[0].document;
d.open();
d.write(
'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional //EN" "http://www.w3.org/TR/html4/loose.dtd">'+
'<html><head><style type="text/css">'+
'body { font-size: 200%; }'+
'<\/style><\/head><body><\/body><\/html>'
);
d.close();
d.body.innerHTML= '<em>Hello</em>';
</script>
</body>
(При этом для документа iframe также будет установлен режим стандартов, если вы этого хотите.)
Следовать за:
HTML
<iframe id="message" name="message" />
JQuery
setTimeout(function() {
var $head = $("#message").contents().find("head");
$head.append($("<link/>",
{ rel: "stylesheet", href: url, type: "text/css" }
));
}, 1);
Мы можем вставить тег стиля в iframe.
<style type="text/css" id="cssID">
.className
{
background-color: red;
}
</style>
<iframe id="iFrameID"></iframe>
<script type="text/javascript">
$(function () {
$("#iFrameID").contents().find("head")[0].appendChild(cssID);
//Or $("#iFrameID").contents().find("head")[0].appendChild($('#cssID')[0]);
});
</script>
Предполагая, что вы находитесь в одном домене и не имеете дело с междоменной безопасностью, вам нужно будет проверить, загружен ли iFrame - НЕ ПРОСТО РАМКУ, НО ДОКУМЕНТА ВНУТРИ!! (Это повесило меня на некоторое время, пытаясь использовать .load()
)
Затем, используя jquery, получите доступ к содержимому, получите доступ к заголовку и добавьте свою таблицу стилей к заголовку.
$(document.getElementById('yourIframeID').contentWindow.document).ready(function() {
$('yourIframeID').contents().find('head').append('<link rel="stylesheet" href="/path/to/stylesheet/style.css" type="text/css" />');
});
Вытащил этот код ниже из источника jHtmlArea. Самое смешное, что эта функция была там, и я ее не осознавал. Я столкнулся с таким вопросом, когда пытался выяснить, как его реализовать.:)
Это не совсем "JQuery", но это работает. Я предполагаю, что что-то с append не работает с iframe, поэтому они сделали это в старой школе. Ответ Бобинса тоже выглядит хорошо, и может быть более надежным? Пока, похоже, это работает нормально.
var e = edit.createElement('link');
e.rel = 'stylesheet';
e.type = 'text/css';
e.href = options.css;
this.iframe[0].contentWindow.document.getElementsByTagName('head')[0].appendChild(e);
РЕДАКТИРОВАТЬ: Я думаю, что причина этого работает, если это тот же домен (включая создание iframe в js). В противном случае обычные блоки безопасности браузера не позволят вам манипулировать iframe dom.
Смотрите Как применить CSS к iFrame