【问题标题】:javascript, while loopjavascript,while循环
【发布时间】:2011-03-31 15:43:46
【问题描述】:

我试图让我的脚本在继续之前等待用户输入(单击按钮),这在其他语言中是可行的,但在 js 中似乎是不可能的。基本上,我希望用户在给定的时间范围内选择一个选项,如果用户选择了错误的选项,他们会被告知..script 然后继续...否则,如果在一定时间后没有响应.. .script 只是继续再次播下正确的答案,但 js 中似乎没有任何内容可以让脚本等待该用户输入!我尝试了一个while循环,但这只是js中的一个很大的不,我使用了settimeout但没有真正的效果,因为脚本只是像正常一样继续然后在x时间后执行一个动作,我尝试设置变量并让脚本仅当它具有特定值时才继续,该值仅在用户单击时设置...例如 varproceed=false,仅在用户单击按钮时才设置为 true,但它仍然不起作用...我尝试了很多其他解决方案,但实际上似乎没有任何效果。我喜欢while循环的想法,因为它完全符合我的要求,但是如果完全冻结我的浏览器,是否有更有效的循环类型会以与我的浏览器崩溃相同的方式执行?

下面是我的代码,它完全冻结了我的计算机。这个方法在一个 for 循环中被调用,在它之后调用另一个方法。

function getUserResp(){
    $("#countdown").countdown({seconds: 15});
    setTimeout("proceed=true", 16000);

    $("#ans1").click(function(){
        ansStr=$(this).text();
        checkAns(ansStr);
     });    
    $("#ans2").click(function(){
        ansStr=$(this).text();
        checkAns(ansStr);
    });    
    $("#ans3").click(function(){
        ansStr=$(this).text();
        checkAns(ansStr);
        });

想要这样的东西.....或者只是某种循环让脚本在继续之前等待,所以至少它给了用户一些时间来响应而不是直接运行!

    do{
    $(".ans").mouseover(function(){
        $(this).addClass("hilite").fadeIn(800);
        });  

    $(".ans").mouseout(function(){
        $(this).removeClass("hilite");
        });

    }while(proceed==false);

}

【问题讨论】:

  • 抱歉错字错误,强调并没有阅读。我正在寻找一个不会让我的浏览器崩溃的 while 循环或类似的东西

标签: javascript while-loop


【解决方案1】:

你做错了。

浏览器中的 JavaScript 使用事件驱动模型。没有main 函数,只有在事件发生时调用的回调(例如文档准备好或单击锚点)。如果您希望在用户单击某些内容后发生某些事情,那么请在该内容上放置一个侦听器。

您所做的只是在每次循环中不断添加一个事件侦听器。

如果您想等待用户输入,那么什么都不做 - 浏览器等待用户输入(它有一个内部事件循环)。您能做的最糟糕的事情是尝试在浏览器之上重新实现自己的事件循环。

您需要learn JavaScript。像其他语言一样尝试编写 JavaScript 只会导致痛苦和痛苦。认真的。

Douglas Crockford said it best:

JavaScript 是一种大多数人在使用之前都不会费心去学习的语言。你不能用任何其他语言做到这一点,你不应该这样做,你也不应该用这种语言这样做。编程是一门严肃的事情,你应该对自己在做什么有充分的了解,但大多数人认为他们应该能够在没有任何知识的情况下用这种语言编程,而且它仍然有效。这是因为语言具有强大的表达能力,这不是偶然的。

【讨论】:

  • 您能详细说明一下吗?抱歉,我是 javascript 新手
  • 我只尝试了一次 do while 循环,只是作为一种替代方案,但我真正希望程序做的是等待 16 秒,至少让用户有机会响应。在此之后还有其他方法调用,因此即使使用 setTimeout,也没有什么不同,因为它仍然直接运行,然后 settimeout 在 x 时间后执行它应该执行的操作。即 setTimeout 没有工作。我没有按照建议对脚本做任何事情,这就是我第一次编写它的方式,但是没有什么可以让程序询问用户是否单击或时间用完了? ....
  • ...当我认为可能实现 while 循环来检查这可能是一个好主意时,为此我引入了变量 continue=false,它只能通过单击设置为 true在其中一个答案上。 while 循环会检查它是真还是假,如果为真,可以适当地调用下一个方法,但是 while 循环会使我的浏览器崩溃
  • 真的认为你应该花一些时间学习 JavaScript,然后再尝试做这样的事情。我保证,它会得到回报。
  • 伙计们,我真的很感谢你的建议,我只是想要一个简短的例子来说明你在说什么,因为就像你说的我应该学习这门语言(尽管我花了相当多的时间和金钱来阅读) 但如果我不知道从哪里开始,我不知道该怎么做。一个简短的例子将不胜感激。谢谢。
【解决方案2】:

您不能像在其他一些命令式语言中那样阻止 Javascript 运行。浏览器中只有一个 Javascript 线程,因此如果将其挂在一个循环中,则不会发生其他任何事情。

必须使用异步的、事件驱动的编程。设置一个与超时相结合的点击处理程序(或其他)是正确的开始方式。启动 15 秒的 setTimeout。在答案的点击处理程序中,取消超时。这样超时的处理程序只有在用户没有点击答案时才会发生。

例如:

var mytimeout = setTimeout(15000, function() {
    // This is an anonymous function that will be called when the timer goes off.
    alert("You didn't answer in time.");
    // Remove the answer so the user can't click it anymore, etc...
    $('#ans').hide();
});

$('#ans').click(function() {
    // Clear the timeout, so it will never fire the function above.
    clearTimeout(mytimeout);
    alert("You picked an answer!");
});

了解代码的结构必须如何使其成为事件驱动的。没有办法将其构造为“做这件事,然后在这里等待答案”。

【讨论】:

  • 谢谢你的回答,我是 javascript 新手,你认为你可以举一个简单的例子,所以我有一个想法。非常感谢您已经发布的消息
  • 嗨 quixoto...起初不明白您在说什么..但我已经在我的代码中实现了这一点,如下所示:function checkAns(check){ clearTimeout(); if(check==cAns){ checkAns=true;} else{ checkAns=false;} } 你是这个意思吗?唯一的问题是 js 将设置超时,但仍会继续执行其余代码,因为无论是否单击按钮,我都没有任何响应它直接运行的东西。我想这是在问什么,我如何让代码在继续之前等待 15 秒左右?
  • @michelle:我添加了一些示例代码,希望能更清楚地说明这一点。
  • 感谢您的响应,虽然设置超时将设置该函数只会在计时器关闭时调用,但在 js 中似乎没有任何内容说让我们等待/睡眠 15 秒,然后我们继续其余的 sript 除非用户 clciks 即“让用户有 15 秒的时间响应”,如果一个按钮被 clciked ,我们将检查 ans。 settimeout 仅在一定时间后调用函数,但我并不是说脚本不会继续运行。实际上,我正在寻找在 15 秒内或多或少不会做任何事情的东西.....
  • @michelle:如果你想睡 15 秒,那么执行 15 秒的 setTimeout,并为其处理程序放置应该继续运行的其余代码。在“脚本的其余部分”中不要有任何其他内容,这样在 15 秒计时器触发之前,什么都不会“继续运行”。 (坦率地说,如果这对您没有意义,您需要花更多时间在教程或面对面课程上。我们在这里达到了 Stack Overflow 的教学限制。)
【解决方案3】:

您正在查看客户端 javascript,就好像它还没有处于事件驱动循环中一样。您需要做的就是等待适当的事件发生,如果尚未发生,请继续等待,或者执行一些默认操作。

你不需要:

create main loop: // All
    wait for user input // Of
        timer = start_timer() // This
        // Is done for you
        if [user has input data]: 
            process_data()
        else if [timer > allowed_time]:
            process_no_data()
        else:
            wait() // By the Browser

您只需要中间部分。您需要做的就是(后面是实际的javascript,而不是伪代码):

// First, store all of the answer sections, 
// so you're not grabbing them every time 
// you need to check them.
var answers = {};
answers.ans1 = $("#ans1");
answers.ans2 = $("#ans2");
answers.ans3 = $("#ans3");

// This is a flag.  We'll use it to check whether we:
//    A. Have waited for 16 seconds
//    B. Have correct user input
var clear_to_proceed = false;
var timer_id;

// Now we need to set up a function to check the answers.    
function check_answers() {
    if ( ! clear_to_proceed ) {
        clear_to_proceed = checkAns(answers.ans1.text());
        clear_to_proceed = checkAns(answers.ans2.text());
        clear_to_proceed = checkAns(answers.ans3.text());
        // I assume checkAns returns
        // true if the answer is correct
        // and false if it is wrong
    } 
    if ( clear_to_proceed ) {
        clearTimeout(timer_id);
        return true; // Or do whatever needs be done, 
                     // as the client has answered correctly
    } else {
        // If we haven't set a timer yet, set one
        if ( typeof timer_id === 'undefined' ) {
            timer_id = setTimeout(function(){
                        // After 16 seconds have passed we'll check their
                        // answers one more time and then force the default.
                        check_answers();
                        clear_to_proceed = true;
                        check_answers(); 
                    }, 16000);
        }
        return false; // We're just waiting for now.
    }
}
// Finally, we check the answers any time the user interact
// with the answer elements.
$("#ans1,#ans2,#ans3").bind("focus blur", function() {
    check_answers();
});

【讨论】:

    猜你喜欢
    • 2014-12-14
    • 2018-02-19
    • 2015-11-17
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    相关资源
    最近更新 更多