我正在寻找一种使用JavaScript 将标记插入HTML页面的方法.
到目前为止我找到的最佳方式:
var divNode = document.createElement("div"); divNode.innerHTML = "
"; document.body.appendChild(divNode);
这适用于Firefox,Opera和Internet Explorer,但不适用于Google Chrome.
IE的前端也有点难看.
有谁知道创建标签的方法
更好
适用于Chrome?
或者可能
这是我应该避免的非标准事情
三个工作浏览器很棒,谁还使用Chrome?
Christoph.. 610
尝试将style
元素添加到head
而不是body
.
这在IE(7-9),Firefox,Opera和Chrome中进行了测试:
var css = 'h1 { background: red; }', head = document.head || document.getElementsByTagName('head')[0], style = document.createElement('style'); head.appendChild(style); style.type = 'text/css'; if (style.styleSheet){ // This is required for IE8 and below. style.styleSheet.cssText = css; } else { style.appendChild(document.createTextNode(css)); }
@RobW - 在IE8及以下版本中不支持.现代浏览器支持它,但不是所有主要浏览器. (28认同)
仅供参考,所有主流浏览器均支持[`document.head`](https://developer.mozilla.org/en/DOM/document.head). (14认同)
@allenhwkim:答案早于`querySelector()`的引入; 今天,我可能会选择`document.head`,自IE9起可用 (7认同)
为什么不使用`document.querySelector("head")`?这是IE8支持的事件[来源](https://developer.mozilla.org/en-US/docs/Web/API/document.querySelector) (5认同)
在访问`style.styleSheet.cssText`之前,我必须将style元素附加到头部。在附加之前,`style.styleSheet`为null。 (2认同)
Christoph.. 36
这是一个脚本,它将IE风格createStyleSheet()
和addRule()
方法添加到没有它们的浏览器:
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; })(); }
您可以通过添加外部文件
document.createStyleSheet('foo.css');
并通过动态创建规则
var sheet = document.createStyleSheet(); sheet.addRule('h1', 'background: red;');
Tom.. 33
我假设您要插入style
标记与link
标记(引用外部CSS),这就是以下示例所做的:
Example Page This is styled dynamically via JavaScript.
另外,我在你的问题中注意到你正在使用innerHTML
.这实际上是一种将数据插入页面的非标准方式.最佳实践是创建文本节点并将其附加到另一个元素节点.
关于你的最后一个问题,你会听到一些人说你的工作应该适用于所有的浏览器.这一切都取决于你的观众.如果您的观众中没有人使用Chrome,那么请不要冒汗; 但是,如果您希望尽可能覆盖最大的受众群体,那么最好支持所有主要的A级浏览器
尝试将style
元素添加到head
而不是body
.
这在IE(7-9),Firefox,Opera和Chrome中进行了测试:
var css = 'h1 { background: red; }', head = document.head || document.getElementsByTagName('head')[0], style = document.createElement('style'); head.appendChild(style); style.type = 'text/css'; if (style.styleSheet){ // This is required for IE8 and below. style.styleSheet.cssText = css; } else { style.appendChild(document.createTextNode(css)); }
这是一个脚本,它将IE风格createStyleSheet()
和addRule()
方法添加到没有它们的浏览器:
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; })(); }
您可以通过添加外部文件
document.createStyleSheet('foo.css');
并通过动态创建规则
var sheet = document.createStyleSheet(); sheet.addRule('h1', 'background: red;');
我假设您要插入style
标记与link
标记(引用外部CSS),这就是以下示例所做的:
Example Page This is styled dynamically via JavaScript.
另外,我在你的问题中注意到你正在使用innerHTML
.这实际上是一种将数据插入页面的非标准方式.最佳实践是创建文本节点并将其附加到另一个元素节点.
关于你的最后一个问题,你会听到一些人说你的工作应该适用于所有的浏览器.这一切都取决于你的观众.如果您的观众中没有人使用Chrome,那么请不要冒汗; 但是,如果您希望尽可能覆盖最大的受众群体,那么最好支持所有主要的A级浏览器
一个有效且符合所有浏览器的示例:
var ss = document.createElement("link"); ss.type = "text/css"; ss.rel = "stylesheet"; ss.href = "style.css"; document.getElementsByTagName("head")[0].appendChild(ss);
document.head.insertAdjacentHTML("beforeend", ``)
通常需要覆盖现有规则,因此在HEAD中添加新样式并不适用于所有情况.
我想出了这个简单的函数,它总结了所有无效的 "附加到BODY"的方法,并且使用和调试(IE8 +)更方便.
window.injectCSS = (function(doc){ // wrapper for all injected styles and temp el to create them var wrap = doc.createElement('div'); var temp = doc.createElement('div'); // rules like "a {color: red}" etc. return function (cssRules) { // append wrapper to the body on the first call if (!wrap.id) { wrap.id = 'injected-css'; wrap.style.display = 'none'; doc.body.appendChild(wrap); } //
for IE: http://goo.gl/vLY4x7 temp.innerHTML = '
'; wrap.appendChild( temp.children[1] ); }; })(document);
演示:codepen,jsfiddle
以下是动态添加类的变体
function setClassStyle(class_name, css) { var style_sheet = document.createElement('style'); if (style_sheet) { style_sheet.setAttribute('type', 'text/css'); var cstr = '.' + class_name + ' {' + css + '}'; var rules = document.createTextNode(cstr); if(style_sheet.styleSheet){// IE style_sheet.styleSheet.cssText = rules.nodeValue; } else { style_sheet.appendChild(rules); } var head = document.getElementsByTagName('head')[0]; if (head) { head.appendChild(style_sheet); } } }
该对象变量会将style标签附加到具有type属性和一个简单转换规则的head标签上,该规则与每个id / class / element匹配。可以随意修改content属性并根据需要注入任意数量的规则。只要确保内容中的CSS规则保持一行即可(或者,如果愿意,可以“转义”每一行)。
var script = { type: 'text/css', style: document.createElement('style'), content: "* { transition: all 220ms cubic-bezier(0.390, 0.575, 0.565, 1.000); }", append: function() { this.style.type = this.type; this.style.appendChild(document.createTextNode(this.content)); document.head.appendChild(this.style); }}; script.append();