clearInterval在switch()中不起作用

时间:2016-11-30 18:19:05

标签: javascript html css

所以这是我的代码:

<!DOCTYPE html>

<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title></title>
        <style>
            html {
                overflow: hidden;
            }
            #demo{
                position: relative;
            }
        </style>
    </head>
    <body>
        <input type="text" onkeypress="Snake(event)">
        <p id="demo" style="left: 10px;">--></p>
        <script>
            function Snake(event) {
                var x = event.which;

                switch (x) {
                    case 119: /*forward(w)*/
                        break;
                    case 115: /*back(s)*/
                        break;
                    case 97: document.getElementById("demo").style.left = "10px";
                        clearInterval(int);
                        break;
                    case 100: var y = document.getElementById("demo").style.left; y = y.replace("px", ""); y = parseInt(y);
                        var int = setInterval(function () {
                            y += 10;
                            var z = y.toString();
                            document.getElementById("demo").style.left = z + "px";
                        }, 1000);
                        break;
                }
            }
        </script>
    </body>
</html>

当我点击d(unicode = 100)时它工作得很好但是每当我按下(unicode = 97)它会回到10px,然后从它离开的地方继续。 (与d)。可能是clearInterval()存在问题。

3 个答案:

答案 0 :(得分:1)

您的int变量的范围是该函数。这意味着在下次调用函数时,您不会处理相同的int变量;你正在处理一个新的。

要使用单个int变量,请在声明Snake的范围内声明它。 ,这意味着现在有两个(SnakeSnake),而不是一个全局(int)。 Globals是Bad Thing™。

相反,让我们使用 no 全局变量并使用现代事件处理来连接你的处理程序:

<input id="the-inpue" type="text"">
<p id="demo" style="left: 10px;">--></p>
<script>
(function() { // A scoping function so we don't create globals
    var int = 0; // The variable
    function Snake(event) {
        var x = event.which;

        switch (x) {
            case 119: /*forward(w)*/
                break;
            case 115: /*back(s)*/
                break;
            case 97: document.getElementById("demo").style.left = "10px";
                clearInterval(int);
                break;
            case 100: var y = document.getElementById("demo").style.left; y = y.replace("px", ""); y = parseInt(y);
                var int = setInterval(function () {
                    y += 10;
                    var z = y.toString();
                    document.getElementById("demo").style.left = z + "px";
                }, 1000);
                break;
        }
    }

    // Hook up the handler
    document.getElementById("the-input").addEventListener("keypress", Snake, false);
</script>

注意:代码中可能存在其他错误。但这是int的错误,而不是清除计时器。

答案 1 :(得分:0)

您的int变量必须在Snake函数之外声明,以便setInterval()clearInterval()能够在每个keypress事件中访问它。     

<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title></title>
        <style>
            html {
                overflow: hidden;
            }
            #demo{
                position: relative;
            }
        </style>
    </head>
    <body>
        <input type="text" onkeypress="Snake(event)">
        <p id="demo" style="left: 10px;">--></p>
        <script>
            var int;  // 1st change
            function Snake(event) {
                var x = event.which;

                switch (x) {
                    case 119: /*forward(w)*/
                        break;
                    case 115: /*back(s)*/
                        break;
                    case 97: document.getElementById("demo").style.left = "10px";
                        clearInterval(int);  // 2nd change
                        break;
                    case 100: var y = document.getElementById("demo").style.left; y = y.replace("px", ""); y = parseInt(y);
                        int = setInterval(function () {  // 3rd change
                            y += 10;
                            var z = y.toString();
                            document.getElementById("demo").style.left = z + "px";
                        }, 1000);
                        break;
                }
            }
        </script>
    </body>
</html>

答案 2 :(得分:0)

您可以创建一个对象并将函数和区间变量指定为属性

Error:(44, 71) type mismatch;
 found   : com.dexcom.rt.model.DaoDataPostHeader
 required: Option[String]
    val copied = WithRecordIdentification.withId(sampleGlucoseRecord, header)
Error:(44, 71) type mismatch;
 found   : com.dexcom.rt.model.DaoDataPostHeader
 required: Option[java.util.UUID]
    val copied = WithRecordIdentification.withId(sampleGlucoseRecord, header)
Error:(44, 71) type mismatch;
 found   : com.dexcom.rt.model.DaoDataPostHeader
 required: Option[Long]
    val copied = WithRecordIdentification.withId(sampleGlucoseRecord, header)

您可以调用sampleTimer.Snake(具有100个unicode的键); sampleTimer.Snake(具有97个unicode的键);

变量是函数作用域的(这意味着变量可以在函数内部访问)。一旦调用该函数,变量寿命就会结束。

否则你可以按照@ T.J的建议去做。克劳德