Javascript 为什么可以';在调用setTimeout之前,我是否检测到Chrome插件的样式变化?

Javascript 为什么可以';在调用setTimeout之前,我是否检测到Chrome插件的样式变化?,javascript,dom,google-chrome,stylesheet,Javascript,Dom,Google Chrome,Stylesheet,基本上,我正在检测隐藏广告的CSS的存在,如果我发现了,我想显示一条小消息。但是,我发现,即使在加载dom时执行了所有这些代码($(function(){})),也只有在设置超时时才有效,即使超时为零。有人知道为什么会发生这种情况吗(在Mac上的Chrome上测试) 函数检测(回调){ 对于(var x=0;x

基本上,我正在检测隐藏广告的CSS的存在,如果我发现了,我想显示一条小消息。但是,我发现,即使在加载dom时执行了所有这些代码(
$(function(){})
),也只有在设置超时时才有效,即使超时为零。有人知道为什么会发生这种情况吗(在Mac上的Chrome上测试)

函数检测(回调){
对于(var x=0;x10)
{
返回回调()
}
}
}
}
//失败,插件css尚未应用
检测(函数(){
$(“#sorryYouDontLikeOurAds”).show()
})
//但即使在超时为零的情况下也能正常工作
setTimeout(函数(){
检测(函数(){
$(“#sorryYouDontLikeOurAds”).show()
})
}, 0);

嗯,
设置超时
不能将0毫秒的值作为有效延迟。大多数浏览器会将延迟“钳制”到某个最小值。我想大约是4-10毫秒,这取决于浏览器。可能发生的情况是,在代码运行后的某个时刻,插件代码正在$.ready循环上执行。因此,在插件加载之前,您必须设置某种类型的超时来让它“等待”足够长的时间是有意义的


您可以阅读更多关于
setTimeout
工作原理的信息。

隐藏广告的CSS可能在文档准备就绪时被注入到文档中。在没有看到上下文的情况下,我无法确定这一点,但您的代码很可能是在注入CSS之前执行的。setTimeout为0是一种将代码执行延迟到最后一次的技巧。您可以尝试在
$(窗口)上执行代码。改为加载(function(){//code})
,或者尝试将代码放在正文底部。

可能是非序列,但是,为什么要返回回调,有一次我使用了另一个需要回调的方法,但此时我可能应该删除它
function detect(callback){

for (var x = 0; x < document.styleSheets.length; x++) {

    var rules = document.styleSheets[x].cssRules;
    for (var i = 0; i < rules.length; i++) {

           if(rules[i].style.display == 'none' && [].slice.call(rules[i].selectorText.match(/ads/ig), 0).length > 10)
           {
                return callback()
           }
    }
}
}


    // fails, the plugins css hasn't been applied yet
    detect(function(){
              $("#sorryYouDontLikeOurAds").show()
          })

    // but this works even with a timeout of zero
    setTimeout(function(){ 
          detect(function(){
              $("#sorryYouDontLikeOurAds").show()
          })
       }, 0);