在CSS加载后触发的jQuery事件?

我在我的页面上有几个链接(在一个<div id="theme-selector"> ),它允许你改变CSS样式表:

 $('#theme-selector a').click(function(){ var path = $(this).attr('href'); $('head link').remove(); $('head').append('<link type="text/css" href="'+path+'" rel="stylesheet" />'); return false; }); 

现在,在改变页面的样式之后,我想使用下面的代码(在$('head').append call)之后得到新的背景颜色:

 var bgcolor = $('body').css('background-color'); alert(bgcolor); 

问题是,我认为,浏览器下载新的样式表需要一些时间,而且我有时会在我的警报消息中获得旧的背景颜色。 是否有一些事件,我可以绑定,只会在页面上加载所有样式表后提醒我?

目前,我所能想到的是使用setTimeout(function(){}, 5000); 这不是很好,因为如果加载页面上的所有CSS需要更长/更短的时间。

让我知道如果我需要澄清任何事情,我可以提供更多的代码。

除了创build一个新的链接元素并将其添加到头部之外,您可以使用AJAX调用来检索样式表的内容,并将其插入到embedded式样式块中。 这样,您可以使用jQuery的“完整”callback来触发您的支票。

 $('#theme-selector a').click(function(){ var path = $(this).attr('href'); $.get(path, function(response){ //Check if the user theme element is in place - if not, create it. if (!$('#userTheme').length) $('head').append('<style id="userTheme"></style>'); //populate the theme element with the new style (replace the old one if necessary) $('#userTheme').text(response); //Check whatever you want about the new style: alert($('body').css('background-color')); }); }); 

我没有真正testing这个代码,所以可能会有一些语法错误,但逻辑应该足够健全。

加载事件可以观察任何与url相关的元素,加载CSS样式表时这不适合你吗? http://api.jquery.com/load-event/

尝试这样的事情:

 var path = $(this).attr('href'); $('head link').remove(); var styleSheet = $('<link type="text/css" href="'+path+'" rel="stylesheet" />'); styleSheet.load(function(){alert("Loaded");}); $('head').append(styleSheet); 

编辑:如下所示,这只能在IE中起作用,谁会想到?

 var cssLoaded = function() { alert($('body').css('background-color')); }; $('#theme-selector a').click(function(){ var path = $(this).attr('href'); $('head link').remove(); $('head').append('<link onload="cssLoaded();" type="text/css" href="'+path+'" rel="stylesheet" />'); return false; }); 

在Chrome 28,IE 10,FF22中成功testing

你可以使用lazyload (jQuery插件)加载一个css文件。 它包含文件时可以调用函数。

例:

 // Load a CSS file and pass an argument to the callback function. LazyLoad.css('foo.css', function (arg) { // put your code here }); 

你可以简单地继续检查背景颜色是否仍然相同,然后做你的事情,如果它改变。

 oldbackground=getbackground() function checkbackground(){ if(oldbackground!=getbackground()){ oldbackground=getbackground() //Do your thing } } setInterval(checkbackground,100)