2013-06-12 2 views
0

Это может быть глупый вопрос, но я пытаюсь скопировать div (div.frame) 8 раз в его родительский (div#game), но его не работает.Не удается получить .clone() для работы

EDIT: div.frame не копируется вообще. Даже console.log(frameClone); показывает странно результата

FIDDLE


JQuery

(function($) { 
    var $game1 = $('div#game1'); 
    var frameClone = $('div.frame').clone(); 

    for (var i = 0; i < 8; i++) { 
     // frameClone.appendTo('div#game1'); 
     // frameClone.appendTo($game1); 
     // $game1.append(frameClone[0]); 
     // $game1.append(frameClone); 
     // none of these work 
    } 

    var $frame = $('div.frame'); 

})(jQuery); 

HTML

<div id="game1"> 
    <!-- this is one frame. Its cloned and repeated 8 more times --> 
    <div data-win="-" class="frame"> 
     <div class="winsign"></div> 
     <div data-sign="-" class="signbox"></div> 
     <div data-sign="-" class="signbox"></div> 
     <div data-sign="-" class="signbox"></div> 
     <div data-sign="-" class="signbox"></div> 
     <div data-sign="-" class="signbox"></div> 
     <div data-sign="-" class="signbox"></div> 
     <div data-sign="-" class="signbox"></div> 
     <div data-sign="-" class="signbox"></div> 
     <div data-sign="-" class="signbox"></div> 
    </div> 
</div> 
+1

Какая часть не работает? –

+2

Это не действительно готовый обработчик DOM, теперь это функция «wrap jQuery». – adeneo

+0

@adeneo: Это прекрасно, если это * после * элементов, на которые он опирается. В скрипке используется 'onload', который является мертвым по умолчанию для jsFiddle, и не знает, находится ли OP в правильном порядке или нет ... –

ответ

4

Вы должны клонировать его каждый цикл, иначе вы просто переместите клон из родителя в родительский.

Например:

(function ($) { 
    var $game1 = $('div#game1'); 
    var $frame = $('div.frame'); 

    for (var i = 0; i < 8; i++) { 
     $frame.clone().appendTo($game1); 
    } 
})(jQuery); 

я, что в вашей скрипке, и она работает, но это не выглядеть как это работает из-за какой-то стиль вещи: Updated Fiddle

Это важно, чтобы код выше находится в теге скрипта после элементов, на которых он работает, потому что этот код запускается немедленно. В вашей Fiddle это происходит из-за того, что вы используете отключенный мозговой шлем jsFiddle , который устанавливает значение по умолчанию, которое помещает ваш код в обработчик window#load. На вашей реальной странице вам может потребоваться установить script тег после элементов. (Или используйте ready, но вы не должны делать, если вы контролируете, где script теги идут.)

+0

Спасибо за помощь :). похоже, что адэней был прав. Мой тег 'script' находился в' head'. Я обычно занимаюсь такими вещами, но в этом случае я полностью пропустил это. И это был мой первый раз с использованием '.clone()', поэтому я предположил, что делаю что-то неправильно. ** Один вопрос **: Итак, значение в клоне остается таким же, независимо от того, что происходит с исходным элементом? – Sourabh

+0

@Sourabh: Да, клон - это отдельный элемент с теми же свойствами. В сценариях лучше не ставить скрипты в 'head'. Подробнее: [YUI Best Practices для ускорения вашего сайта] (http://developer.yahoo.com/performance/rules.html) –

+0

Мой код копирует 'div.frame' только один раз. http://jsfiddle.net/metacode/utZRJ/6/ Как это происходит? Извините, я действительно запутался в кешировании клонов. – Sourabh

2

Вы должны клонировать его каждый цикл

(function ($) { 
    var $game1 = $('div#game1'); 

    for (var i = 0; i < 8; i++) { 
     var frameClone = $('div.frame').first().clone(); 
     frameClone.appendTo($game1); 
    } 
})(jQuery); 

И если вы действительно хотите сократить его:

(function ($) { 
    for (var i = 0; i < 8; i++) $('div.frame').first().clone().appendTo($('#game1')); 
})(jQuery); 

jsFiddle

+1

Вам не нужен клон вне петли – Barmar

+0

@ Бармар не закончил редактирование, просто бросил его там, lol – SpYk3HH

2

Вот упрощенная версия, работает, вы можете увидеть его здесь: http://jsfiddle.net/utZRJ/2/

var $game1 = $('div#game1'); 
for (var i = 0; i < 8; i++) { 
    $('div.frame').eq(0).clone().appendTo($game1); 
} 
+0

Это будет полезно когда-нибудь :) – Sourabh

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