2012-08-06 19 views
16

我正在使用阻止我们编辑头部部分的CMS。我需要将CSS样式表添加到站点,紧跟在标签之后。有没有办法做到这一点与JS,我可以添加一个脚本到页面的底部(我有权访问标签之前添加脚本),然后将样式表注入头部分?将样式表添加到正文中使用javascript

+2

字面上几个问题下来: http://stackoverflow.com/questions/11833325/css-hack-adding-css-in-the-body -of-a-website – Kwon 2012-08-06 18:23:13

+2

您使用的是哪种CMS?通常至少有一些方法可以包含它们 – 2012-08-06 18:23:36

+0

内联或外部样式表? – 2012-08-06 18:23:37

回答

52

更新:根据specslink元素不允许在正文中。但是,大多数浏览器仍然会呈现它。因此,要回答评论中的问题 - 真的必须将link添加到页面的head而不是body

function addCss(fileName) { 

    var head = document.head; 
    var link = document.createElement("link"); 

    link.type = "text/css"; 
    link.rel = "stylesheet"; 
    link.href = fileName; 

    head.appendChild(link); 
} 

addCss('{my-url}'); 

或者使用jQuery更容易一点点

function addCss(fileName) { 
    var link = $("<link />",{ 
    rel: "stylesheet", 
    type: "text/css", 
    href: fileName 
    }) 
    $('head').append(link); 
} 

addCss("{my-url}"); 

原来的答复

您不必一定将它添加到头部,只需将其添加到身体标记结束。

$('body').append('<link rel="stylesheet" type="text/css" href="{url}">') 

胡安·门德斯提到的,你可以将样式表的头部,而不是

$('head').append('<link rel="stylesheet" type="text/css" href="{url}">') 

而同样没有jQuery的(见上面的代码)

+3

您可以使用几乎相同的东西将其附加到头部。 – 2012-08-06 18:25:34

+0

@Juan Mendes,我知道,但我所说的是,它只是可以插入到身体 – vittore 2012-08-06 19:17:20

+0

嗨vittore,我已经添加了你提到的第二个脚本之前标签,但是,它似乎并没有在头部加载CSS ......想法?主要的问题是,我们正在创建一个新的样式表来覆盖CMS迫使我们使用的样式表。所以我们创建了一个新的样式表来覆盖他们的设置。我们希望在加载它们后加载RIGHT,否则,它们的样式表加载并显示该网站,然后几秒钟后,我们的更改显示出来... – 2012-08-06 19:39:28

12

这会对你在智能想要什么办法。也使用纯JS。

function loadStyle(href, callback){ 
    // avoid duplicates 
    for(var i = 0; i < document.styleSheets.length; i++){ 
     if(document.styleSheets[i].href == href){ 
      return; 
     } 
    } 
    var head = document.getElementsByTagName('head')[0]; 
    var link = document.createElement('link'); 
    link.rel = 'stylesheet'; 
    link.type = 'text/css'; 
    link.href = href; 
    if (callback) { link.onload = function() { callback() } } 
    head.appendChild(link); 
} 
+2

我已经编辑过,在for循环中添加缺少的'i':'if(document.styleSheets [i] .href == href){' – cronoklee 2016-03-08 11:47:31

+0

我尝试了将链接元素附加到头部的方法,并发现它可以工作,但是,这会在浏览器中引起非常明显的闪烁,因为所有内容都会重新渲染。我在谷歌浏览器上观察过这一点,但是所有不同浏览器的用户都在报告它。我试图用两种不同的产品获得相同的结果,并且他们都有非常不同的HTML,表明不管HTML是什么,都会发生闪光。长话短说,我不建议添加链接到头 – Trevor 2017-10-11 16:58:47

+0

解决方案是通过JS控制渲染。就像之前加载css一样,它用于加载的是什么。你可以添加一个回调参数并在函数内部加入一个onload事件。这会告诉你它什么时候可以使用。其他元素如框架,脚本等也是如此。 – Eddie 2017-12-20 22:12:43

4

我修改Eddie的功能删除切换样式表或关闭。它也会返回样式表的当前状态。例如,如果您希望在网站上为视力受损用户设置切换按钮,并且需要将他们的偏好保存在Cookie中,则这很有用。

function toggleStylesheet(href, onoff){ 
    var existingNode=0 //get existing stylesheet node if it already exists: 
    for(var i = 0; i < document.styleSheets.length; i++){ 
     if(document.styleSheets[i].href && document.styleSheets[i].href.indexOf(href)>-1) existingNode = document.styleSheets[i].ownerNode 
    } 
    if(onoff == undefined) onoff = !existingNode //toggle on or off if undefined 
    if(onoff){ //TURN ON: 
     if(existingNode) return onoff //already exists so cancel now 
     var link = document.createElement('link'); 
     link.rel = 'stylesheet'; 
     link.type = 'text/css'; 
     link.href = href; 
     document.getElementsByTagName('head')[0].appendChild(link); 
    }else{ //TURN OFF: 
     if(existingNode) existingNode.parentNode.removeChild(existingNode) 
    } 
    return onoff 
} 

使用范例:

toggleStylesheet('myStyle.css') //toggle myStyle.css on or off 

toggleStylesheet('myStyle.css',1) //add myStyle.css 

toggleStylesheet('myStyle.css',0) //remove myStyle.css 
+2

如何使用StyleSheet上的标准''.disabled''属性来打开/关闭 – 2017-02-09 10:54:57

+0

显然这是一个选项,第二次打开会快一点,但这需要函数中的第三种情况来处理已经处于禁用状态的样式表,所以这个函数会稍微长一些。 – cronoklee 2017-03-14 16:00:36

相关问题