Jquery &引用;“时间更新”;事件函数在重新绑定后触发两次

Jquery &引用;“时间更新”;事件函数在重新绑定后触发两次,jquery,html5-audio,jquery-events,Jquery,Html5 Audio,Jquery Events,我的”有问题; $('.choices').html(''); 选择=[ $(''), $('') ]; $。随机化(选择); $.each(选项、函数(索引、值){ $('.choices')。追加(值); }); $('#audio-try_')。在('timeupdate',function()上{ 如果(重试\u音频\u元素.currentTime>=5){ $(this.off('timeupdate'); log('突出显示正确的图像'); $('.correct').animate

我的
”有问题;
$('.choices').html('');
选择=[
$(''),
$('')
];
$。随机化(选择);
$.each(选项、函数(索引、值){
$('.choices')。追加(值);
});
$('#audio-try_')。在('timeupdate',function()上{
如果(重试\u音频\u元素.currentTime>=5){
$(this.off('timeupdate');
log('突出显示正确的图像');
$('.correct').animate({opacity:0.25},200,function(){
动画({opacity:1},200,function()){
$('.correct').animate({opacity:0.25},200,function(){
设置动画({opacity:1},200);
});
});
});
}
});
$('.goal,.choices').fadeIn();
}
函数get\u object\u pair(){
object_to_find=other_object=get_random_index();
while(其他对象==要查找的对象){
其他对象=获取随机索引();
}
将object_返回到_find+'|'+其他_对象;
}
函数get_random_index(){
返回Math.floor(Math.random()*总图像);
}
功能问题(已回答){
如果(正确答案==4){
警惕('您已正确回答了四个问题');
}
否则{
$('.goal,.choices').fadeOut(函数(){
$(“#音频-再试一次”).off('timeupdate');
setTimeout(生成_对象,200);
});
}
}
$(文档).ready(函数(){
正确答案=0;
图像=[
“数据:图片/png;base64,IVBorW0Kggoaaaansuhueugaaabaaabaaaqcayaaaaf8/9Haaaaculeqvr42qxt0qnaiaxfuufjnjnop+gwWUfIAOkTUpBAC/V9Ni9kukdv1iqhqegm1muaz3fpwq6omqlzxmpaygrdh+5QPZAh/ippwefpwg4amvdiunj2apil0f+hDp30heJP4q84+Jfs43txnFT7FsW/caaavorasuk5cyii=”,
“数据:图片/png;base64,IVBorW0KggoaaaAnsuhueugaaabaaaaqcayaaaaf8/9Haaaaculeqvr42qwt0qnaaxehsxtzdqdosnkyadpcekijzw2Kpeh3i8tiwl7ktbawy8stznt1Vbftqqtzqmyorqcros2zlvlqxyk9u/amhc3znphznphjgjgwijbdyetgic2Kn5ecj6u+c9Ef+cTtijFT/bugvoaaaaaavorasuk5cyii=”,
“数据:图片/png;base64,IVBorW0KggoaaaAnsuhueugaaababaaaaqcayaaaaf8/9Haaaaculeqvr42qwt0qnaiaxehskto2doskHceb0Hmowuap9J7EH3J5YEXKrmlu0ICDTPX3NW3W4G4ELDBVDGYSCWZCDH3CRC0BRXECA9ABX6MANBWWWOFGTNGUKUIDOSKB+gtxE+RVFqHWJHW8mez0FTFtFt731Loaauvork5YII=”,
“数据:图片/png;base64,IVBorW0KgoaaAnsuhueugaabaaqcayaaaaf8/9Haaaaaa0LeqVR42QXT0QNaiawawe0izine6Xtoewsequex9Hfkkbaknvb+JB1EJI9XBwgkgk116xl9VAIwe+YKPP8PjlPW27iek8YE99HnapWbWbWwbumWkicGa+GW6EuKn5HxH5HxH5Ov0AaAsuvor5cyii=”
];
图像总数=图像长度;
total_排列=阶乘(total_图像)/阶乘(total_图像-2);
重试音频元素=$(“#音频-重试”)[0];
$(文档).on('click','correct',函数(){
if(!$(this).hasClass('disabled')){
$('.correct、.error').addClass('disabled');
正确答案++;
问题(已回答);
}
}).on('单击','不正确',函数(){
if(!$(this).hasClass('disabled')){
$('.correct、.error').addClass('disabled');
请重试\u音频\u元素。播放();
}
});
$('#audio-try_')。在('end',function()上{
问题(已回答);
});
使用的_对=[];
生成_对象();
});
演示:


有什么想法吗?

看来问题出在这一块:

$('.goal, .choices').fadeOut(function() {
   $('#audio-try_again').off('timeupdate');
   setTimeout(generate_objects, 200);
});
选择器
$('.goal.choices')
将返回一个包含两个元素的jQuery集合,这意味着回调函数将被调用两次(每个匹配的元素调用一次)

针对您的特定应用,一种快速而肮脏的解决方法是:

$('.goal, .choices').fadeOut(function() {
   if ( $(this).is('.goal') ) return;
   $('#audio-try_again').off('timeupdate');
   setTimeout(generate_objects, 200);
});

实际上,它只会执行该回调中的内容一次。

您能否提供更多关于两次重现该事件的确切步骤的信息?从演示中看不出您希望它如何工作。@KevinEnnis对此表示抱歉。进入演示时,打开浏览器的控制台(同样,我感兴趣的浏览器只有Firefox、Google Chrome和Internet Explorer 10),然后单击右侧与左侧颜色不匹配的颜色。这将导致音频播放。音频播放5秒钟后,控制台中将出现一条消息。这就是我想要的。现在再做一次。这一次,控制台中会出现两条消息。啊,当然!这就解决了问题。我应该亲眼看到的。我知道选择器就是这样工作的;我只是错过了。谢谢你帮我解决这个问题!
$.randomize = function(arr) {
    for (var j, x, i = arr.length; i; j = parseInt(Math.random() * i, 10), x = arr[--i], arr[i] = arr[j], arr[j] = x);
    return arr;
};

function factorial(num) {
    var rval = 1;

    for (var i = 2; i <= num; i++) {
        rval = rval * i;
    }

    return rval;
}

function generate_objects() {
    this_pair = get_object_pair();

    if (used_pairs.length < total_permutations) {
        while ($.inArray(this_pair, used_pairs) > -1) {
            this_pair = get_object_pair();
        }
    }
    else {
        used_pairs = [];
    }

    used_pairs.push(this_pair);

    objects = this_pair.split('|');

    object_to_find = objects[0];
    other_object = objects[1];

    $('.goal').html('<a href="javascript:void(0);"><img src="' + images[object_to_find] + '" alt=""></a>');
    $('.choices').html('');

    choices = [
        $('<a href="javascript:void(0);" class="correct"><img src="' + images[object_to_find] + '" alt=""></a>'),
        $('<a href="javascript:void(0);" class="incorrect"><img src="' + images[other_object] + '" alt=""></a>')
    ];

    $.randomize(choices);

    $.each(choices, function(index, value) {
        $('.choices').append(value);
    });

    $('#audio-try_again').on('timeupdate', function() {
        if (try_again_audio_element.currentTime >= 5) {
            $(this).off('timeupdate');

            console.log('Highlight the correct image.');

            $('.correct').animate({opacity: 0.25}, 200, function() {
                $(this).animate({opacity: 1}, 200, function() {
                    $('.correct').animate({opacity: 0.25}, 200, function() {
                        $(this).animate({opacity: 1}, 200);
                    });
                });
            });
        }
    });

    $('.goal, .choices').fadeIn();
}

function get_object_pair() {
    object_to_find = other_object = get_random_index();

    while (other_object == object_to_find) {
        other_object = get_random_index();
    }

    return object_to_find + '|' + other_object;
}

function get_random_index() {
    return Math.floor(Math.random() * total_images);
}

function question_answered() {
    if (correct_answers == 4) {
        alert('You have correctly answered four questions.');
    }
    else {
        $('.goal, .choices').fadeOut(function() {
            $('#audio-try_again').off('timeupdate');

            setTimeout(generate_objects, 200);
        });
    }
}

$(document).ready(function() {
    correct_answers = 0;

    images = [
        'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAcUlEQVR42qXT0QnAIAxFUUfJNJlOp+gwWUfIAOkTUpBAC/V9nI9KuKDV1iIqhQEGM1muaZ3fPwQ6OMQLzxmpAYGrDH+5QPZAh/ipPwEFPwg4aMvDiUNjBYwI2ApMIjDpAL0F+hDp30heJP4q84+Jfs43txnFT7FsW/cAAAAASUVORK5CYII=',
        'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAcUlEQVR42qWT0QnAIAxEHSXTZDqdosNknYADpCekIJZW2kPeh3I8TIwl7ktBAwY8sTzTNT1vBFTQQTzQMyOrQMCRoS2ZlVlQQXykXgJ9u/amHC3ZnPhJGwIjBDYETgicFtAl0E2kn5EcJH6U+c9Ef+cTtijFT/BuGVoAAAAASUVORK5CYII=',
        'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAcUlEQVR42qWT0QnAIAxEHSXTOF2dosNkHcEB0hMOwUAp9j7eh3J5YExKRMlU0ICDTpx3NWW3g4ELDBAvDGYsCwzcDH3CrC0BrXECa9abx6mANbWwOfGTNgUuCHwKuiDoskB+gtxE+RvFQdJHWV8meZ0ftTfFT731dloAAAAASUVORK5CYII=',
        'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAa0lEQVR42qXT0QnAIAwE0IziNE6XTOEwWSeQAex9hFKKbaknvB+JB1Eji9XBwCGK116Xl9VAIWE+yKppq8PjLPw27iEK8ye99pwbAVlnxWBuMhAnAhwkiICgA+gW6Eukn5H8SPxX5oeJHucDimXHMWd8ov0AAAAASUVORK5CYII='
    ];

    total_images = images.length;
    total_permutations = factorial(total_images) / factorial(total_images - 2);

    try_again_audio_element = $('#audio-try_again')[0];

    $(document).on('click', '.correct', function() {
        if (!$(this).hasClass('disabled')) {
            $('.correct, .incorrect').addClass('disabled');

            correct_answers++;
            question_answered();
        }
    }).on('click', '.incorrect', function() {
        if (!$(this).hasClass('disabled')) {
            $('.correct, .incorrect').addClass('disabled');

            try_again_audio_element.play();
        }
    });

    $('#audio-try_again').on('ended', function() {
        question_answered();
    });

    used_pairs = [];
    generate_objects();
});
$('.goal, .choices').fadeOut(function() {
   $('#audio-try_again').off('timeupdate');
   setTimeout(generate_objects, 200);
});
$('.goal, .choices').fadeOut(function() {
   if ( $(this).is('.goal') ) return;
   $('#audio-try_again').off('timeupdate');
   setTimeout(generate_objects, 200);
});