为什么我不能't检测样式变化从Chrome插件,直到我调用setTimeout
Why can't I detect style changes from a Chrome plugin until I call setTimeout?
基本上,我正在检测隐藏广告的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的底部。
相关文章:
- CKeditor预览插件.js,为Chrome和IE进行编辑.因为它拒绝CSS样式
- 恶搞Chrome插件
- Chrome扩展插件:runtime.last运行tabs.get/tabs.remove时出错:没有id为0的选项卡
- Chrome 插件的 webRequest.onCompleted 不会触发源自 Flash 的请求
- 如何在Firefox插件中向子进程发送消息,如Chrome原生消息
- Chrome开箱扩展插件消失
- chrome扩展插件在浏览器操作中插入内容脚本
- 当chrome.desktopCapture.chooseDesktopMedia将在chrome中可用时(不使用插件)
- 如何在 Chrome 插件的 Manifest.json 文件中调用 Javascript (JS) 代码
- Firefox 插件中的 OnBeforeRequest URL 重定向(从 Chrome 扩展程序转换)
- 通过Chrome自定义插件在浏览器当前页面中选择元素的问题
- 通过Javascript从网页访问Chrome插件列表
- CSS 与 Chrome 中的 jQuery scrollintoview() 插件冲突
- 如何知道Chrome窗口何时具有焦点(并且文档中有一个插件)
- Chrome插件开发:用户:pass@url不再被谷歌浏览器支持
- 如何在构建Chrome扩展程序时摆脱插件中的内联代码
- jQuery 3D标签云插件在IE和chrome中不起作用
- chrome插件通过JQuery在facebook新闻源DOM树中添加或删除一些元素
- 在chrome插件中结合Python和Javascript
- 砌体JS插件 - Chrome / Firefox 问题