不调用setTimeout逻辑

时间:2017-08-31 21:39:13

标签: javascript

你能帮我理解为什么这个setTimeout逻辑不起作用

任务很简单,当用户点击按钮时,将执行复制输入文本的功能,然后将打印一条消息,说明副本成功,然后等待一秒钟并隐藏消息。最后一部分不起作用。

我分享了一个堆栈代码



(function() {
    const copyText = document.querySelector('#email');
    const copyButton = document.querySelector('#copy');
    const messageBox = document.querySelector('#message');

    function copy() {
        copyText.select();
        document.execCommand('Copy');

        displayMessage();
    }

    function displayMessage() {
        messageBox.innerHTML = 'Email copied';

        clearMessage();
    }

    function clearMessage() {
        const timeoutID = window.setTimeout(() => {
            messageBox.innerHTML = '';
        }, 1000);

        window.clearTimeout(timeoutID);
    }

    copyButton.addEventListener('click', copy);
})();

<input type="text" id="email" value="some.user@domain.com">
<button id="copy">Copy</button>
<span id="message"></span>
&#13;
&#13;
&#13;

感谢您的时间

4 个答案:

答案 0 :(得分:7)

您使用window.clearTimeout(timeoutID);设置后立即清除超时。只需删除window.clearTimeout(timeoutID);即可。

除非您要取消超时并保持其回调不被调用,否则无需使用clearTimeout

答案 1 :(得分:1)

清除函数内部的超时 -

function clearMessage() {
        const timeoutID = window.setTimeout(() => {
            messageBox.innerHTML = '';
            window.clearTimeout(timeoutID); // place it here
        }, 1000);

    }

因此,一秒钟之后,您的不必要的超时将被清除。

答案 2 :(得分:1)

声明后立即清除计时器。删除window.clearTimeout()调用,它将起作用

答案 3 :(得分:0)

在超时功能结束时使用window.clearTimeout(timeoutID);因为setTimeout是异步

(function() {
    const copyText = document.querySelector('#email');
    const copyButton = document.querySelector('#copy');
    const messageBox = document.querySelector('#message');

    function copy() {
        copyText.select();
        document.execCommand('Copy');

        displayMessage();
    }

    function displayMessage() {
        messageBox.innerHTML = 'Email copied';

        clearMessage();
    }

    function clearMessage() {
        const timeoutID = window.setTimeout(() => {
            messageBox.innerHTML = '';
            window.clearTimeout(timeoutID);
        }, 1000);

        
    }

    copyButton.addEventListener('click', copy);
})();
<input type="text" id="email" value="some.user@domain.com">
<button id="copy">Copy</button>
<span id="message"></span>