【问题标题】:How do I switch external CSS files?如何切换外部 CSS 文件?
【发布时间】:2011-01-06 15:12:39
【问题描述】:

我有几本关于 AJAX 的书正在阅读,但仍然很新。所有教程和这些书籍都有无处不在的示例:自动填充搜索栏和异步表单验证器。这些都很棒,但不是我想要的。具体来说,我想单击一个按钮并在我的标题包含中切换外部 CSS 文件。这可能吗?嗯...我知道这是可能的,但你是怎么做到的?

PS:我在这个项目中有 jQuery,所以如果那里有内置的东西,那就更好了!

PPS:我意识到我没有提供重要信息(不要开枪!):

  1. 这样做的最终目标是有一个用户设置部分,用户可以在其中单击单选按钮并决定他们想要为我们的应用程序使用的配色方案。所以我们最终会有 8 种不同的 CSS 样式可供选择。不确定这是否会改变实现这一目标的最佳方法。

  2. 用户正在登录他们的帐户并在那里更改他们的设置。我希望他们的更改能够“坚持”,直到他们决定再次更改样式表。我可以在 MySQL 中手动执行此操作,因为我们有一个名为 stylesheets 的表,其中各种用户样式表编号......所以实际上,我需要做的是异步更改 MySQL 值,以便立即加载 CSS。

【问题讨论】:

    标签: javascript jquery css ajax


    【解决方案1】:

    id 属性添加到CSS link 标记以使用JavaScript 操作标记:

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

    设置href 属性的Javascript 类似于:

    document.getElementById('cssfile').href = 'css/carrot.css';
    

    用户可以通过点击链接来调整颜色:

    <a href="#"
     onclick="document.getElementById('cssfile').href='css/carrot.css';">Carrots</a>
    

    通过更改媒体类型,这还可以让用户快速更改打印布局、手机(或平板电脑)上的首选布局等等。

    此解决方案不需要 jQuery。

    另请参阅:http://www.webmasterworld.com/forum91/4554.htm

    【讨论】:

      【解决方案2】:

      jQuery 中的样式表切换器。

      作为对“新手跟进”评论的回应,我将尝试使其更具指导性。

      我在写作时用来测试的页面可以在here找到。

      页面展示

      您将希望在每个页面的&lt;head&gt; 中的&lt;link&gt; 标记中显示当前样式表。 &lt;link&gt; 标记需要一个 id 以便稍后在 JavaScript 中引用。比如:

      <?php 
        // Somewhere in the server side code, $current_stylesheet is read from the user's 
        // "preferences" - most likely from a database / session object
        $current_stylesheet = $user->stylesheet;
      ?>
      <link href='<?php echo $current_stylesheet ?>' rel='stylesheet' type='text/css' id='stylelink' />
      

      更改偏好

      一旦您显示用户样式表,您需要一种方法来更改它。创建一个&lt;form&gt;,当用户更改样式表时将向服务器发送请求:

      <form method="GET" id="style_form" >
        <select name="stylesheet" id="styleswitch">
          <option value="css1.css">Black &amp; White</option>
          <option value="css2.css" selected="selected">Shades of Grey</option>
         </select>
         <input value='save' type='submit' />
      </form>
      

      服务器端

      现在,如果没有 jQuery,提交此表单应该在当前页面上获得(如果您愿意,可以将其更改为 POST)stylesheet={new stylesheet}。因此,在您的引导程序/站点范围的包含文件中的某处,您对其进行检查,这是一个 php 示例:

      $styles = array(
        'css1.css' => 'Black &amp; White',
        'css2.css' => 'Shades of Grey',
      );
      
      if (!empty($_GET["sytlesheet"]) {
        // VALIDATE IT IS A VALID STYLESHEET - VERY IMPORTANT
        // $styles is the array of styles:
        if (array_key_exists($_GET["stylesheet"], $styles)) {
          $user->stylesheet = $_GET["stylesheet"];
          $user->save();
        }
      }
      

      实时预览

      此时,您已经为没有 javascript 的蹩脚的人提供了一个功能正常的样式切换器。现在你可以添加一些 jQuery 来让这一切更优雅地发生。您需要使用jQuery Form Plugin 来创建一个不错的ajaxForm() 函数,该函数将处理提交表单。在页面中添加 jQuery 和 jQuery Form 库:

      <script type='text/javascript' src='/js/jquery.js'></script>
      <script type='text/javascript' src='/js/jquery.form.js'></script>
      

      现在我们已经包含了库 -

      $(function() {
        // When everything has loaded - this function will execute:
      
      
        $("#style_form").ajaxForm(function() {
          // the style form will be submitted using ajax, when it succeeds:
          // this function is called:
          $("#thediv").text('Now Using: '+$('#styleswitch').val());
        });
      
        $("#styleswitch").change(function() {
          // When the styleswitch option changes, switch the style's href to preview
          $("#stylelink").attr('href', $(this).val());
          // We also want to submit the form to the server (will use our ajax)
          $(this).closest('form').submit();
        });
      
        // now that you have made changing the select option submit the form,
        // lets get rid of the submit button
        $("#style_form input[type=submit]").remove();
      });
      

      【讨论】:

      • 为我的新手后续问题道歉 1) 所以要完成这个,我需要一个样式开关按钮,对吧?你能给我一个带有代码的简单按钮示例吗? 2)我可以把那个保存能力和第一个按钮结合起来吗? IE:理想情况下,用户只需点击按钮,css 就会改变,然后他们就完成了(或者他们点击了另一种颜色,然后他们就完成了)。
      • 我相信我已经涵盖了那里的所有问题...如果您有任何其他后续问题,可能值得提出一个新问题
      • 示例链接失效
      【解决方案3】:

      这是一个使用 jQuery 的示例。

      <!DOCTYPE html>
      <html>
          <head>
          <link rel="stylesheet" type="text/css" href="style1.css" />
              <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"
                  type="text/javascript"></script>
              <script type="text/javascript">
                  $(function(){
                      $('#change-css').click(function(e){
                          e.preventDefault();
                          $('link[rel="stylesheet"]').attr('href', 'style2.css');
                      });
                  });
              </script>
          </head>
          <body>
              <a id="change-css" href="#">change css</a>
          </body>
      </html>
      

      操作线路是$('link[rel="stylesheet"]').attr('href', 'style2.css');。这会找到任何具有rel="stylesheet"&lt;link&gt; 标记并将其href 属性更改为style2.css

      【讨论】:

        【解决方案4】:

        这与 Ajax 无关。它与 JS 和 DOM 操作有关(搜索教程的一些关键词)。
        我正在使用 Mootools,它是一个 JS 库,它有一个内置函数。
        如果手动操作是您的事,那么我只需将&lt;link&gt; 元素添加到&lt;head&gt; 或调整现有href 元素的href 属性即可。

         <link rel="stylesheet" href="http://sstatic.net/so/all.css?v=6063" id='bobo'>
        ...
        ...
        ...
        <script>document.getElementById('bobo').href="http://my.doamin.com/new.css";</script>
        

        【讨论】:

        • 如果元素在标题中,getElementById 会触发事件吗?
        【解决方案5】:

        您还可以加载两个 CSS 文件,并在第二个文件中的所有选择器前加上正文类名。

        body.secondsheet {}
        body.secondsheet a {}
        body.secondsheet hr {}
        

        那么你所要做的就是在body标签中添加/删除“secondsheet”类来切换样式表。

        【讨论】:

          【解决方案6】:

          要向页面添加新的 css 文件,只需创建一个新的 &lt;link&gt; 标签:

          function addCss (url) {
              var s = document.createElement('link');
              s.rel = 'stylesheet';
              s.type = 'text/css';
              s.href = url;
              document.getElementsByTagName('head')[0].appendChild(s);
          }
          
          addCss('http://path/to/stylesheet.css');
          

          要从页面中删除 css 文件,只需将 &lt;link&gt; 删除即可:

          function removeCss (search) {
              var css = document.getElementsByTagName('link');
              for (var i=0;i<css.length;i++) {
                  var c = css[i];
                  if (c.rel === 'stylesheet' || c.type === 'text/css') {
                      if (c.href && c.href.match(search)) {
                          c.parentNode.removeChild(c);
                      }
                  }
              }
          }
          
          // Remove all css that contains 'mycss_', can use regexp if necessary:
          removeCss(/mycss_.*\.css/);
          

          【讨论】:

          • 我会将它添加到头部而不是身体,除此之外,看起来不错。
          • 除了风格之外没有理由将其添加到头部而不是身体。而且由于这是一个实时 DOM,没有像 Firebug 这样的东西,没有人会注意到风格方面。将它附加到正文更容易。由于没有 document.head 这样的东西,所以将其附加到 head 是很乏味的:document.getElementsByTagName('head')[0].appendChild(s)
          • 正文中不允许有链接元素。依赖浏览器来执行错误恢复并不是一个好主意(即使当前裁剪在这种特殊情况下碰巧始终如一地这样做)。
          • @David:糟糕,错过了。修复了符合 HTML 规范的代码。
          猜你喜欢
          • 2012-08-29
          • 1970-01-01
          • 2017-08-10
          • 2016-07-26
          • 1970-01-01
          • 2019-07-08
          • 2011-01-07
          • 1970-01-01
          • 2015-09-28
          相关资源
          最近更新 更多