2012-04-17 5 views
1

Я пробовал решение найдено здесь: How do I add a delay in a JavaScript loop?, но я не мог заставить его работать для меня.Добавить Delay to For Loop

jQuery.fn.createEntry = function() { 
     $("#List").append('<span>New Entry</span>'); 
     $("#List span").draggable({ grid: [30,45] }); 
    } 

    jQuery.fn.tenTimes = function() { 
     for (var i = 1; i <= 10; i++){ 
      $(document).createEntry(); 
     } 
    } 

В .createEntry() сценарий, новый объект переплетены в плагин .draggable() у меня есть. Я использую сочетание клавиш (keyup) для запуска этой функции tenTimes(). Если я нажимаю клавишу более одного раза слишком быстро, многие из новых объектов не будут перетаскиваться. Похоже, случайные объекты не могут стать перетаскиваемыми. Я думал, что, возможно, мои быстрые нажатия клавиш нарушают событие привязки для тех, которые терпят неудачу, но даже если я пойду медленно, некоторые из них не станут перетаскиваемыми.

Есть ли способ проверить, правильно ли был привязан объект, прежде чем переходить к циклу for? Есть ли более строгий подход? К сожалению, это не анимация, поэтому я не могу использовать .delay().

РЕШЕНИЕ

Это был третий сценарий я собираюсь что обрабатываются элементы с помощью appendTo() в том, что является причиной проблемы.

Использование append() или appendTo() похоже на то, что объект привязан к перетаскиваемому объекту, но он по-прежнему теряет левый/верхний CSS, поэтому его нельзя перетаскивать. Вместо того, чтобы вычислять некоторые .css() хак (значения уникальны для каждого), я просто создал совершенно новый элемент и скопировал соответствующие данные, а затем удалил() старый. Draggable привязан к нему должным образом в какой-то другой точке. При этом проблема исправлена.

+1

Вероятно, проблема заключается в функции createEntry(). –

+0

Можете ли вы опубликовать 'createEntry'? –

+0

@joeframbach - я добавил функцию; это очень просто, поэтому я опустил его, но это может быть синтаксис, который нарушает его. –

ответ

1

EDIT

Попробуйте .setTimeout()

Я не читал, что вы сказали .Delay() не может быть использован.

+0

Попробуйте снова прочитать вопрос. * «К сожалению, это не анимация, поэтому я не могу использовать .delay()». * – Ryan

0

Как и в сторону, вы можете найти небольшой выигрыш в производительности путем замены

jQuery.fn.createEntry = function() { 
    $("#List").append('<span>New Entry</span>'); 
    $("#List span").draggable({ grid: [30,45] }); 
} 

с

jQuery.fn.createEntry = function() { 
    $("#List").append($('<span>New Entry</span>').draggable({ grid: [30,45] })); 
} 

Потому что вы, вероятно, не хотят повторно draggable для всех ваших уже существующих span s.

Собственно, это, вероятно, то, что нарушает ваш код. Первый span имеет draggable, повторно примененный к нему 10 раз. Есть draggable idempotent?