【问题标题】:Can I load external stylesheets on request?我可以根据要求加载外部样式表吗?
【发布时间】:2011-01-08 17:37:02
【问题描述】:
$.getScript('ajax/test.js', function() {
  alert('Load was performed.');
});

.. 就像上面的代码根据请求加载外部 JS 一样,是否有类似的东西可以在需要时加载外部 CSS 样式表?

例如,当我在我的网站上使用灯箱(内联弹出窗口)时,我希望避免加载灯箱 JS 和 CSS 文件,除非用户要求。

谢谢

【问题讨论】:

    标签: jquery load request external lightbox


    【解决方案1】:

    我们可以直接追加

    $("head").append($("<link rel='stylesheet' href='style.css' type='text/css' media='screen' />"));
    

    【讨论】:

      【解决方案2】:

      是的:如果您创建一个链接到样式表的&lt;link&gt; 标记并将其添加到&lt;head&gt; 标记,浏览器将加载该样式表。

      例如

      $('head').append('<link rel="stylesheet" type="text/css" href="lightbox_stylesheet.css">');
      

      但是as per @peteorpeter’s comments,这在 IE 8 或更低版本中不起作用 - 您需要:

      1. 附加&lt;link&gt; 之前设置其href;或
      2. 使用IE的document.createStyleSheet()方法

      此外,检查是否已添加链接并不能在所有浏览器中可靠地工作。

      我也会质疑你的部分前提:

      我想避免在加载时加载灯箱 JS 和 CSS 文件,除非用户要求。

      为什么?减少页面重量?我能理解这种愿望,但你应该测量你的 CSS 和 JS 文件的大小(在缩小和 gzip 压缩之后),里面有灯箱代码,没有灯箱代码,看看减少是否值得:

      1. 增加了按需加载的复杂性;和
      2. 灯箱的响应速度略有下降(因为在按需加载时,灯箱必须等待其自己的 CSS 和 JS 加载后才能执行其操作)

      在缩小和压缩之后,可能没有那么大的区别。

      请记住,您可以指示浏览器长时间缓存您的 CSS 和 JS,这意味着只有当用户访问您的网站时缓存为空时才会下载。

      【讨论】:

      • 是的,它会加载样式表,但您不应该将 link 语句包装在 $() 中,只需使用 lightbox_stylesheet = '&lt;link ... /&gt;'.append() 调用将完成所需的操作。您通常不希望在 jQuery 对象中包装不能包含在 div 中的任何内容。
      • 另外,使用 HTML 字符串与单独的 attr 调用相比,这是一种荣誉。这将比单独的调用更快(好吧,只是一点点)。
      • 啊哈,我没有意识到append() 也拿了一个 HTML 字符串。整洁。
      • 注意:使用if('head link[href=foo]')检查是否已经添加了&lt;link&gt;是不可靠的due to browser DOM limitations
      • 注意 2:这在 IE this Q&A
      【解决方案3】:
      $('<link/>', {rel: 'stylesheet', href: 'myHref'}).appendTo('head');
      

      【讨论】:

      【解决方案4】:

      IE 问题...

      我正在崩溃 IE 6,7,8

      $('head').append( $('<link rel="stylesheet" type="text/css" />').attr('href', 'assets/css/jquery.fancybox-1.3.4.css') );
      

      只是将它们复制到主工作表中以避免另一个 http 请求,瞧。

      【讨论】:

      • 我刚刚在 IE7/8 和 windows XP 上遇到了同样的问题(似乎是一个 3 岁的 jquery 错误)......添加一个空的 href 也可以避免崩溃,例如$('').attr('href', 'assets/css/jquery.fancybox-1.3.4.css')跨度>
      【解决方案5】:

      您可以通过在头部添加动态 HTML 内容来添加对外部样式表的引用:

      $('head').append('<link rel="stylesheet" href="style.css" type="text/css" />');
      

      此内容被插入到 DOM 中,随后正常呈现,在这种情况下会导致获取外部样式表。

      但也请注意 cletus 的回答,如果您对静态内容的动态加载不小心,最终可能会导致页面加载时间和过多的资源转移。

      【讨论】:

        【解决方案6】:

        你可以这样做:

        $('<link>').attr('rel','stylesheet')
          .attr('type','text/css')
          .attr('href','link_to.css')
          .appendTo('head');
        

        【讨论】:

        • @Reigel 我不确定这将如何跨浏览器运行。据我了解,当您调用 $(htmlString) 时,该元素必须能够包含在 div 中,直到它被附加到页面上。尽管 link 元素 可以div 中,但它是无效的。例如,您不应该使用$('&lt;option&gt;'),因为它只在select 元素中有效。我认为option 调用实际上在某些浏览器中会失败,所以我只想提出对这种方法的担忧。
        • 我认为担心 JavaScript 生成的 HTML 在添加到页面之前可能存储在哪里有点过于强迫症了。用户永远不会看到,对吧?
        • @DougNeiner 你错了,4 年后...... jQuery( 表达式 ) 所做的是返回一组与表达式匹配的元素(数组)。表达式可以是选择器或 html 字符串。元素作为 documentFragments 存储在内存中,并在您执行 var els = $(''); 之类的操作时通过引用传递
        【解决方案7】:

        一般情况下,如果你做得正确,你最好只包括所有你需要的东西。

        我的意思是静态内容(图像、Javascript、CSS)的最佳做法是:

        • 最小化外部 HTTP 请求(最小化文件数);
        • 版本文件并使用远期 Expires 标头;
        • 酌情缩小和压缩内容。

        所以用户只会下载给定文件一次,直到它发生变化。

        动态加载 CSS 和 Javascript,除非它特别大,否则通常是没有根据的,而且会适得其反。

        【讨论】:

        • 然而,有时它是必要的,例如,如果您正在编写一个小部件样式的插件,并且您希望尽量减少将其集成到给定页面上的难度。能够销售“单线集成”可能是一个重要的差异化因素。
        猜你喜欢
        • 2011-01-27
        • 1970-01-01
        • 2016-10-24
        • 1970-01-01
        • 2017-09-06
        • 1970-01-01
        • 1970-01-01
        • 2022-01-01
        • 2014-03-11
        相关资源
        最近更新 更多