在 Chrome 浏览器中检测高对比度扩展程序的使用

Posted

技术标签:

【中文标题】在 Chrome 浏览器中检测高对比度扩展程序的使用【英文标题】:Detect High Contrast extension use in Chrome browser 【发布时间】:2016-11-24 08:05:30 【问题描述】:

我正在尝试以高对比度模式访问我的网站。为了检测何时启用高对比度模式,我创建了一个 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">');

  

【问题讨论】:

见:***.com/questions/1921047/… @DiceXQ 我已经发现,它与我正在做的类似,但它也不适用于 Chrome。 值得一提的是,最好尽可能避免这种需求。如果设计符合 WCAG AA 对比度要求,那么您的大部分项目在各种高对比度模式下看起来都很好。背景图像将在大多数高对比度模式下隐藏,但无论如何它们都不应该传达重要信息。如果您需要在高对比度模式下显示背景颜色,请考虑使用相同颜色的大边框并将您的 box-sizing 设置为border-box,将溢出设置为隐藏。 【参考方案1】:

Chrome 扩展程序将注入一些代码以生成高对比度的 LAF。

由于注入,可能需要 setTimeout。在我的情况下,它是必需的。

这对我有用:

setTimeout(function()
   var htmlTag = document.getElementsByTagName('html');
   console.log(htmlTag[0].getAttribute('hc') != null);
, 150);

【讨论】:

感谢@DiceXQ,这正是我所需要的,它完美运行! 如何使用事件侦听器采用这种方法?我想保留一些元素的原始颜色和背景颜色,当它们在点击时发生更改或它们处于活动状态时。 就我而言,不需要setTimeout() @SuperJade 我更改了上面的注释以反映它是可选的。【参考方案2】:

如果您询问的是 Windows 高对比度模式,Chrome 不知道该模式何时处于活动状态。

一般来说,如果 Windows 用户选择启用高对比度模式,则该用户正在 Microsoft Internet Explorer 或 Microsoft Edge 中冲浪(因为这些浏览器支持它)。它们都支持专有的-ms-high-contrast@media 规则。

检查丢失的背景图像是一种适用于 IE/Edge 的策略,但使用媒体查询是一种更好的方法。特别是自从Windows High Contrast Mode will soon allow background images in Edge.

如果您希望检测特定扩展程序何时在 Chrome 中设置了自己的高对比度模式,那么了解哪个扩展程序会很有帮助。

例如,使用High Contrast 扩展,您可以在&lt;html&gt; 标记上查找以下属性:hc="a3"hcx="3"(您的值可能不同,但属性应该匹配)。如果您打开浏览器开发工具,您可以看到它所做的其他一些事情。但这些属性处于 DOM 的***别,使用起来可能最安全。

如果您询问的是 android 版 Chrome,那也是一个不同的过程。

【讨论】:

谢谢@aardrian,我也在使用-ms-high-contrast,但我需要检查一下Chrome。我现在正在使用“高对比度”进行测试,但我需要测试尽可能多地使用高对比度扩展,因为谁知道实际用户在实践中会使用什么。 如果我们能看到每个扩展的市场份额来优先考虑我们的支持就好了。话虽如此,开发工具是我在启动扩展程序时查看到底发生了什么变化的首选方法。祝你好运。 关于“Chrome 不知道它何时处于活动状态”实际上它现在确实如此,至少在 Windows 10 中是如此。当 Chrome 检测到它提供了自己的高对比度扩展程序或黑暗主题时。 【参考方案3】:

...我只需要能够检测 Chrome 中的高对比度模式

解决方案 #1:

在我的 React/TypeScript 项目中,我使用了类似于 @Wesley Abbenhuis's answer 的代码,但我发现我不需要花费几秒钟才能加载的组件的超时。事实上,我创建了一个演示 React 项目,在第一个加载组件中测试了扩展,没有必要延迟。

const htmlTag: HTMLElement = document.getElementsByTagName(
    'html'
  )[0];
const isUsingChromeHighContrastExtension: boolean =
    htmlTag.getAttribute('hc') !== null;

解决方案 #2:

让您的非高对比度代码可访问,并且您不必首先检测 Chrome 的高对比度扩展程序。

来自WCAG Criterion 1.4.11: Non-text Contrast:

成功标准 1.4.11 非文本对比度(AA 级):以下视觉呈现与相邻颜色的对比度至少为 3:1:

用户界面组件

用于指示用户界面组件的状态和边界的视觉信息,不活动的组件或组件的外观由用户代理确定且未经作者修改的组件除外;

图形对象

理解内容所需的图形部分,除非图形的特定表示对于所传达的信息至关重要。

【讨论】:

以上是关于在 Chrome 浏览器中检测高对比度扩展程序的使用的主要内容,如果未能解决你的问题,请参考以下文章

12 款不能少的使网页浏览获得的最佳体验Chrome 扩展

在Trello的Chrome扩展程序中查看浏览器

如何检测 Chrome 中是不是安装了 Google Cast 扩展程序?

使用Puppeteer检测并测试Chrome扩展程序

删除文件时无法检测 chrome 扩展中的删除事件

检测活动标签是Chrome扩展程序中的新标签