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();
    });
});
mtwallet
fuente
¿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.

Kyle Butt
fuente
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)

JxAxMxIxN
fuente
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!

mtwallet
fuente
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');
Diego Favero
fuente
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/

Nate-Wilkins
fuente
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');
Judson Terrell
fuente
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( // );
});
Eugene Koekemoer
fuente
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/

Tomasz Majerski
fuente
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 -------
primer poste último
fuente
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

aWebDeveloper
fuente
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);
 });
});
Pajeño
fuente
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");
});
fflyer05
fuente
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");
RulazISC
fuente
¿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);
    });

})();
J. Archiqueta
fuente
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);
    }
});
Y yo
fuente
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!");
Yurii Rabeshko
fuente
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');
Ricky Levi
fuente
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 ++ ;
     }

});
Erez Lieberman
fuente
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");
        }
    });
});
ortonomía
fuente
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".

mriiiron
fuente