2012-01-27 32 views
26

Tôi tự hỏi nếu nó có thể chuyển vị trí của hai div với jQuery.Chuyển vị trí của 2 div với jQuery

Tôi có hai div như thế này

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

vì vậy nếu div2 có nội dung (hoặc chứa hơn không gian chỉ trắng) nó chuyển thứ tự của div1div2

vì vậy đây:

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

sẽ trở thành:

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

Nhưng nếu nó là thế này:

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

hay này:

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

nó sẽ không làm gì cả.

Ngoài ra ... nếu có thể, nếu được chuyển, tôi muốn thêm lớp học vào div1.

Bất kỳ trợ giúp nào về vấn đề này sẽ được đánh giá rất nhiều.

CẬP NHẬT:

Tôi quên thêm rằng tôi phải chạy tính năng này trên nhiều bản sao trên cùng một trang.

Mỗi trường hợp được formated như thế này:

<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> 

Trả lời

35

tôi sẽ ném vào giải pháp của tôi

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

Edit: Không làm việc cho khoảng trắng trong div2.Dưới đây là một giải pháp Cập nhật:

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

Tôi đã thêm dòng này để thêm lớp '$ (this) .next ('. Div1'). AddClass ('new-class');' có đúng không? – Cybercampbell

+1

Tôi thực sự thích giải pháp này. Rất tối giản. –

+0

Điều này không tạo bản sao? –

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

Cảm ơn @David. Điều này có vẻ tuyệt vời. Tôi quên để thêm rằng tôi phải chạy này trên instanses multipul trên cùng một trang. Điều đó có thay đổi gì không? – Cybercampbell

+0

Giả sử họ đang sử dụng cùng một tên lớp lặp đi lặp lại, sau đó có nó sẽ gây ra vấn đề. Để khắc phục điều này, tôi sẽ đặt mỗi cặp trong div, và sau đó thay đổi một số mã xung quanh để tìm anh chị em. IS là trường hợp? –

+0

Chỉ cần đăng mã ví dụ ở trên. – Cybercampbell

-1

Vâng ... tại sao bạn đang cố thay đổi POSITION của các phần tử div. Nó có quan trọng không? Tại sao không thay đổi CONTENT?

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

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

Thêm cắt() nếu bạn muốn xóa khoảng trắng.

+0

Hi @ Grrbrr404. Tôi cần phải giữ cho các lớp liên quan đến nội dung. Cảm ơn bạn đã trả lời. – Cybercampbell

+0

Sau đó thay đổi css. Dễ dàng hơn và nhanh hơn sau đó chuyển đổi hoàn thành phần tử – Grrbrr404

+0

@ Grrbrr404: Tôi không đồng ý. Nếu bạn biết rằng bạn muốn mọi thứ về 'div' được hoán đổi xung quanh, thì cách tiếp cận lừa gạt là trao đổi chính các nút. Thay vào đó, nếu bạn tạo một _whitelist_ nội dung để hoán đổi, bạn sẽ bỏ lỡ điều gì đó: nếu không phải bây giờ, sau đó, khi thay đổi đánh dấu. –

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

Fiddle to try it.

+1

Tôi thực sự thích phương pháp tách rời đó. Tôi chưa bao giờ nghe về nó trước đó. Tốt đẹp. –

15

Dưới đây là một ví dụ:

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

Trước tiên, bạn muốn sao chép các yếu tố này. Sau đó, kiểm tra điều kiện nếu div2 rỗng. Sau đó, thực hiện hoán đổi:

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

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

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

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

điều này làm việc đẹp – jdmdevdotnet

Các vấn đề liên quan