当我在函数内部调用函数时,Math.random中的值会导致问题

时间:2013-02-03 10:56:15

标签: javascript jquery

这个脚本给我带来了麻烦。我已经写了好几次但是我错过了什么。

'questions'数组指的是我的对象。这些对象是不同的问题,“a”始终是正确的答案。

到目前为止,脚本运行正常。我的想法是从0增加'n'以滚动我的数组,并在点击正确的答案时提供下一个问题。 'x'始终是正确的答案(它始终保持'a')。

所以我可以正确猜测增加'n'就好了;但是,当我再次调用函数'a()'时(在我的警报'hi'部分之后),它会导致问题。我想增加n,并调用一个(),所以我得到下一个问题。然后我想将正确的猜测(x)放在随机位置(即位置0,1或2)。

感谢任何帮助。

var questions = [q0,q1,q2,q3,q4,q5,q6,q7];

var n = 0;

function a(){
var y;
var z;

var x = Math.floor((Math.random() * 3))
if(x == 0){y = 1; z = 2}else if(x == 1){y = 0; z = 2}else{y = 0; z = 1}

$("#question_holder").text(questions[n].q);

    $(".answer_holder").eq(x).text(questions[n].a);
    $(".answer_holder").eq(y).text(questions[n].b);
    $(".answer_holder").eq(z).text(questions[n].c);


    $(document).ready(function(){

        $(".answer_holder").eq(x).click(function(){
            alert("hi");
                        n++;
            a();

                     /*this area needs to get the next question by incrementing
                     n, then generate a different value to x, to place it
                     in a different position. which it does. however,
                     in subsequent questions, you can click the wrong answer as if
                     it's correct, ie not 'a' or 'x'.*/
        });
    });
};

2 个答案:

答案 0 :(得分:3)

你的逻辑在这里有点奇怪..你想要做的是每次a()运行时注册一个新的点击事件。我想你想为所有answer_holder元素注册一个点击事件,并在事件处理程序中检查它是哪个元素并相应地处理它

请注意以下事项:

$(document).ready(function(){ - 这个处理程序中定义的函数应该在你的页面加载后运行..我不认为你想在一个()中使用它。它通常仅用于全局范围(在所有函数之外)

$(".answer_holder").eq(x).click(function(){ - 此事件处理程序根据x的值注册您的函数。我建议您为所有$(".answer_holder")注册一个事件处理程序,而不依赖于x(在全局范围内)。在该事件处理程序(在函数中)中,您检查触发事件的元素(使用$(this) - 它返回被单击的元素)

答案 1 :(得分:2)

你有$(document).ready()在错误的地方。尝试这样的事情(警告:这是完全未经测试的):

function setupQuestion(n) {
    var x,y,z;

    x = Math.floor((Math.random() * 3))
    if(x == 0){y = 1; z = 2}else if(x == 1){y = 0; z = 2}else{y = 0; z = 1}

    $("#question_holder").text(questions[n].q);

    $(".answer_holder").eq(x).text(questions[n].a).data('answer', 'a');
    $(".answer_holder").eq(y).text(questions[n].b).data('answer', 'b');
    $(".answer_holder").eq(z).text(questions[n].c).data('answer', 'c');
}

$(document).ready(function() {
    var n = 0;
    $('.answer_holder').click(function() {
        if ($(this).data('answer') === 'a') { // Or whatever is the correct answer
            n++;
            if (n < questions.length) {
                setupQuestion(n);
            } else {
                // Do something else, the test is finished
            }
        }
        return false;
    });
    setupQuestion(n);
});

请注意,我不是在text()函数进行比较,而是在data()函数进行比较。这是因为显示给用户的文本可能以某种方式进行修饰,使得比较变得困难。简单地使用答案索引“a”“b”或“c”就更清楚了。