javascript - 动态切换 CSS 文件

标签 javascript jquery css

尝试使用以下代码加载页面时收到两条错误消息。错误消息是:

  1. “未捕获类型错误:无法在 HTMLAnchorElement.col 处将属性“href”设置为 null。(匿名函数).onclick ( http://www.jimbrink.org/:363:17 )”
  2. “ Uncaught ReferenceError :bindEvents 未在(索引):375 处定义”

我正在尝试创建一个链接,单击该链接会切换到另一个 css 文件(具有不同的字体)。

(额外问题:有没有办法让链接在两个样式表之间切换?)

我从另一个 StackOverflow 问题中获取了这个问题,但我似乎无法让代码适合我的情况。

这是链接:

                <li><a href="#" class="changeStyle" data-style="css/style.comicsans.css" data-type="text/css" data-rel="stylesheet">JB's Fav Font</a></li>

这是页面底部的 js 函数:

<!-- cssswitcher js -->
<script type='text/javascript'>
window.onload = function bindEvents(){

  var css=document.getElementById('style');
  var col=document.querySelectorAll('a.changeStyle');

  /* iterate through collection and assign listener */
  for( var n in col )if( col[n].nodeType==1 ) col[n].onclick=function(e){
    e.preventDefault();/* prevent jumping to top of page etc */
    var el=typeof(e.target)!='undefined' ? e.target : e.srcElement;

    /* assign style attributes */
    css.href=el.dataset.style;
    css.rel=el.dataset.rel;
    css.type=el.dataset.type;

    /* store reference to style selected in localstorage */
    localStorage.setItem( 'style', el.dataset.style );
    };

  /* if there is a reference to the user's css choice in storage, assign it */
  if( localStorage.getItem( 'style' )!=null ) css.href=localStorage.getItem( 'style' );
  }

  document.addEventListener( 'DOMContentLoaded', bindEvents, false );
</script>

最佳答案

首先,首先定义原始样式,如下所示:

HTML:

<link id="style" rel="stylesheet" type="text/css" href="style.css" />

注意 id=style我们将用它来查找元素。这可能会修复您的第一个错误。

对于第二个,您必须决定是否使用 document.addEventListener( 'DOMContentLoaded', bindEvents, false );window.onload因为它们是不同的功能。这可能对您有帮助window.onload vs. body.onload vs. document.onready .

现在我们可以做一些 Javascript 了:

HTML(链接):

 <li><button onclick='setStyle("css/style.comicsans.css")'>JB's Fav Font</button></li>
 <li><button onclick='setStyle("css/style.other.css")'>Other Font</button></li>

首先,请注意,我仅使用参数来调用 setStyle单击功能,顺便说一句,最好使用 <button> ,这样我们就能得到更清晰的结果。

Javascript:

var cssStyle = document.getElementById('style');

window.onload = function(){
    if(localStorage && localStorage.getItem("style"))
        cssStyle.href = localStorage.getItem("style");
};

function setStyle(newStyle){
    cssStyle.href = newStyle;

    if(localStorage)
        localStorage.setItem("style", newStyle);
};

奖金: 但如果您只使用两种样式,请尝试简化,并使用简写方法来执行此操作:

HTML:

<li><button onclick='toggleStyle()'>Toggle</button></li>

<!-- cssswitcher js -->
<script type='text/javascript'>

    var cssStyle = document.getElementById('style');
    var listStyles = ["css/style.comicsans.css", "css/style.other.css"];

    window.onload = function(){
        if(localStorage && localStorage.getItem("style"))
            cssStyle.href = localStorage.getItem("style");
    };

    function toggleStyle(){
        var previousStyle = cssStyle.href;

        if(previousStyle.endsWith(listStyles[0]))
            newStyle = listStyles[1];
        else
            newStyle = listStyles[0];

        cssStyle.href = newStyle;

        if(localStorage)
            localStorage.setItem("style", newStyle);
    };
</script>

关于javascript - 动态切换 CSS 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41355371/

相关文章:

javascript - 在父级上设置 'relative',在内部设置 'absolute' 不在底部对齐 Bootstrap 列上工作

css - 带有嵌套 div 的整个可点击 <div>

Javascript:如何删除附加的子行(tr)?

javascript - 如何在 div 中显示 jquery 警报消息?

javascript - $.ajax 成功 : value is always undefined

javascript - jQuery的slideDown()和slideUp()的替代方案不影响显示属性

html - 缩放 CSS 边框半径

javascript - 使用 JavaScript 在 SVG 元素上设置填充不透明度动画

javascript - jquery获取子元素的attr

javascript - jQuery 和 PHP while 循环 php