如何断言页面的CSS已成功加载并在Watin 2.1中应用其样式?
解决方法
在做了一些研究和写作我的回答后,我偶然发现了
this link,它解释了你需要了解的关于CSS的一切,当它被加载,以及如何检查它.
提供的链接很好地解释了这一点,实际上我添加了一些引用来作为参考.
如果你好奇,我的答案将是#2,而#4的变体.
When is a stylesheet really loaded?
…
就这样,让我们看看我们在这里.
// my callback function // which relies on CSS being loaded function CSSDone() { alert('zOMG,CSS is done'); }; // load me some stylesheet var url = "http://tools.w3clubs.com/pagr/1.sleep-1.css",head = document.getElementsByTagName('head')[0],link = document.createElement('link'); link.type = "text/css"; link.rel = "stylesheet"; link.href = url; // MAGIC // call CSSDone() when CSS arrives head.appendChild(link);
魔法部分的选项,从漂亮而容易到可笑的排序
>听link.onload
>听link.addEventListener(‘load’)
>听link.onreadystatechange
> setTimeout并检查document.styleSheets中的更改
> setTimeout,并检查您创建的特定元素的样式的变化,但使用新的CSS样式
第五个选项太疯狂了,假设你控制了CSS的内容,所以忘记了.此外,它会在超时时检查当前样式,这意味着它将刷新回流队列,并且可能很慢. CSS到达越慢,回流越多.所以,真的,忘了它.
那么如何实现魔法?
// MAGIC // #1 link.onload = function () { CSSDone('onload listener'); }; // #2 if (link.addEventListener) { link.addEventListener('load',function() { CSSDone("DOM's load event"); },false); }; // #3 link.onreadystatechange = function() { var state = link.readyState; if (state === 'loaded' || state === 'complete') { link.onreadystatechange = null; CSSDone("onreadystatechange"); } }; // #4 var cssnum = document.styleSheets.length; var ti = setInterval(function() { if (document.styleSheets.length > cssnum) { // needs more work when you load a bunch of CSS files quickly // e.g. loop from cssnum to the new length,looking // for the document.styleSheets[n].href === url // ... // FF changes the length prematurely :( CSSDone('listening to styleSheets.length change'); clearInterval(ti); } },10); // MAGIC ends