Многочисленные проблемы с jQuery для игры в стиле Wack-A-Mole

Я действительно изо всех сил пытаюсь пройти через это, но продолжаю сталкиваться с проблемами. Это игра, в которой всплывают мыши, и вы бьете их и получаете очки. Надеюсь, вы можете увидеть это здесь... http://thetally.efinancialnews.com/tallyassets/wackamouse/index.html

В конечном итоге я хочу, чтобы мыши всплыли после случайной задержки, а затем снова опустились. Как только они поднимаются, они становятся "кликабельными". Это класс, который добавляется, когда они поднимаются.

Однако события щелчка не работают для классов, которые были добавлены динамически. Я нашел вопрос, который должен был ответить на эту проблему, но для меня это не имело смысла.

Также задержка становится все короче и короче. Это мой компьютер кеширует и ускоряет? Есть ли способ сделать согласование времени задержки. Или, по крайней мере, около реальных секунд.

Вот код JQuery до сих пор...

var score = 0;  

$(document).ready(function() {


function mouseShow(){

    $('.mouse').each(function() {
        var $mouse = $(this);
        var min = 7000, max = 13000;
        var delay = Math.floor(Math.random() * (max - min) + min);
        setTimeout(function(){

            $mouse.animate({
                'background-position-x': '0',
                'background-position-y': '0'
            }, 300, function() {
                $mouse.addClass('clickable');
                mouseHide();
            });

        },  delay);

    });

}

function mouseHide(){

    $('.mouse').each(function() {
        var $mouse = $(this);
        var min = 4000, max = 6000;
        var delay = Math.floor(Math.random() * (max - min) + min);
        setTimeout(function(){
            $mouse.removeClass('clickable');
            $mouse.animate({
                'background-position-x': '0',
                'background-position-y': '40px'
            }, 300, function() {
                mouseShow();
            });

        },  delay);

    });

}

mouseShow();

    $('.clickable').click(function() {


        $('.score p').remove();
        score += 1;
        $('.score').append( "<p>"+score+"</p>" );
        console.log(score);

    });




});

1 ответ

Вам нужно использовать делегированный обработчик событий, связанный с неизменяемым элементом-предком ваших мышей (например, .mice div) например:

$('.mice').on('click', '.clickable', function() {

Он работает, прослушивая события, восходящие к целевому элементу, затем применяя селектор jQuery к элементам в цепочке пузырьков, затем применяя функцию к любым элементам, вызвавшим событие. Конечным результатом является .clickable элементы должны совпадать только во время события. Для этого требуется только один обработчик для многих элементов, и накладные расходы довольно низкие (и, поскольку вы можете щелкнуть только несколько раз в секунду, разница в производительности незначительна)

Re: задержка, трудно увидеть со случайными числами. Попробуйте с фиксированной продолжительностью проверить производительность, а затем переключитесь на случайную.

Другие вопросы по тегам