SettimeOut 间隔失败 "Cannot convert undefined or null to object"
SetimeOut interval fails with "Cannot convert undefined or null to object"
我正在使用 tampermonkey 编写用户脚本,但无法解决此错误,我们将不胜感激。
我检测到按键正常,space 按键触发此功能,只要按键保持在向下位置,该功能就会重复。控制台正常写入输出或多或少 30 秒,然后出现 TypeError。
根据声誉限制,这是屏幕截图:
用户脚本:
// ==UserScript==
// @name TEST STUFF--------------------
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author You
// @run-at document-start
// @include http://*
// @include https://*
// @grant none
// ==/UserScript==
( function()
{
'use strict';
window.addEventListener ( "keydown", CaptureKeyPress );
window.addEventListener ( "keyup", CaptureKeyPress );
var Hotkeys =
{
perform: 32
};
var HotkeyToggle = false;
function CaptureKeyPress ( a )
{
if ( a.keyCode == Hotkeys.perform )
{
a.preventDefault();
a.stopPropagation();
a.cancelBubble = true;
a.stopImmediatePropagation();
if ( a.type == "keydown" && !HotkeyToggle )
{
console.clear();
HotkeyToggle = true;
perform();
}
if ( a.type == "keyup" && HotkeyToggle )
{
HotkeyToggle = false;
}
}
}
function perform()
{
if(HotkeyToggle == false) // exit
{
return 0
}
//do stuff...
console.info("working...");
if(HotkeyToggle == true) // continue after everything completes
{
setTimeout(() => {
perform()
}, 280);
return 0
}
return 1
}
} ) ();
这要么是 TamperMonkey 特有的问题,要么是 Chrome 本身的新安全性 policy/bug - 我已经 运行 遇到了同样的问题,并在调试器中发现了它, none 个参数是 null/undefined; setTimeout 未被覆盖。
编辑:有问题的用户脚本和我正在调试的用户脚本之间的一个共同特征是 "recursive" setTimeout 的使用。我改为将其更改为 setInterval
,这似乎已解决我的问题。
我在使用 Tampermonkey 和 Google Chrome 时遇到了同样的问题。对我有用的是使用 window.setTimeout
而不是 setTimeout
.
这是 Chrome 中已确认的错误:
另一个看起来可行的解决方案是 .bind
函数到 window
,例如:
window.clearTimeout = window.clearTimeout.bind(window);
window.clearInterval = window.clearInterval.bind(window);
window.setTimeout = window.setTimeout.bind(window);
window.setInterval = window.setInterval.bind(window);
该错误应在 Chrome 75.
中修复
我正在使用 tampermonkey 编写用户脚本,但无法解决此错误,我们将不胜感激。
我检测到按键正常,space 按键触发此功能,只要按键保持在向下位置,该功能就会重复。控制台正常写入输出或多或少 30 秒,然后出现 TypeError。
根据声誉限制,这是屏幕截图:
用户脚本:
// ==UserScript==
// @name TEST STUFF--------------------
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author You
// @run-at document-start
// @include http://*
// @include https://*
// @grant none
// ==/UserScript==
( function()
{
'use strict';
window.addEventListener ( "keydown", CaptureKeyPress );
window.addEventListener ( "keyup", CaptureKeyPress );
var Hotkeys =
{
perform: 32
};
var HotkeyToggle = false;
function CaptureKeyPress ( a )
{
if ( a.keyCode == Hotkeys.perform )
{
a.preventDefault();
a.stopPropagation();
a.cancelBubble = true;
a.stopImmediatePropagation();
if ( a.type == "keydown" && !HotkeyToggle )
{
console.clear();
HotkeyToggle = true;
perform();
}
if ( a.type == "keyup" && HotkeyToggle )
{
HotkeyToggle = false;
}
}
}
function perform()
{
if(HotkeyToggle == false) // exit
{
return 0
}
//do stuff...
console.info("working...");
if(HotkeyToggle == true) // continue after everything completes
{
setTimeout(() => {
perform()
}, 280);
return 0
}
return 1
}
} ) ();
这要么是 TamperMonkey 特有的问题,要么是 Chrome 本身的新安全性 policy/bug - 我已经 运行 遇到了同样的问题,并在调试器中发现了它, none 个参数是 null/undefined; setTimeout 未被覆盖。
编辑:有问题的用户脚本和我正在调试的用户脚本之间的一个共同特征是 "recursive" setTimeout 的使用。我改为将其更改为 setInterval
,这似乎已解决我的问题。
我在使用 Tampermonkey 和 Google Chrome 时遇到了同样的问题。对我有用的是使用 window.setTimeout
而不是 setTimeout
.
这是 Chrome 中已确认的错误:
另一个看起来可行的解决方案是 .bind
函数到 window
,例如:
window.clearTimeout = window.clearTimeout.bind(window);
window.clearInterval = window.clearInterval.bind(window);
window.setTimeout = window.setTimeout.bind(window);
window.setInterval = window.setInterval.bind(window);
该错误应在 Chrome 75.
中修复