SetimeOut间隔失败,并显示“无法将未定义或null转换为对象”

时间:2019-03-24 23:39:26

标签: javascript userscripts tampermonkey

我正在使用tampermonkey进行用户脚本编写,无法解决此错误,我们将不胜感激。

我很好地检测到按键,只要按键保持在向下位置,空格键就会触发该功能。控制台通常会在大约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
    }
} ) ();

3 个答案:

答案 0 :(得分:3)

这可能是特定于TamperMonkey的问题,或者是Chrome本身中的新安全策略/错误-我遇到了同样的问题,并将其捕获到调试器中,并且所有参数都不为null / undefined; setTimeout不会被覆盖。

编辑:有问题的用户脚本与我正在调试的用户脚本之间的共同特征是setTimeout的“递归”使用。我改为将其更改为setInterval,在我看来,这已经解决了。 enter image description here

答案 1 :(得分:3)

这是Chrome中已确认的错误:

Reported on TM github

Reported on bugs.chromium.org

另一个可行的解决方案是将.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中修复。

答案 2 :(得分:1)

我在使用Tampermonkey和Google Chrome时遇到了同样的问题。对我有用的是使用window.setTimeout而不是setTimeout