jQuery Alternar texto?


79

¿Cómo alternar el texto HTML de una etiqueta de anclaje usando jQuery? Quiero un ancla que cuando se hace clic en el texto se alterna entre Show Backgroundy Show Text, así como también se desvanece dentro y fuera de otro div. Esta fue mi mejor suposición:

$(function() {
    $("#show-background").click(function () {
        $("#content-area").animate({opacity: 'toggle'}, 'slow'); 
    });

    $("#show-background").toggle(function (){
        $(this).text("Show Background")
        .stop();
    }, function(){
        $(this).text("Show Text")
        .stop();
    });
});

¿Qué estaba mal con el código que publicaste? Es útil conocer el problema antes de tener que buscar la solución.
Yacoby

¿Ese código no está haciendo lo que quieres que haga?
Josh Wright

Respuestas:


124
$(function() {
    $("#show-background").click(function () {
        $("#content-area").animate({opacity: 'toggle'}, 'slow'); 
    });

    var text = $('#show-background').text();
    $('#show-background').text(
        text == "Show Background" ? "Show Text" : "Show Background");
});

Alternar oculta o muestra elementos. Puede lograr el mismo efecto usando alternar al tener 2 enlaces y alternarlos cuando se hace clic en cualquiera de ellos.


Para algo similar que le permita mantener el <a>texto de la etiqueta, por ejemplo, "Mostrar texto" y "Mostrar fondo", junto con el HTML de anclaje, en lugar de separarlo en código jQuery, consulte stackoverflow.com/a/28500651/245602
George Hawkins

58

La respuesta más hermosa es ... Extienda jQuery con esta función ...

$.fn.extend({
    toggleText: function(a, b){
        return this.text(this.text() == b ? a : b);
    }
});

HTML:

<button class="example"> Initial </button>

Utilizar:

$(".example").toggleText('Initial', 'Secondary');

He usado la lógica (x == b? A: b) en el caso de que el texto HTML inicial sea ligeramente diferente (un espacio extra, punto, etc.) por lo que nunca obtendrá una visualización duplicada del valor inicial previsto

(También por qué dejé espacios a propósito en el ejemplo HTML ;-)

Otra posibilidad para el uso de alternancia HTML que Meules me llamó la atención [abajo] es:

$.fn.extend({
        toggleHtml: function(a, b){
            return this.html(this.html() == b ? a : b);
        }
    });

HTML:

<div>John Doe was an unknown.<button id='readmore_john_doe'> Read More... </button></div>

Utilizar:

$("readmore_john_doe").click($.toggleHtml(
    'Read More...', 
    'Until they found his real name was <strong>Doe John</strong>.')
);

(o algo como esto)


2
¡Solución brillante! Puede cambiar texta htmly alternar las clases para utilizar esta función como una Leer más / menos leer la función :)
Meules

¡Claro que podría! En aplicaciones web y casos en los que no necesita preocuparse por el texto que encuentran los motores de búsqueda, esta es una gran solución. Solo tenga en cuenta que si el contenido de la sección "leer más" podría ayudar a posicionar un sitio web en los motores de búsqueda debido a su contenido, esta podría no ser la mejor opción.
JxAxMxIxN

37

¡Lo siento, el problema soy yo! el no estaba sincronizado, pero esto se debió a que tengo el texto HTML al revés. En el primer clic, quiero que el div se desvanezca y el texto diga "Mostrar texto".

¡Lo comprobaré más a fondo la próxima vez antes de preguntar!

Mi código es ahora:

$(function() {
  $("#show-background").toggle(function (){
    $("#content-area").animate({opacity: '0'}, 'slow')
    $("#show-background").text("Show Text")
      .stop();
  }, function(){
    $("#content-area").animate({opacity: '1'}, 'slow')
    $("#show-background").text("Show Background")
      .stop();
  });
});

¡Gracias de nuevo por la ayuda!


17
Lectores, ¡cuidado! Esta sobrecarga de togglefunción se eliminó en jQuery 1.9, no podrá usarla a menos que restaure esta funcionalidad . Pero quizás sea mejor si procede a otras respuestas.
usuario

25

Mejorando y simplificando la respuesta de @ Nate:

jQuery.fn.extend({
    toggleText: function (a, b){
        var that = this;
            if (that.text() != a && that.text() != b){
                that.text(a);
            }
            else
            if (that.text() == a){
                that.text(b);
            }
            else
            if (that.text() == b){
                that.text(a);
            }
        return this;
    }
});

Usar como:

$("#YourElementId").toggleText('After', 'Before');

1
@webkitfanz cambia el texto en lugares como ese texto (a) a html , simple. Ver -> $ .fn.extend ({toggleText: function (a, b) {return this.html (this.html () == b? A: b);}});
Vishwa

16
jQuery.fn.extend({
        toggleText: function (a, b){
            var isClicked = false;
            var that = this;
            this.click(function (){
                if (isClicked) { that.text(a); isClicked = false; }
                else { that.text(b); isClicked = true; }
            });
            return this;
        }
    });

$('#someElement').toggleText("hello", "goodbye");

Extensión para JQuery que solo alterna el texto.

JSFiddle: http://jsfiddle.net/NKuhV/


1
Esto fue muy fácil de implementar. Al principio no estaba seguro de que fuera a funcionar porque mi acción de clic también activa un slideToggle, pero funcionó sin problemas. Es ideal para usos de "mostrar texto" / "ocultar texto". ¡Gracias!
acarito

12
var el  = $('#someSelector');    
el.text(el.text() == 'view more' ? 'view less' : 'view more');

Trabajos. Mejor respuesta en mi opinión, lo hice en 2 líneas.

7

¿Por qué no los apilas?

$("#clickedItem").click(function(){
  $("#animatedItem").animate( // );
}).toggle( // <--- you just stack the toggle function here ...
function(){
  $(this).text( // );
},
function(){
  $(this).text( // );
});

5
Esta implementación de alternar se eliminó de Jquery v1.9, ahora alterna la visibilidad. Ver aquí
solipsículo

6

Utilice html () para alternar el contenido HTML. Similar al código de fflyer05 :

$.fn.extend({
    toggleText:function(a,b){
        if(this.html()==a){this.html(b)}
        else{this.html(a)}
    }
});

Uso:

<a href="#" onclick='$(this).toggleText("<strong>I got toggled!</strong>","<u>Toggle me again!</u>")'><i>Toggle me!</i></a>

Violín: http://jsfiddle.net/DmppM/


4

He escrito mi propia pequeña extensión para toggleText. Puede ser útil.

Violín: https://jsfiddle.net/b5u14L5o/

Extensión jQuery:

jQuery.fn.extend({
    toggleText: function(stateOne, stateTwo) {
        return this.each(function() {
            stateTwo = stateTwo || '';
            $(this).text() !== stateTwo && stateOne ? $(this).text(stateTwo)
                                                    : $(this).text(stateOne);
        });  
    }
});

Uso:

...
<button>Unknown</button>
...
//------- BEGIN e.g. 1 -------
//Initial button text is: 'Unknown'
$('button').on('click', function() {
    $(this).toggleText('Show', 'Hide'); // Hide, Show, Hide ... and so on.
});
//------- END e.g. 1 -------

//------- BEGIN e.g. 2 -------
//Initial button text is: 'Unknown'
$('button').on('click', function() {
    $(this).toggleText('Unknown', 'Hide'); // Hide, Unknown, Hide ...
});
//------- END e.g. 2 -------

//------- BEGIN e.g. 3 -------
//Initial button text is: 'Unknown'
$('button').on('click', function() {
    $(this).toggleText(); // Unknown, Unknown, Unknown ...
});
//------- END e.g.3 -------

//------- BEGIN e.g.4 -------
//Initial button text is: 'Unknown'
$('button').on('click', function() {
    $(this).toggleText('Show'); // '', Show, '' ...
});
//------- END e.g.4 -------

3

Utilizar este

jQuery.fn.toggleText = function() {
    var altText = this.data("alt-text");
    if (altText) {
        this.data("alt-text", this.html());
        this.html(altText);
    }
};

Así es como lo demanda

Incluso puede usar html siempre que esté codificado correctamente en html


2

Modificando mi respuesta de su otra pregunta , haría esto:

$(function() {
 $("#show-background").click(function () {
  var c = $("#content-area");
  var o = (c.css('opacity') == 0) ? 1 : 0;
  var t = (o==1) ? 'Show Background' : 'Show Text';
  c.animate({opacity: o}, 'slow');
  $(this).text(t);
 });
});

Wow, me llevará un poco trabajar cómo funciona esto, pero gracias por la ayuda, ¡lo probaré!
mtwallet

Por cierto, ahora me he vinculado a jQuery 1.4 y he desglosado la biblioteca de herramientas aislando solo las partes que necesito. Creo que el conflicto fue con la parte de Flash Embed de la biblioteca.
mtwallet

En caso de que no lo supieras, los oy testán definidos en un operador ternario ( en.wikipedia.org/wiki/Ternary_operation ) .... y vaya, olvidé agregar varal frente - Lo
editaré

1

En la mayoría de los casos, tendría un comportamiento más complejo vinculado a su evento de clic. Por ejemplo, un enlace que alterna la visibilidad de algún elemento, en cuyo caso querrá cambiar el texto del enlace de "Mostrar detalles" a "Ocultar detalles" además de otro comportamiento. En ese caso, esta sería una solución preferida:

$.fn.extend({
  toggleText: function (a, b){
    if (this.text() == a){ this.text(b); }
    else { this.text(a) }
  }
);

Podrías usarlo de esta manera:

$(document).on('click', '.toggle-details', function(e){
  e.preventDefault();
  //other things happening
  $(this).toggleText("Show Details", "Hide Details");
});

Bien, la definición de toggleText pierde un '}'
Kat

1
$.fn.toggleText = function(a){
    var ab = a.split(/\s+/);
    return this.each(function(){
        this._txIdx = this._txIdx!=undefined ? ++this._txIdx : 0;
        this._txIdx = this._txIdx<ab.length ? this._txIdx : 0; 
        $(this).text(ab[this._txIdx]);
    }); 
}; 
$('div').toggleText("Hello Word");

¿Está destinado a ser agregado a jquery?
Joseph Dailey

1
<h2 id="changeText" class="mainText"> Main Text </h2>

(function() {
    var mainText = $('.mainText').text(),
        altText = 'Alt Text';

    $('#changeText').on('click', function(){
        $(this).toggleClass('altText');
        $('.mainText').text(mainText);
        $('.altText').text(altText);
    });

})();

1

Quizás estoy simplificando demasiado el problema, pero esto es lo que uso.

$.fn.extend({
    toggleText: function(a, b) {
        $.trim(this.html()) == a ? this.html(b) : this.html(a);
    }
});

1

Función mejorada de Nate-Wilkins:

jQuery.fn.extend({
    toggleText: function (a, b) {
        var toggle = false, that = this;
        this.on('click', function () {
            that.text((toggle = !toggle) ? b : a);
        });
        return this;
    }
});

html:

<button class="button-toggle-text">Hello World</button>

utilizando:

$('.button-toggle-text').toggleText("Hello World", "Bye!");

1

También puede toggleText usando toggleClass () como un pensamiento ..

.myclass::after {
 content: 'more';
}
.myclass.opened::after {
 content: 'less';
}

Y luego usa

$(myobject).toggleClass('opened');

0

esta no es la forma muy limpia e inteligente, pero es muy fácil de entender y usar algunas veces - es como par e impar - booleano como:

  var moreOrLess = 2;

  $('.Btn').on('click',function(){

     if(moreOrLess % 2 == 0){
        $(this).text('text1');
        moreOrLess ++ ;
     }else{
        $(this).text('more'); 
        moreOrLess ++ ;
     }

});

0

¿Por qué no realizar un seguimiento del estado de una clase sin reglas CSS en el ancla en la que se puede hacer clic?

$(function() {
    $("#show-background").click(function () {
        $("#content-area").animate({opacity: 'toggle'}, 'slow');
        $("#show-background").toggleClass("clicked");
        if ( $("#show-background").hasClass("clicked") ) {
            $(this).text("Show Text");
        }
        else {
            $(this).text("Show Background");
        }
    });
});

0
var jPlayPause = $("#play-pause");
jPlayPause.text(jPlayPause.hasClass("playing") ? "play" : "pause");
jPlayPause.toggleClass("playing");

Esta es una idea que usa el método toggleClass () de jQuery.

Suponga que tiene un elemento con id = "play-pause" y desea alternar el texto entre "play" y "pause".

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.