Vimium: 作为网站所有者,有没有办法在我的页面上禁用 Vimium?

创建于 2017-01-19  ·  27评论  ·  资料来源: philc/vimium

如果有人在某处回答了这个问题,请原谅我,但我在常见问题解答或自述文件中找不到它。

我经营着一个很多程序员都在使用的网站。 有些人使用 Vimium,看起来扩展程序试图升级我页面上某些元素的编辑。 这导致了一些很难追踪的棘手 JS 错误以及很多用户痛苦,因为他们没有意识到失败是由于我们的代码和 Vimium 之间的冲突造成的。

有没有办法用“如果你正在运行 Vimium,请不要增强这个元素”来标记元素? 感谢您提前回复。

最有用的评论

只是一些想法。

网站管理员应该有办法禁用 Vimium 吗?

  • 优点:他们可以自动禁用 Vimium 以让用户立即使用他们的应用程序
  • 缺点:当快捷方式突然不起作用时,用户会感到困惑,这可以通过通知用户 Vimium 已禁用来缓解

网站所有者应该有办法检测 Vimium 吗?

  • 优点:他们可以提示用户解释 Vimium 可能会干扰正常功能
  • 缺点:这有利于指纹识别(但这可能已经是一个失败的原因)

我不确定网站管理员是否应该具有这两种能力,但如果他们这样做,它可能不应该依赖于巧合的实现细节。 一个标准化的解决方案,比如#2532 可能是要走的路。

例如,一个页面可能包含以下内容:

<meta name="keybinding" disable="suggest")">
<script>
  document.querySelector('meta[name="keybinding"]').addEventListener('detect', () => {
    console.log('hi vimium user');
  });
</script>

这让站长

  • 检测 Vimium
  • 禁用 Vimium

Vimium 将不得不

  • 让用户配置是否

    1. 忽略标签(让页面认为没有安装 Vimium)

    2. 基于 meta 的 disable 属性禁用 Vimium

  • 检查元标记并向其发送检测事件
  • 通知用户该页面正在禁用 Vimium

理论上,其他按键绑定扩展也可以实现这个接口,这样网站管理员就不必分别检测 Vimium、cVim、Surfing Keys、Saka Key、VimFx、Vimari 等。

所有27条评论

@vincentwoo ......目前没有。 这样的功能需要仔细考虑。

你愿意考虑这个功能吗? 如果是这样,您能否说出您的一些主要担忧是什么? 我显然不想踩到任何脚趾,但我确实想为安装了 Vimium 的用户(这是一大群人)提供更好的用户体验。

+1 这将是一个非常有用的补充。

您可以在 DOM 就绪/窗口加载时发送假的unload消息 - 如果只有 Vimium 已初始化。

这是我的示例: https://jsfiddle.net/2L36ypys/ ,您会看到您不能使用f来激活提示。

这自提交 adce73cb68f7ca3e3e01ca6fbb08a1008c9c8b90 (2016/04/05) 以来有效。

顺便说一句,您能否提供更多线索,我们可能会解决此类冲突。

我自己不是 vimium 用户,所以我明天会安装它并尝试为您提供更具体的错误报告。 谢谢你的片段。

事实上,根据https://jsfiddle.net/2L36ypys/1/ 中的测试,当页面为"loading"时,我们可以从“主机”环境中发送这样的消息,因为 Vimium 安装了它的unload在所有其他页面脚本之前的事件侦听器。

但是我的Vimium++没有使用这个监听器,也没有简单的方法可以通过页面脚本来销毁它。

所以我期待你的搜索。 一个可以重现错误的测试页面就可以了。 非常感谢。

与此相关,有一个 2 年历史的项目来检测用户是否在使用 Vimium,这里可能有用: https :

@pimlottc该扩展已经有 1 年或 2 年没有工作了,因为 Vimium 使用“shadowDOM”来隐藏其节点。

我无法完全重现 vimium 用户在我的网站上遇到的问题(可能是因为我个人不使用 Vim)。 是否仍然需要向元素添加某种特定于 vimium 的 CSS 类以要求扩展不增加它?

是否仍然需要向元素添加某种特定于 vimium 的 CSS 类以要求扩展不增加它?

我不确定这是个好主意。

如果 Vimium 在某些站点上根本不起作用,并且用户已经可以自己在您的站点上禁用 Vimium,那么肯定会导致用户混淆,请参见此处

此外,如果我们追求你的想法,那么我们可能还需要一种机制让用户重新启用 Vimium。

好吧。 有没有办法让我们至少知道,如果Vimium已启用? 问题是当事情因奇怪的交互而中断时,用户会责怪我们。 我的服务已经使用了一个非常复杂的编辑界面 (CodeMirror),所以我希望能够做一些事情

如果 Vimium 至少可以以某种方式在 DOM 上添加一个工件,那么至少像@vincentwoo所指的网站可以_使用户知道_用户安装了 Vimium,并且他们可以向用户显示一条消息,提醒他们可能存在冲突行为当将网页中的复杂 UI 与 Vimium 提供的所有内容结合起来时,甚至可以帮助配置有问题的应用程序或 Vimium 以解决它们。

如果 Vimium 至少可以以某种方式在 DOM 上添加一个工件......

我们在每个(顶级)页面上预加载 Vomnibar。 我想我们可以为它分配一个合适的类或 id。

那肯定会有帮助!

@smblot-github 我的想法是,Vimium 将其影子主机节点从<div>重命名为另一个名称,例如<vimium-ui> ,然后它就足以搜索<html>的孩子对于这个标签名称。 我认为这个自定义元素标签名称不会与其他网站的名称相同。

我的想法是 Vimium 将其影子主机节点从<div>重命名为另一个名称,例如<vimium-ui> ,然后只需在<html>的子节点中搜索此标签名称即可.

由于这个 Chromium 问题,目前这是不可能的。

您可以检测到我们可通过网络访问的资源。 例如:

var xhr = new XMLHttpRequest(),
    vimiumEnabled = false;
xhr.onerror = xhr.onload = function(){vimiumEnabled = xhr.responseText !== "";};
xhr.open("GET","chrome-extension://dbepggeogbaibhgnhhndojpepiihcmeb/content_scripts/vimium.css");
xhr.send()

@mrmr1993我不想创建一个“自定义”元素,只是一个带有自定义标签名称的HTMLElement 。 一个HTMLElement节点就像一个HTMLUnknownElement但仍然支持附加一个 shadowRoot。

只是一些想法。

网站管理员应该有办法禁用 Vimium 吗?

  • 优点:他们可以自动禁用 Vimium 以让用户立即使用他们的应用程序
  • 缺点:当快捷方式突然不起作用时,用户会感到困惑,这可以通过通知用户 Vimium 已禁用来缓解

网站所有者应该有办法检测 Vimium 吗?

  • 优点:他们可以提示用户解释 Vimium 可能会干扰正常功能
  • 缺点:这有利于指纹识别(但这可能已经是一个失败的原因)

我不确定网站管理员是否应该具有这两种能力,但如果他们这样做,它可能不应该依赖于巧合的实现细节。 一个标准化的解决方案,比如#2532 可能是要走的路。

例如,一个页面可能包含以下内容:

<meta name="keybinding" disable="suggest")">
<script>
  document.querySelector('meta[name="keybinding"]').addEventListener('detect', () => {
    console.log('hi vimium user');
  });
</script>

这让站长

  • 检测 Vimium
  • 禁用 Vimium

Vimium 将不得不

  • 让用户配置是否

    1. 忽略标签(让页面认为没有安装 Vimium)

    2. 基于 meta 的 disable 属性禁用 Vimium

  • 检查元标记并向其发送检测事件
  • 通知用户该页面正在禁用 Vimium

理论上,其他按键绑定扩展也可以实现这个接口,这样网站管理员就不必分别检测 Vimium、cVim、Surfing Keys、Saka Key、VimFx、Vimari 等。

我也在寻找检测 vimium 的解决方案。 @eejdoowad的提议看起来很棒。 同时,我同意@gdh1995 ,具有特殊 id/classname 的<div>将立即解决现在的问题。

从 vimium v​​1.59 开始,下面是一个工作功能,虽然不完全可靠,但由于缺乏可靠的标识符,如果您有其他扩展程序以 vimium 的方式插入 shadowDom,那么它就会中断。

function hasVimium () {
  try {
    const shadowRoot = document.querySelector('html > div').shadowRoot;
    return Boolean(shadowRoot.querySelector('style').textContent.match(/vimium/));
  } catch (e) {
    return false;
  }
}

我只想说,我会担心是否实施了内置检测机制。 指纹当然总是可以通过改变 DOM 的插件来完成,除非禁止网站 javascript,但至少让我们不要给人们一个简单的数据点目标来跟踪......

我们可以有一种机制,我们不检测 Vimium,但可以在我们的页面上添加一个元标记,以便在 Vimium 用户碰巧使用该页面时显示一条消息,并提供禁用选项。 因此,Vimium 可以避免琐碎的检测,而且我们不一定要了解有关用户的任何信息。

由于https://github.com/philc/vimium/issues/2504之类的错误,这对于我正在处理的应用程序来说非常必要。 总结是,随着 vimium 的运行,网站将开始响应,并且随着事件处理程序的堆积而变得越来越慢。

如果网站可以检测到:

  1. 正在使用哪个 vimium 版本
  2. vimium 是否启用/禁用/部分禁用(以及哪些键)。

如果网站可以以用户清楚的方式礼貌地禁用 vimium(这样 vimium 图标不再是蓝色),那就太好了

@mgsloan你能提供一个示例页面吗? 自 #2504 以来,插入模式的处理方式发生了重大变化。

(我不确定单方面禁用 Vimium 的网站。这可能会令人困惑。)

@smblott-github 嗨,感谢您的回复! 事实上,性能问题似乎已经消失了。 伟大的!

存在一个问题,即某些输入行为与禁用 vimium 时有很大不同。 我会询问,看看我们是否可以分享网址。

你好呀! 项目维护者是否可以接受哪些方法? 我们愿意付出一些时间来完成这项工作(相当多的 vimium 用户使用 CoderPad)但不想踩到任何脚趾。

我认为 Vimium 期望的关键点是所有用户都可以毫无痛苦或烦恼地使用它。

由于您的站点有一些与 Vimium 不同的特殊操作,包括输入框上的esc ,Vimium 是否应该允许在其选项页面上“排除” <esc>

如果是这样,您的用户可以手动配置它并恢复站点的操作(目前,似乎不能排除<esc> )。

但我不喜欢 Vimium 在满足特殊条件时禁用自身的想法。 这对 Vimium 的价值是有害的。

至于发布Vimium的版本,我的建议是:

  • 包含 Vimium 版本字符串的 Web 可访问资源路径

    • 更正确,但不适用于 Vimium 的不同变体

    • 例如,我制作了一个“Vimium C”,它有一个不同的扩展 ID,所以不同的资源 URL)

  • 或一个特殊的<meta>标签,由 Vimium 创建并包含一些诸如“Vimium”之类的词

    • 更容易检查,但可能会被恶意软件滥用

检查顶级 div 似乎不再起作用,因为在用户执行某些操作之前它不再安装。

换句话说,在页面加载时,没有可以依赖的神器

此页面是否有帮助?
0 / 5 - 0 等级