-1

这是我的脚本(故意简化):

// ==UserScript==
// @name            StackOverflowExample
// @include     https://stackoverflow.com/*
// @version     1
// @grant       none
// ==/UserScript==


document.addEventListener('keydown', (e) => {
  console.log('I print before the "e"')
  conosel.log({e})
  console.log('I print after the "e"')
})

当这个脚本被加载到我的页面(堆栈溢出)时,我看到“我在“e”之前打印到控制台,但我没有看到“e”或“我在“e”之后打印' 登录。为什么是这样?

我试过添加类似的东西e.preventDefault(),但这没有任何区别。

令人费解的是,事件监听器内部的这种东西仍然有效:

document.addEventListener('keydown', (e) => {
if(e.keyCode !== 40)){
console.log('you pressed some random key')
} else {
console.log('you pressed the "UP" arrow key')
}
})

所以e定义了对象(只需按任意键,然后按“向上”)。有任何想法吗?

编辑:第二部分似乎我错了,(虽然我很确定我看到它在另一个网站上工作......)

浏览器 = firefox 63.0.3(64 位)

操作系统 = Ubuntu 18.04

油脂猴 = 4.7

4

1 回答 1

0

Greasemonkey 4+ 是粗制滥造的,GM 团队本身建议不要使用它

如果您使用 Tampermonkey(也可能是 Violentmonkey)安装了脚本,您会在控制台上看到语法错误。(如果您使用它,也可以在 Tampermonkey 的编辑器窗口中使用它。)

请注意,Greasemonkey 4+ 实际上并没有默默地失败。 它只是将错误消息隐藏在 Firefox 的“浏览器控制台”Ctrl++ ShiftJ中,大多数人不会知道/想去寻找它们。

显然,conosel是一个错误(原始代码块的第 11 行)。

同样,if(e.keyCode !== 40))是第二个代码块中的语法错误。

还:

  1. console.log({e})很差,因为它e在虚拟对象中不必要地模糊了。
  2. 中的括号(e)是多余的。
  3. 代码格式、间距和缩进可以帮助您更快地发现错误,并简化尝试阅读/维护您的代码的一般情况。
  4. keyCode40 是向下箭头键,而不是向上箭头。
  5. 养成使用分号的习惯;它将节省不必要的错误和头疼

所以,第一个代码块应该是:

// ==UserScript==
// @name        StackOverflowExample
// @match       https://stackoverflow.com/*
// @version     1
// @grant       none
// ==/UserScript==

document.addEventListener ('keydown', e => {
    console.log ('I print before the "e"');
    console.log ("e: ", e);
    console.log ('I print after the "e"');
} );

第二个:

document.addEventListener ('keydown', e => {
    if (e.keyCode !== 38) {
        console.log ('you pressed some random key');
    }
    else {
        console.log ('you pressed the "UP" arrow key');
    }
} );

并使用 Tampermonkey 和/或 Violentmonkey,而不是 Greasemonkey。您将节省数小时的挫败感,并且您的脚本将更加可靠和可移植。

于 2018-12-09T18:40:06.200 回答