2013-04-22 1 views
0

У меня есть следующий код:Изменение ребенка в Jquery не сохраняется в родительских

var data = "<div><p class='a'>Text</p></div>"; 
$(data).find(".a").each(function(){ 
    $(this).addClass("b"); 
}) 

console.log(data); //will output: <div><p class='a'>Text</p></div> 
        //instead of <div><p class='a b'>Text</p></div> 

Я итерация объекта JQuery $(data) и я меняю класс ребенка <p />. Однако, когда я вывожу данные после изменения, класс .b ушел.

Почему это так и как я могу заставить это работать?

ответ

2

Вам необходимо сохранить результат создания элемента DOM. Сама строка никогда не изменяется.

var data = "<div><p class='a'>Text</p></div>"; 

// Create the elements from the markup 
var elems = $(data); 

// Modify the elements 
elems.find(".a").each(function(){ 
    $(this).addClass("b"); 
}); 

// Append the elements to the DOM 
elems.appendTo("body"); 

Вы можете фактически сократить ваш код:

$(data).appendTo("body").find(".a").addClass("b"); 
+0

Мой вопрос намного проще. Очевидно, что в моем примере каждый из них не нужен, но в моем реальном примере жизни это так. – Horen

+0

@Horen: Хорошо, но это только побочная заметка. Дело в том, что вам нужно ссылаться на создание новых элементов DOM, потому что jQuery не выполняет строковые манипуляции. –

+0

... если вы хотите увидеть новую разметку, возьмите первый элемент и используйте '.outerHTML', например:' elems [0] .outerHTML' –

0

Причина заключается в том, что вы не модифицируя строку data

Когда вы говорите $(data) создает структуру DOM из строка и дом манипулируют там после

+0

yes, но не следует менять '$ (data)'? – Horen

+0

@Horen '$ (data)' возвращает структуру dom, которая будет изменена –

+0

Ну, изменив 'console.log (data);' to 'console.log ($ (data));' все еще не показывает изменений – Horen

0

Я думаю, вам нужно сделать что-то вроде этого:

var data = "<div><p class='a'>Text</p></div>"; 
$(data).find('.a').each(function(){ 
    $(this).addClass("b"); 
}).appendTo('body'); //replace body with the target container 
+0

Я не хочу добавлять данные в тело перед изменением класса. – Horen

+0

Отредактировано: это выглядит лучше/работает? – 2013-04-22 16:39:42

1

В вашем случае var data - это строка.

Но когда вы делаете $(data), его преобразовали в объект jQuery и сохранили в памяти. Новый класс б добавляется объект JQuery не в строку data

Вы можете попробовать что-то вроде этого

var data = "<div><p class='a'>Text</p></div>"; 

var $data = ""; // to store the jquery object 

$data = $(data); // converts string to jQuery object 

$data.find(".a").each(function(){ 
    $(this).addClass("b"); 
}) 

console.log($data.get(0).outerHTML); //<div><p class='a b'>Text</p></div> 
Смежные вопросы