2010-10-31 4 views
0

Если вы щелкнете по телу html один раз и дождитесь, пока мяч не заштрихован, он станет прекрасным. Однако, если вы нажмете 2 раза, вы заметите, что мяч движется быстрее. Когда вы снова нажимаете на тело, чтобы вернуть мяч, он все же быстрее, чем должно быть. Зачем? http://jsfiddle.net/44nwt/10/Почему этот код setTimeout создается и не заканчивается?

-edit- in firefox на моей странице (i havent try on jsfiddle) Я замечаю, что функция func называется повторяемо даже после того, как мяч покинул экран и был удален. Почему он не существует?

ответ

1

This works (http://jsfiddle.net/44nwt/11/)

были два вопроса:

# 1 каждый клик создает еще один экземпляр шара и шарнира и добавляет их в тело. Необходимо создать экземпляр, если он еще не существует. Так что будет выглядеть примерно так:

$('body').click(function() { 
    var wrapper = $('.ballwrapper'); 
    if(wrapper.length == 0) { 
     $('body').append('<div class="ballwrapper"><img class="ball" src="http://michaelreid.typepad.com/.a/6a00e54edabd838833011168a00f09970c-800wi"/></div>'); 
    } 
    MoveCode(); 
}); 

# 2 Вам нужны ворота в начале вашей функции MoveCode, чтобы предотвратить «лишние» циклы (те, что начать с каждым дополнительным нажатием) из после того, как мяч/шарнир был удален.

Также обратите внимание ... Я поменял его, чтобы удалить шарнир, а не удалять только мяч. В противном случае, если вы запустите все это снова и снова, вы будете накапливать старые, неиспользуемые шаровые краны в фоновом режиме.

+0

Отлично. Я как-то понял, что проблема была в том, что я пытался создать несколько (не правильно, но мне это не нравилось, просто интересно об эффекте), но не понимал, почему, когда кто-то исчез, другой не начнет двигаться и не удалит себя (я предполагаю, что он перемещает первый найденный). Я думаю, когда я исправил проблему, зная, что проблема не помогает – 2010-10-31 18:08:11

+0

На самом деле, вы не видели отдельного движения, потому что 'MoveCode()' действовал сразу по * всем * экземплярам '.ball'. Селекторы jQuery ('$ ('. ball')') всегда создают * коллекцию *, содержащую все элементы, которые соответствуют селектору (не обязательно одному). Когда коллекция содержит несколько элементов, большая часть свойства * getters * ('.css ('left')') будет просто запрашивать запрашиваемое значение из * первого элемента *. Хотя свойство * setters * ('.css ('left', '60px')') будет устанавливать значение в * все * элементы в списке. [пример для иллюстрации] (http://jsfiddle.net/km26j/) – Lee

1
if (left > parseInt($('.ballwrapper').css('width'))) { 
    //alert('removed'); 
    $('.ball').remove(); 
    return; 
} 

Если оставить не определен (т.е., мяч был уже удален), то условие ложно и планирование будет сделано неоднократно

Смежные вопросы