Это - конец дня. Я надеюсь, что у меня просто есть ошибка логики.
Я не могу заставить это работать:
var $divA= $("<div></div>").addClass('classA');
var $divB= $("<div></div>").addClass('classB');
$myDiv.after($divA.wrap($divB));
Вышеупомянутое должно повернуть это:
<div id="myDiv"></div>
В это:
<div id="myDiv"></div>
<div class="classB">
<div class="classA"></div>
</div>
Но это, кажется, не работает с тем 'переносом' там. Я не получаю ошибок, это просто не переносит диву с divB и просто вводит диву отдельно.
Я - недоразумение, переносятся?
ОБНОВЛЕНИЕ:
Более простой пример, который не работает:
$myBox.after($("<p></p>").wrap("<div></div>"));
Это добавит просто DIV после myBox.
Кажется, что jQuery не нравится, переносятся добавленный к после.
Вы пытались
$myDiv.after($divA.wrap('<div class="divB"></div>'));
только для целей тестирования?
Насколько я понимаю, вы не должны проходить Объект jQuery к функции обертывания:
Функция .wrap () может принимать любые строка или объект, который может быть передан к функции завода $ () на Укажите Структура DOM . Эта структура может быть вложенный несколько уровней глубоко, но должен содержать только один изнутри. То структура будет обернута вокруг каждого элементов в наборе сопоставленных элементы.
Если пример выше работает, то это причина; -)
Согласно W3C и этот сайт элемент < form >
в 1,1 XHTML может содержать только элементы уровня блока и < fieldset >
.
Что касается почему ... Я считаю, что причина, по которой форма
может содержать только элементы блочного уровня, заключается в том, что она не считается элементом сама по себе, а скорее оберткой вокруг других элементов. Было некоторое обсуждение этого в списках рассылки w3c несколько лет назад, что я смог откопать - но ничего, что на самом деле ответило на вопрос.
Компилятор лучше оптимизирует оператор switch, чем оператор if.
Компилятор не знает, важен ли для вас порядок вычисления операторов if, и не может выполнить оптимизацию. Вы можете вызывать методы в операторах if, влияя на переменные. С помощью оператора switch он знает, что все предложения могут быть оценены одновременно и могут привести их в любой порядок, который наиболее эффективен.
Вот небольшое сравнение:
http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx
Я получил это для работы:
$('div#myDiv').after("<div class='classA'></div>").end().find('.classA').wrap("<div class='classB'></div>");
с вашим html для решения вашего первоначального вопроса. Здесь - источник конечной функции jQuery. Этот код приведет к тому, что цепь поднимется на один уровень (до уровня myDiv), а затем обернется на основе поиска («.classA») на этом уровне. Это найдет ваш div добавлен с после, и обернуть его в div с классом B.
Изменить: Хорошо, я думаю, что это будет работать для вас так, как вы хотите:
var divA= $("<div></div>").addClass('classA');
$('div#myDiv').after($(divA).wrap('<div class="divB" />'));
Я думаю, что проблема была в том, что при вызове wrap на divA, это должен быть объект jQuery, чтобы работать правильно. Так что на самом деле, тебя не хватало только обертывания divA в ().
Вы не ищете обертку. Вы хотите:
divB.append(divA).insertAfter('#myDiv');
Может быть, я читаю это неправильно, но если вы используете jQuery, разве $ не зарезервированный символ? Вы пробовали просто задать имена переменных, чтобы они не использовали его?
Если да:
var divA = $("<div></div>").addClass('classA');
divA.wrap("<div class=\"classB\"></div>");
divA.insertAfter($("#myDiv"));
или
divA.after($("#myDiv"));
Вот документы jQuery по этому вопросу.