为什么我不能't检测样式变化从Chrome插件,直到我调用setTimeout

Why can't I detect style changes from a Chrome plugin until I call setTimeout?

本文关键字:插件 Chrome setTimeout 调用 样式 不能 为什么 检测 变化      更新时间:2023-09-26

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

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);

嗯,setTimeout不能接受0毫秒的值作为有效延迟。大多数浏览器会将延迟"箝制"到某个最小值。我想大概是4-10毫秒,这取决于浏览器。可能发生的事情是插件代码正在$上执行。代码运行后的某个时刻的Ready循环。因此,你必须设置某种超时,让它"等待"足够长的时间,直到插件加载完毕。

你可以阅读更多关于setTimeout如何工作在这里

隐藏广告的CSS可能是在文档准备就绪时注入文档的。如果没有看到一些上下文,我无法确定这一点,但您的代码很可能在CSS注入之前执行。setTimeout带0,是延迟代码执行直到最后的一个技巧。您可以尝试在$(window).load(function() { //code })上执行代码,或者尝试将代码放在body的底部。