繁体   English   中英

JavaScript中的setInterval函数错误

[英]Error in setInterval function in JavaScript

我正在尝试创建一个JavaScript和PHP测验。 代码很简单:如果单击了任何选项按钮,则使用ajax请求检查答案。 它工作正常,但是在用户单击任何给定选项后,我希望问题在2秒后自动更改为新的Ajax请求。 因此,我将SetInterval函数与load函数一起使用以加载新问题。 现在主要问题在这里:当我单击任何选项按钮时,下一个问题出现并继续出现,然后再次出现。 这个问题会一直抖动,好像是动画错误一样。 那么下面的代码多数民众赞成在实现这一目标是错误的吗?

代码:( 已删除CSS

的index.php

<!DOCTYPE html>

<head>
    <title>Quiz</title>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style type="text/css">

    </style>
    <script src="jquery.min.js"></script>
    <script>
        function loadqn() {
            $('.optioncont').load('loadit.php?id=1');
        }

        function checkans(qid, optn) {

            $(".optioncont").css("opacity", "0.5");
            var id = qid + 1;
            alert(id);
            setInterval(function () { $('.optioncont').load('loadit.php?id=' + id); }, 2000);

            $.ajax({
                url: 'quiz.php',
                method: 'POST',
                data: {
                    qnid: qid,
                    ans: optn
                },
                success: function (data) {
                    if (data == 'C') {
                        $(".resultN").hide();
                        $(".resultY").show();
                        setInterval(function () { $(".resultY").hide(); }, 3000);
                    } else {
                        $(".resultY").hide();
                        $(".resultN").show();
                        setInterval(function () { $(".resultN").hide(); }, 3000);
                    }
                }
            });
        }


        $(document).ready(function () {
            $("#play").click(function () {
                alert('id');
                loadqn();
            });
        });

    </script>
</head>

<body>

    <div class="qncont">
        <button id="play">Play</button>
        <center>
            <div class="optioncont">
            </div>
            <div class="resultY">
                <div class="congrats">Correct Answer</div>
            </div>
            <div class="resultN">
                <div class="congrats">Wrong Answer</div>
            </div>


    </div>

</body>

</html>

loadit.php

<?php
$conn = mysqli_connect('localhost', 'root', 'bibek');
if (!$conn) {
    die("Database connection Failed" . mysqli_error($conn));
}
$select_db = mysqli_select_db($conn, 'test');
if (!$select_db) {
    die("Database selection falied" . mysqli_error($conn));
}

if (isset($_GET['id'])) {
    $qid = $_GET['id'];

    $query = mysqli_query($conn, "select* from `quiz` where id='$qid'");

    $row      = mysqli_fetch_array($query);
    $question = $row['question'];
    $option1  = $row['option1'];
    $option2  = $row['option2'];
    $option3  = $row['option3'];
    $option4  = $row['option4'];

    echo "<div class='question'>$question</div>";
    echo "<div class='option_block'><a href='#' class='option' onClick='checkans(" . $qid . ",1)'>$option1</a></div>";
    echo "<div class='option_block'><a href='#' class='option' onClick='checkans(" . $qid . ",2)'>$option2</a></div>";
    echo "<div class='option_block'><a href='#' class='option' onClick='checkans(" . $qid . ",3)'>$option3</a></div>";
    echo "<div class='option_block'><a class='option' href='#' onClick='checkans(" . $qid . ",4)'>$option4</a></div>";
} else {
    echo "error";
}
?>

SetInterval将以x毫秒的间隔重复调用您的函数。 您应该使用setTimeout或更好的requestAnimationFrame

请注意,您可以分别使用clearIntervalclearTimeOut取消任何setIntervalsetTimeout

正如@sjeiti所写,您应该使用setTimeout而不是setInterval

之所以这么称呼您的抖动,是因为代码继续进行ajax-call直到粘贴了2秒钟为止。 因此,您应该在第一个Timeout-function设置ajax-call

    function checkans(qid, optn) {

        $(".optioncont").css("opacity", "0.5");
        var id = qid + 1;
        alert(id);

        //THE CODE WON'T WAIT FOR THIS TO COMPLETE 
        setInterval(function () { $('.optioncont').load('loadit.php?id=' + id); }, 2000);

        //IT WILL JUMP TO THIS PART WHILE IT'S WAITING FOR THE TIMEOUT
        $.ajax({
            url: 'quiz.php',
            method: 'POST',
            data: {
                qnid: qid,
                ans: optn
            },
            success: function (data) {
                if (data == 'C') {
                    $(".resultN").hide();
                    $(".resultY").show();
                    setInterval(function () { $(".resultY").hide(); }, 3000);
                } else {
                    $(".resultY").hide();
                    $(".resultN").show();
                    setInterval(function () { $(".resultN").hide(); }, 3000);
                }
            }
        });
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM