$.getScript('ajax/test.js', function() {
alert('Load was performed.');
});
类似上面的代码可以在请求时加载外部JS文件,是否有类似的方法可以在需要时加载外部CSS样式表呢?
比如当我在网站上使用轻量级弹出框时,我希望除非用户请求,否则不会在页面加载时就加载轻量级弹出框的JS和CSS文件。
谢谢
没错:如果你创建一个链接到样式表的<link>
标签,然后将其添加到<head>
标签中,浏览器会加载该样式表。
例如:
$('head').append('<link rel="stylesheet" type="text/css" href="lightbox_stylesheet.css">');
然而,根据@peteorpeter的评论,这在IE 8或更低版本中不起作用- 在那里,您需要:
href
之前附加<link>
;或者document.createStyleSheet()
方法此外,在所有浏览器上可靠地检查链接是否已添加是行不通的。
我还要质疑你观点的一部分:
我想避免在onload时加载lightbox JS和CSS文件,除非用户请求。
为什么?减少页面重量吗?我可以理解这种愿望,但是您应该测量带有lightbox代码时的CSS和JS文件的大小(经过最小化和gzip),以及没有它们时的大小,以确定减少是否值得:
最小化和gzip后,可能没有太大的区别。
请记住,您可以指示浏览器长时间缓存您的CSS和JS,这意味着只有在用户使用空缓存访问您的站点时才会下载它们。
$('<link/>', {rel: 'stylesheet', href: 'myHref'}).appendTo('head');
你可以这样做:
$('<link>').attr('rel','stylesheet')
.attr('type','text/css')
.attr('href','link_to.css')
.appendTo('head');
$(htmlString)
时,元素必须能够被包含在一个 div
中,直到它被添加到页面中。虽然 link
元素可以在 div
中,但这是无效的。例如,你不应该使用 $('<option>')
,因为它只在 select
元素中有效。我认为这种方法在某些浏览器中实际上会失败,所以我想提出对这个方法的担忧。 - Doug Neiner$('head').append('<link rel="stylesheet" href="style.css" type="text/css" />');
这段内容会被插入到DOM中,并且随后会按照正常方式渲染,这种情况下会导致获取外部样式表。
但是请注意cletus的回答,如果您在动态加载静态内容时不小心,可能会导致页面加载时间过长和资源传输过度。
IE浏览器问题...
我在使用以下代码时导致IE 6、7、8浏览器崩溃:
$('head').append( $('<link rel="stylesheet" type="text/css" />').attr('href', 'assets/css/jquery.fancybox-1.3.4.css') );
只需将它们复制到主表中,以避免另一个 http 请求,就完成了。
一般来说,最好假设你正确地包含了所有需要的内容。
我的意思是,对于静态内容(图像、Javascript、CSS),最佳实践是:
这样用户只需下载给定文件一次,直到它发生变化。
动态加载CSS和Javascript(除非它特别大),通常是不必要且适得其反的。
$("head").append($("<link rel='stylesheet' href='style.css' type='text/css' media='screen' />"));
link
语句用$()
括起来,而是应该使用lightbox_stylesheet = '<link ... />'
,然后.append()
调用将完成所需操作。通常情况下,不要将任何不能包含在div
中的内容都用jQuery对象包装起来。 - Doug Neinerif('head link[href=foo]')
检查是否已经添加了<link>
不可靠,因为受浏览器 DOM 限制的影响。 - peteorpeter