jQuery切换文本?


79

如何使用jQuery切换锚标记的HTML文本?我想要一个锚点,当单击该文本时,它会在Show Background&之间Show Text以及在另一个div中淡入和淡出。这是我最好的猜测:

$(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();
    });
});

您发布的代码出了什么问题?这有助于在寻求解决方案之前先了解问题。
Yacoby 2010年

那个代码没有按照您的意愿去做吗?
乔什·赖特

Answers:


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");
});

切换隐藏或显示元素。您可以通过具有2个链接并在单击任意一个链接时对其进行切换来使用切换来达到相同的效果。


有关允许您将<a>标记文本(例如“显示文本”和“显示背景”)与锚定HTML一起保留的类似内容,而不是将其分离为jQuery代码,请参见stackoverflow.com/a/28500651/245602
George霍金斯2015年

58

最漂亮的答案是... 用此功能扩展jQuery ...

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

HTML:

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

使用:

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

在初始HTML文本略有不同(额外的空格,句点等)的情况下,我使用了逻辑(x == b?a:b),因此您永远不会得到重复的预期初始值

(这也是为什么我故意在HTML示例中保留空格;-)

Meules引起我注意的另一种使用HTML切换的可能性是:

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

使用:

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

(或类似的东西)


2
出色的解决方案!您可以切换texthtml和切换类,以将此功能用作更多/更少功能:)
Meules

当然可以!在网络应用程序中,您无需担心搜索引擎会发现文本的情况,这是一个很好的解决方案。请记住,如果“阅读更多”部分中的内容由于其内容实际上可以帮助网站在搜索引擎中排名,那么这可能不是最佳选择。
JxAxMxIxN

37

对不起,问题是我!这是不同步的,但这是因为我将HTML文本的处理方式错误了。第一次单击时,我希望div消失,并显示“显示文本”文字。

下次再问我之前会更彻底地检查!

我的代码现在是:

$(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();
  });
});

再次感谢您的帮助!


17
读者,当心!togglejQuery 1.9中已删除了此函数重载,除非您恢复了此功能,否则将无法使用它。但是,如果继续进行其他回答,也许会更好。
用户

25

改善和简化@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;
    }
});

用于:

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

1
@webkitfanz将诸如that.text(a)之类的文本更改为html,很简单。参见-> $ .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");

JQuery的扩展,仅执行文本切换。

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


1
这很容易实现。刚开始我不确定它会成功,因为我的点击动作还会触发slideToggle,但是它确实成功了。非常适合“显示文字” /“隐藏文字”的使用。谢谢!
阿卡里托

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

作品。最好的答案imo,做到了2行。

7

你为什么不把它们叠起来::

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

5
此切换的实现已从Jquery v1.9中删除,现在可以切换可见性。看到这里
solipsicle 2014年


4

我已经为toggleText写了自己的小扩展名。它可能派上用场。

小提琴:https : //jsfiddle.net/b5u14L5o/

jQuery扩展:

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

用法:

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

用这个

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

这是你的起诉方式

您甚至可以使用html,前提是它的html编码正确


2

修改您的其他问题的答案,我会这样做:

$(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);
 });
});

哇,我会花点时间工作,但我会尝试一下,谢谢您的帮助!
mtwallet 2010年

顺便说一句,我现在已经链接到jQuery 1.4,并分解了工具库,仅隔离了我需要的部分。我认为冲突与库的Flash Embed部分有关。
mtwallet 2010年

如果你不知道,o并且t在三元操作符(定义en.wikipedia.org/wiki/Ternary_operation)......和哎呀我忘了添加var在前面-我会编辑,现在
Mottie

1

在大多数情况下,与点击事件相关的行为更为复杂。例如,用于切换某些元素可见性的链接,在这种情况下,除了其他行为之外,您还希望将链接文本从“显示详细信息”交换为“隐藏详细信息”。在这种情况下,这将是首选解决方案:

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

您可以通过以下方式使用它:

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

好看,toggleText定义错过了“}”

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");

这是要添加到jQuery?
约瑟夫·戴利,2014年

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

也许我过分简化了问题,但这就是我所使用的。

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

1

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>

使用:

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

1

您还可以通过使用toggleClass()作为想法来切换文本。

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

然后用

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

0

这不是很干净和聪明的方法,但是它非常易于理解和使用somtimes-像奇数和偶数-布尔型像:

  var moreOrLess = 2;

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

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

});

0

为什么不跟踪可点击锚自身上没有CSS规则的类的状态

$(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");

这是使用jQuery的toggleClass()方法的一个想法。

假设您有一个id =“ play-pause”的元素,并且想在“ play”和“ pause”之间切换文本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.