将HTML / CSS注入Iframe(无jQuery)

时间:2017-03-06 14:37:57

标签: javascript iframe

所有textarea和iframe元素都有一个数据属性(数据组),用于将所有textarea内容组合成具有相同数据属性值的iframe。

我也给textarea元素一个类值为#34; html"或" css"取决于它的内容,这允许我通过JavaScript迭代它们。

一切正常,但我不确定我是否正确地将内容注入iframe。

当我在注入内容后检查iframe时,CSS(令人惊讶地)被添加到文档的HEAD中,这就是我想要的;但是,考虑到我没有直接定位iframe文档的HEAD,这肯定是错误的,例如:

iframe.document.getHeadOfIframeDocument.innerHTML = css;

无论如何,这是我现在提出的:

CSS

<textarea class="code_block css" data-group="1" readonly cols="48" rows="16">
p { color: red; }
</textarea>

HTML

<textarea class="code_block html" data-group="1" readonly cols="48" rows="16">
<p>Test 1</p>
</textarea>

<textarea class="code_block html" data-group="1" readonly cols="48" rows="16">
<p>Test 2</p>
</textarea>

<div class="result">
<iframe data-group="1" width="400" height="400"></iframe>
</div><!-- END .result -->

JS

window.onload = function() {
    var res = document.getElementsByClassName('result'),
    src_html = document.getElementsByClassName('html'),
    src_css = document.getElementsByClassName('css'),
    n_res = res.length,
    n_html = src_html.length,
    n_css = src_css.length,
    i,n,j;

    for (i = 0; i < n_res; i++) { // For every result on page
        // Group sources with result
        var group = res[i].getElementsByTagName('iframe')[0].getAttribute('data-group'),
        css = '',
        html = '';

        // CSS
        for (n = 0; n < n_css; n++) {
            if (src_css[n].getAttribute('data-group') == group) {
                css += src_css[n].value;
            }
        }

        // HTML
        for (j = 0; j < n_html; j++) {
            if (src_html[j].getAttribute('data-group') == group) {
                html += src_html[j].value;
            }
        }

        var iframe = res[i].getElementsByTagName('iframe')[0],
        iframe = iframe.contentWindow || iframe.contentDocument.document || iframe.contentDocument,
        content = '';

        if (css.length > 0) {
            content += '<style type="text/css">' + css + '</style>';
        }
        if (html.length > 0) {
            content += html;
        }

        iframe.document.open()
        if (content.length > 0) {
            iframe.document.write(content);
        } else {
            iframe.document.write('<p>No content found.</p>');
        }   
        iframe.document.close();
    }
};

修改 我和JS一起玩,这看起来效果很好;仍然好奇你的建议:

window.onload = function() {
    var res = document.getElementsByClassName('result'),src_html = document.getElementsByClassName('html'),src_css = document.getElementsByClassName('css'),
    n_res = res.length,n_html = src_html.length,n_css = src_css.length,i,n,j,group,css,html,iframe,doctype,head,body,charset,title,style;

    for (i = 0; i < n_res; ++i) { // For every result on page
        // Group sources with result
        group = res[i].getElementsByTagName('iframe')[0].getAttribute('data-group');
        css = '';
        html = '';

        // CSS
        for (n = 0; n < n_css; ++n) {
            if (src_css[n].getAttribute('data-group') === group) {
                css += src_css[n].value;
            }
        }

        // HTML
        for (j = 0; j < n_html; ++j) {
            if (src_html[j].getAttribute('data-group') === group) {
                html += src_html[j].value;
            }
        }

        iframe = res[i].getElementsByTagName('iframe')[0];
        iframe = iframe.contentWindow || iframe.contentDocument.document || iframe.contentDocument;
        if (iframe) {
            doctype = document.implementation.createDocumentType('html','','');
            head = document.getElementsByTagName('head')[0];
            body = document.getElementsByTagName('body')[0];
            charset = document.createElement('meta');
            title = document.createElement('title');

            iframe.document.insertBefore(doctype,iframe.document.childNodes[0]);

            iframe.document.getElementsByTagName('html')[0].setAttribute('lang','en');
            charset.setAttribute('charset','UTF-8');
            iframe.document.head.appendChild(charset);
            title.appendChild(document.createTextNode('Snippet'));
            iframe.document.head.appendChild(title);

            if (css) {
                style = document.createElement('style');
                style.type = 'text/css';
                style.appendChild(document.createTextNode(css));
                iframe.document.getElementsByTagName('head')[0].appendChild(style);
            }
            if (html) {
                iframe.document.getElementsByTagName('html')[0].innerHTML += html;
            }
            if (!css && !html) {
                iframe.document.getElementsByTagName('html')[0].innerHTML = '<p>No content.</p>';
            }
        }
    }
};

0 个答案:

没有答案