2010-10-31 32 views
9

Estoy cargando dos divs en una página: DIVA y divB¿cuál es la mejor manera de alternar dos divs en la misma zona

tengo divB pantalla style = ninguno.

Tengo un enlace que dice "Mostrar viewB". Cuando hago clic en esto quiero que Div B aparezca donde divA es y divA para ocultar.

i luego quieren que el vínculo para cambiar a "Mostrar viewa"

lo que es la forma más elegante de hacer esto en jQuery?

+0

@bemace: ¿Por qué la etiqueta jquery-ui-pestañas? Como el OP necesita un enlace * single * para alternar la visibilidad de dos elementos, por definición descarta jquery-ui-tabs. –

+0

@Freek - supongo que tienes razón. Enrollado –

Respuesta

10

Mediante el uso de la función toggle():

$("#link").toggle(function() { 
    toggleDivs(); 
    $(this).html("Show viewA"); 
}, function() { 
    toggleDivs(); 
    $(this).html("Show viewB"); 
}); 

function toggleDivs() { 
    $("#divA, #divB").toggle(); 
} 
1

Eso no es muy difícil, intente algo como esto:

var $divA = $('#a'), 
    $divB = $('#b'), 
    $link = $('#link'); 

// Initialize everything 
$link.text('Show A'); 
$divA.hide(); 

$link.click(function(){ 

    // If A is visible when the link is clicked 
    // you need to hide A and show B 
    if($divA.is(':visible')){ 
    $link.text('Show A'); 
    $divA.hide(); 
    $divB.show(); 
    } else { 
    $link.text('Show B'); 
    $divA.show(); 
    $divB.hide(); 
    } 

    return false; 
}); 

Example on jsFiddle

+1

Esa solución es sencilla, pero ¿es elegante? –

0
var divA = $("#divA"); 
var divB = $("#divB"); 
var originalState = true; 

$("#toggler").click(function(e) { 
    originalState = !originalState; 
    if (originalState) { 
     divB.hide(); 
     divA.show(); 
    } else { 
     divA.hide(); 
     divB.show(); 
    } 
    $(this).html(originalState ? "Show viewB" : "Show viewA"); 
    e.preventDefault(); // Assuming you're using an anchor and "#" for the href 
}); 
+0

lógica de error ~ cuando originalState es verdadero, luego divA.show() y divB.hide(). – dz1984

+0

Sí, estaba todo jodido, lo arreglé. – George

0

Si las respuestas anteriores no dan usted el efecto que desea, puede intentar usar el replaceWith método en su lugar (es decir, target.replaceWith(newContent)). Como su nombre indica, reemplazará el target con el newContent. La mejor parte es que lo hará en el lugar.

divA.replaceWith(divB); 
... 
divB.replaceWith(divA); 
4

Muy simple.

Ejemplo:http://jsfiddle.net/Zmsnd/

$('#toggle').click(function() { 
    $('#container > .toggleMe').toggle(); 
    $(this).text(function(i,txt) { return txt === "Show viewB" ? "Show viewA" : "Show viewB"; }); 
}); 
0

Aquí está mi opinión sobre ella:

$("#link").click(function() { 
    $("div[id^=tog_]").toggle(); 
    $(this).text("Show " + $("div[id^=tog_]").not(":visible").attr("id").substr(4)); 
}); 

verlo en JSFiddle.

Espero que esto ayude.

3

Este es mi segundo intento que yo creo que es más elegante que mi respuesta original:

$("#link").click(function(e) { 
    e.preventDefault(); 
    $("#divA, #divB").toggle(); 
    $(this).text(function(i, text) { return (text == "Show viewA") ? "Show viewB" : "Show viewA" }); 
}); 
+0

Este es incorrecto. Dentro del controlador '.click()', * estás asignando * eventos de clic adicionales cada vez que haces clic en el enlace. – user113716

+0

Tiene razón, dentro del evento 'click',' toggle' no se pudo usar. Actualizado ahora – PeterWong

+0

Igual que mi respuesta ahora. – user113716

Cuestiones relacionadas