Почему я не могу обнаружить изменения стиля в плагине Chrome, пока не вызову setTimeout? - PullRequest
2 голосов
/ 09 апреля 2011

В основном я обнаруживаю наличие CSS, который скрывает рекламу, и если я его найду, я бы хотел показать небольшое сообщение.Однако я обнаружил, что даже если весь этот код выполняется при загрузке dom ($(function(){})), он все равно работает, только если я установил тайм-аут, даже если тайм-аут равен нулю.Кто-нибудь знает, почему это происходит (проверено в Chrome на Mac)

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

Ответы [ 2 ]

1 голос
/ 09 апреля 2011

Ну, setTimeout не может принимать значение 0 мс в качестве допустимой задержки.Большинство браузеров «зажимают» эту задержку до некоторого минимального значения.Я думаю, что это около 4-10 мс в зависимости от браузера.Вероятно, происходит то, что код плагина выполняется в цикле $ .ready в какой-то момент после запуска вашего кода.Так что тогда имело бы смысл установить какое-то время ожидания, чтобы заставить его «ждать» достаточно долго, пока не загрузится плагин.1005 * здесь .

0 голосов
/ 09 апреля 2011

CSS, скрывающий рекламу, вероятно, внедряется в документ в готовом документе.Я не могу быть уверен в этом, не видя некоторого контекста, но ваш код, скорее всего, выполняется до внедрения CSS.setTimeout с 0, это трюк, чтобы задержать выполнение кода до последнего.Вместо этого вы можете попробовать выполнить код на $(window).load(function() { //code }) или поместить код внизу тела.

...