How to create a <style> tag with Javascript

I'm looking for a way to insert a <style> tag into an HTML page with JavaScript.

The best way I found so far:

var divNode = document.createElement("div");
divNode.innerHTML = "<br><style>h1 { background: red; }</style>";
document.body.appendChild(divNode);

This works in Firefox, Opera and Internet Explorer but not in Google Chrome. Also it's a bit ugly with the <br> in front for IE.

Does anyone know of a way to create a <style> tag that

  • Is nicer

  • Works with Chrome?

  • Or maybe

  • This is a non-standard thing I should avoid

  • Three working browsers are great and who uses Chrome anyway?


  • Try adding the style element to the head rather than the body .

    This was tested in IE (7-9), Firefox, Opera and Chrome:

    var css = 'h1 { background: red; }',
        head = document.head || document.getElementsByTagName('head')[0],
        style = document.createElement('style');
    
    style.type = 'text/css';
    if (style.styleSheet){
      style.styleSheet.cssText = css;
    } else {
      style.appendChild(document.createTextNode(css));
    }
    
    head.appendChild(style);
    

    Here's a script which adds IE-style createStyleSheet() and addRule() methods to browsers which don't have them:

    if(typeof document.createStyleSheet === 'undefined') {
        document.createStyleSheet = (function() {
            function createStyleSheet(href) {
                if(typeof href !== 'undefined') {
                    var element = document.createElement('link');
                    element.type = 'text/css';
                    element.rel = 'stylesheet';
                    element.href = href;
                }
                else {
                    var element = document.createElement('style');
                    element.type = 'text/css';
                }
    
                document.getElementsByTagName('head')[0].appendChild(element);
                var sheet = document.styleSheets[document.styleSheets.length - 1];
    
                if(typeof sheet.addRule === 'undefined')
                    sheet.addRule = addRule;
    
                if(typeof sheet.removeRule === 'undefined')
                    sheet.removeRule = sheet.deleteRule;
    
                return sheet;
            }
    
            function addRule(selectorText, cssText, index) {
                if(typeof index === 'undefined')
                    index = this.cssRules.length;
    
                this.insertRule(selectorText + ' {' + cssText + '}', index);
            }
    
            return createStyleSheet;
        })();
    }
    

    You can add external files via

    document.createStyleSheet('foo.css');
    

    and dynamically create rules via

    var sheet = document.createStyleSheet();
    sheet.addRule('h1', 'background: red;');
    

    I'm assuming that you're wanting to insert a style tag versus a link tag (referencing an external CSS), so that's what the following example does:

    <html>
     <head>
      <title>Example Page</title>
     </head>
     <body>
      <span>
       This is styled dynamically via JavaScript.
      </span>
     </body>
     <script type="text/javascript">
       var styleNode = document.createElement('style');
       styleNode.type = "text/css";
       // browser detection (based on prototype.js)
       if(!!(window.attachEvent && !window.opera)) {
            styleNode.styleSheet.cssText = 'span { color: rgb(255, 0, 0); }';
       } else {
            var styleText = document.createTextNode('span { color: rgb(255, 0, 0); } ');
            styleNode.appendChild(styleText);
       }
       document.getElementsByTagName('head')[0].appendChild(styleNode);
     </script>
    </html>
    

    Also, I noticed in your question that you are using innerHTML . This is actually a non-standard way of inserting data into a page. The best practice is to create a text node and append it to another element node.

    With respect to your final question, you're going to hear some people say that your work should work across all of the browsers. It all depends on your audience. If no one in your audience is using Chrome, then don't sweat it; however, if you're looking to reach the biggest audience possible, then it's best to support all major A-grade browsers

    链接地址: http://www.djcxy.com/p/88108.html

    上一篇: CSS + FireFox:将滚动条隐藏在iframe上并且滚动= yes

    下一篇: 如何用Javascript创建一个<style>标签