检测Chrome浏览器中使用的高对比度扩展
Detect High Contrast extension use in Chrome browser
我正在努力使我的网站可以在高对比度模式下访问。为了检测何时启用高对比度模式,我创建了一个JavaScript方法来检测背景图像是否被禁用,因为高对比度方式会禁用背景图像。然后,如果浏览器处于高对比度模式,我会附加一个CSS文件来修复以高对比度显示的问题。这在Firefox、Edge和IE中运行良好,但Chrome使用自己的扩展来创建高对比度,并且不会禁用背景图像,因此在Chrome中没有附加用于高对比度的CSS。
通过搜索,我发现Chrome在网站上添加了一个过滤器,而不是启用/禁用/更改网站颜色或图像本身。我搜索了又搜索,但找不到任何可以测试Chrome是否使用高对比度模式的东西。如果有一种方法可以检测正在使用的扩展,也可以解决问题,但我也没能找到这样的方法。
我的代码实际上运行得很好,我所需要的只是能够检测Chrome中的高对比度模式。这是我用来检查高对比度模式的方法。
let highContrast = (options) => {
let hcDetect = jQuery(`<div id="jQHighContrastDetect"></div>`).css('background', 'url(../uploads/c-wht-small.png)');
hcDetect.appendTo(document.body);
if (hcDetect.css('background-image') === 'none') {
$('head').append('<link rel="stylesheet" href="../css/highcontrast.min.css" type="text/css" media="all">');
}
}
如果您询问Windows高对比度模式,Chrome不知道该模式何时处于活动状态。
通常,如果Windows用户选择启用高对比度模式,则该用户正在Microsoft Internet Explorer或Microsoft Edge中冲浪(因为这些浏览器支持它)。它们都支持专有的-ms-high-contrast
@media
规则。
检查丢失的背景图像是一种在IE/Edge中有效的策略,但使用媒体查询是一种更好的方法。特别是因为Windows高对比度模式很快将允许边缘中的背景图像。
如果你想检测某个特定的扩展程序何时在Chrome中设置了自己的高对比度模式,那么了解哪个扩展程序会很有帮助。
例如,使用High Contrast扩展,您可以在<html>
标记上查找以下属性:hc="a3"
和hcx="3"
(值可能不同,但属性应该匹配)。如果你打开浏览器开发工具,你可以看到它所做的其他事情。但这些属性处于DOM的最高级别,使用起来可能最安全。
如果你问的是安卓版Chrome,那也是一个不同的过程。
我所需要的就是能够在Chrome 中检测到高对比度模式
解决方案1:
在我的React/TypeScript项目中,我使用了与@Wesley Abbenhuis的答案类似的代码,但发现我的组件不需要加载几秒钟的超时时间。事实上,我创建了一个演示React项目,在第一个加载组件中测试了扩展,不需要延迟。
const htmlTag: HTMLElement = document.getElementsByTagName(
'html'
)[0];
const isUsingChromeHighContrastExtension: boolean =
htmlTag.getAttribute('hc') !== null;
解决方案2:
让你的非高对比度代码可以访问,你不应该首先检测到Chrome的高对比度扩展。
根据WCAG标准1.4.11:非文本对比度:
成功标准1.4.11非文本对比度(AA级):以下内容的视觉呈现与相邻颜色的对比度至少为3:1:
用户界面组件
用于指示用户界面组件的状态和边界的视觉信息,不包括非活动组件或组件的外观由用户代理确定而非作者修改的组件;
图形对象
理解内容所需的图形部分,除非图形的特定呈现对所传达的信息至关重要。
Chrome扩展插件将注入一些代码来生成高对比度的LAF。
由于注入,可能需要setTimeout。就我而言,这是必需的。
这对我有效:
setTimeout(function(){
var htmlTag = document.getElementsByTagName('html');
console.log(htmlTag[0].getAttribute('hc') != null);
}, 150);
- chrome扩展中的navigator.geolocation.getCurrentPosition
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- chrome扩展更改主机/域警告
- 如何在chrome扩展中重定向到html页面
- Chrome扩展没有't在重新加载之前考虑期权价值
- 如何通过自己获得Chrome扩展的用户反馈/错误报告
- 试图阻止Chrome通过扩展关闭
- 如何在chrome扩展中存储数据/结果,以及如何使用setTimeout使其只被调用一次
- 从选项页面更新chrome扩展清单权限
- 如何将chrome扩展功能移植到移动设备(特别是jquery和trello)
- Chrome扩展 chrome.storage 如何同时进行大量获取和设置并避免竞争条件
- Chrome扩展:Chrome.tabs.executeScript不工作
- 中的访问扩展chrome://extensions页
- 如何在扩展Chrome DevTool时检索请求的启动器
- Chrome扩展-Chrome报警API为创建的每个新报警重新安排所有报警
- 是否有任何方法来扩展chrome's __commandLineAPI
- 谷歌Chrome扩展Chrome .tab . onupdate . addlistener
- 创建在页面上注入脚本的扩展chrome内容
- Chrome扩展:Chrome扩展中未定义的变量,即使它存在于控制台中
- 检测Chrome浏览器中使用的高对比度扩展