2012-01-27 4 views
26

Мне интересно, можно ли переключить позиции двух div с jQuery.Позиции переключателя 2 divs с jQuery

У меня есть два DIV, как этот

<div class="div1">STUFF ONE</div> 
<div class="div2">STUFF TWO</div> 

так что если div2 имеет содержание (или содержит больше, чем просто пробелами) он переключает порядок div1 и div2

так это:

<div class="div1">STUFF ONE</div> 
<div class="div2">STUFF TWO</div> 

станет следующим:

<div class="div2">STUFF TWO</div> 
<div class="div1">STUFF ONE</div> 

Но если бы это было так:

<div class="div1">STUFF ONE</div> 
<div class="div2"></div> 

или это:

<div class="div1">STUFF ONE</div> 
<div class="div2"> </div> 

было бы ничего не делать.

Также ... если возможно, если включен, я хотел бы добавить класс к div1.

Любая помощь с этим будет очень оценена.

UPDATE:

Я забыл добавить, что я должен запустить это через multipul instanses на той же странице.

Каждый экземпляр отформатированный как это:

<div class="view-container"> 
    <div class="view-content"> 
    <div class="views-row"> 
    <div class="div1">STUFF ONE</div> 
    <div class="div2">STUFF TWO</div> 
    </div> 
    <div class="views-row"> 
    <div class="div1">STUFF ONE</div> 
    <div class="div2">STUFF TWO</div> 
    </div> 
    </div> 
</div> 

ответ

35

Я брошу в моем решении

$('.div2:parent').each(function() { 
    $(this).insertBefore($(this).prev('.div1')); 
}); 

Edit: Не работает пробельных в div2.Вот обновлённый решение:

$('.div2').each(function() { 
    if (!$(this).text().match(/^\s*$/)) { 
     $(this).insertBefore($(this).prev('.div1')); 
    } 
}); 
+0

Я добавил эту строку, чтобы добавить класс '$ (this) .next ('. Div1'). AddClass ('new-class');' это выглядит правильно? – Cybercampbell

+1

Мне очень нравится это решение. Очень минималистский. –

+0

Разве это не создает дубликаты? –

1
var row2content = $('.div2').html();    //Get row 2s content 
row2contentnospaces = row2content.replace(' ', ''); //Eliminate whitespace 
if(!(row2contentnospaces == '')){     //Check if row2 is empty 
    var row2 = $('.div2');       //Get row 2 
    $('.div2').remove();       //remove row2 
    $('.div1').before(row2);      //add row 2 before row 1 
} 
+0

Спасибо @David. Это выглядит великолепно. Я забыл добавить, что я должен запускать это через мультиплексные объекты на одной странице. Это что-нибудь изменит? – Cybercampbell

+0

Предполагая, что они используют одни и те же имена классов снова и снова, тогда да, это вызовет проблемы. Чтобы исправить это, я бы поместил каждое спаривание в div, а затем изменил часть кода, чтобы искать братьев и сестер. Это так? –

+0

Только что опубликованный пример кода выше. – Cybercampbell

-1

Хорошо ... почему вы пытаетесь изменить ПОЛОЖЕНИЕ элементов div. Это имеет значение? Почему бы не изменить СОДЕРЖАНИЕ?

var divOneText = $('#div1').html(); 
var divTwoText = $('#div2').html(); 

if (divOneText != '' && divTwoText != '') { 
    $('#div1').html(divTwoText); 
    $('#div2').html(divOneText); 
} 

Добавить trim(), если вы хотите удалить пробелы.

+0

Hi @ Grrbrr404. Мне нужно, чтобы классы относились к контенту. Спасибо, что ответили. – Cybercampbell

+0

Затем смените css. Его намного проще и быстрее, чем переключение полного элемента – Grrbrr404

+0

@ Grrbrr404: Я не согласен. Если вы знаете, что хотите, чтобы все 'div' менялись местами, то безумный подход заключается в том, чтобы поменять местами сами. Если вместо этого вы создадите _whitelist_ контента для обмена, вы будете пропускать что-то: если не сейчас, то позже, когда разметка изменится. –

4
if(div1First){ 
var div2 = ($('.div2')).detach(); 
($('.div1')).append(div2); 
}else{ 
var div1 = ($('.div1')).detach(); 
($('.div2')).append(div1); 
} 

Fiddle to try it.

+1

Мне очень нравится этот способ отсоединения. Я никогда не слышал об этом до этого. Ницца. –

15

Вот пример:

http://jsfiddle.net/52xQP/1/

Сначала вы хотите, чтобы клонировать элементы. Затем проверьте условие, если div2 пуст. Затем выполните обмен:

div1 = $('#div1'); 
div2 = $('#div2'); 

tdiv1 = div1.clone(); 
tdiv2 = div2.clone(); 

if(!div2.is(':empty')){ 
    div1.replaceWith(tdiv2); 
    div2.replaceWith(tdiv1); 

    tdiv1.addClass("replaced"); 
} 
+0

это работало прекрасно – jdmdevdotnet