【问题标题】:javascript stylesheet changer not workingjavascript样式表转换器不起作用
【发布时间】:2012-04-29 22:25:09
【问题描述】:

好的,朋友给了我这段代码,但它不起作用。我一直在寻找一个 java 样式表转换器,这是我唯一能找到的。当我单击链接(更改样式)时,什么也没有发生。帮助?而且我确实很难理解 javascript,所以对我来说很难。

js代码:

function setActiveStyleSheet(title) {
  var i, a, main;
  for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
    if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {
      a.disabled = true;
      if(a.getAttribute("title") == title) a.disabled = false;
    }
  }
}

function getActiveStyleSheet() {
  var i, a;
  for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
    if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title") && !a.disabled) return a.getAttribute("title");
  }
  return null;
}

function getPreferredStyleSheet() {
  var i, a;
  for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
    if(a.getAttribute("rel").indexOf("style") != -1
       && a.getAttribute("rel").indexOf("alt") == -1
       && a.getAttribute("title")
       ) return a.getAttribute("title");
  }
  return null;
}

function createCookie(name,value,days) {
  if (days) {
    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000));
    var expires = "; expires="+date.toGMTString();
  }
  else expires = "";
  document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
  var nameEQ = name + "=";
  var ca = document.cookie.split(';');
  for(var i=0;i < ca.length;i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') c = c.substring(1,c.length);
    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
  }
  return null;
}

window.onload = function(e) {
  var cookie = readCookie("style");
  var title = cookie ? cookie : getPreferredStyleSheet();
  setActiveStyleSheet(title);
}

window.onunload = function(e) {
  var title = getActiveStyleSheet();
  createCookie("style", title, 365);
}

var cookie = readCookie("style");
var title = cookie ? cookie : getPreferredStyleSheet();
setActiveStyleSheet(title);

    }
);

标题样式表代码:

<link rel="stylesheet" type="text/css" media="screen" href="css/zerohour.css" title="default" />

<link rel="alternate stylesheet" type="text/css" media="screen" href="css/rainbow.css" title="rainbow" />

链接激活码:

<a href="#" 

onclick="setActiveStyleSheet('default'); 

return false;">change style to default</a>



<a href="#" 

onclick="setActiveStyleSheet('rainbow'); 

return false;">change style to rainbow</a>

【问题讨论】:

  • 尝试打开控制台(在 FF 中为 Ctrl+Shift+J,在 IE 中为 F12,在 Chrome 中不知道)并查看是否/您收到什么错误消息;将您可以在那里找到的内容添加到问题中。
  • @Armatus Ctrl+Shift+I in chrome
  • @Kirean: Ctrl+Shift+J 在 Chrome 和 Chromium 中同样有效
  • @xbonez 显然 F12 也可以。所以,他们只是选择让每个浏览器的命令都成为他们的 :) Love google。
  • “不起作用”是无用的描述。你期望会发生什么?实际发生了什么?您收到任何错误消息吗?当您需要按钮而不是链接时,最好使用按钮而不是链接。

标签: javascript css stylesheet alternate


【解决方案1】:

这是对我认为您正在尝试做的事情的重写:

var activeStylesheet = (function() {

  // Store title of default linked stylesheet
  var defaultTitle;

  return {

    // Set the active stylesheet to the link styesheet element with title
    // Set all others to disabled
    setActive: function(title) {
      var link, links = document.getElementsByTagName('link');

      for (var i=0, iLen=links.length; i<iLen; i++) {
        link = links[i];

        if (link.rel.indexOf("style") != -1 && link.title) { 
          link.disabled = true; 

          if (link.title == title) {
            link.disabled = false; 
          }
        }
      }
    },

    // Return the title of the currently active linked stylesheet,
    // or undefined if none found
    getActive: function() {
      var link, links = document.getElementsByTagName('link');

      for (var i=0, iLen=links.length; i<iLen; i++) {
        link = links[i];

        if (link.rel.indexOf("style") != -1 &&
            link.title &&
           !link.disabled) {
          return link.title;
        }
      }
    },

    // Return the title of the link stylesheet element where 
    // rel property contains 'alt'
    getPreferred: function() {
      var link, links = document.getElementsByTagName('link');

      for (var i=0, iLen=links.length; i<iLen; i++) {
        link = links[i];

        if (link.rel.indexOf("style") != -1 && 
            link.rel.indexOf('alt') == -1 &&
            link.title) { 
          defaultTitle = title;
          return link.title; 
        }
      }
    }
  };
}());

一些按钮来做事:

<button onclick="
 alert(activeStylesheet.getActive());
">Show title of active stylesheet</button>
<button onclick="
 activeStylesheet.setActive('rainbow');
">Set active stylesheet to "rainbow"</button>
<button onclick="
 activeStylesheet.setActive('default');
">Set active stylesheet to "default"</button>

请注意,使用标题会区分大小写,所以要小心。

您可以将默认链接样式表的标题存储在 defaultTitle 变量中,但我不知道您想用它做什么。您有一个 setPreferred,它首先检查是否设置了 defaultTitle,如果没有设置,则调用 getPreferred,然后使用 setActive 调用 em>默认标题

【讨论】:

    【解决方案2】:

    我意识到这个问题没有被标记为Jquery,但除非你有充分的理由坚持使用原生 Javascript,否则我会推荐 Jquery。

    只需两行代码即可切换样式:

    $('#foobar').click(function(){
            $('link').attr('href','newstyle.css');
            return false;
    });
    

    Live Demo

    【讨论】:

    • 嗯,我试试看。你是如何做到的,它可以改变我的替代样式表而不是我的主样式表,所以它不会把代码弄乱。
    • 观看现场演示。第一个样式表在.eq(0),第二个在.eq(1),以此类推。您可以操作任何您想要的样式表。
    • @xbonez——它不做 OP 所做的事情,即获取/设置活动样式表。
    • 它确实改变了link 标签中引用的样式表,但现在你提到它,我认为你是对的。更改可能不会波及整个页面。
    • 是的,它搞砸了整个风格,我希望脚本只改变风格的一部分,而不是整个 o.O 应该多解释一下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多