jQuery Chuyển đổi Văn bản?


79

Làm cách nào để chuyển đổi văn bản HTML của thẻ liên kết bằng jQuery? Tôi muốn một liên kết mà khi được nhấp vào, văn bản sẽ xen kẽ giữa Show Background& Show Textcũng như mờ dần trong & ra một div khác. Đây là dự đoán tốt nhất của tôi:

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

Có gì sai với mã bạn đã đăng? Nó giúp biết vấn đề trước khi phải tìm giải pháp cho nó.
Yacoby

Có phải mã đó không làm những gì bạn muốn nó làm?
Josh Wright

Câu trả lời:


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

Chuyển đổi ẩn hoặc hiển thị các phần tử. Bạn có thể đạt được hiệu ứng tương tự bằng cách sử dụng chuyển đổi bằng cách có 2 liên kết và chuyển đổi chúng khi một trong hai được nhấp vào.


Đối với nội dung tương tự cho phép bạn giữ <a>văn bản thẻ, ví dụ: "Hiển thị văn bản" và "Hiển thị nền", cùng với HTML liên kết, thay vì tách nó thành mã jQuery, hãy xem stackoverflow.com/a/28500651/245602
George Hawkins

58

Câu trả lời hay nhất là ... Mở rộng jQuery với chức năng này ...

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

HTML:

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

Sử dụng:

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

Tôi đã sử dụng logic (x == b? A: b) trong trường hợp văn bản HTML ban đầu hơi khác một chút (thêm dấu cách, dấu chấm, v.v.), vì vậy bạn sẽ không bao giờ nhận được bản sao hiển thị giá trị ban đầu dự định

(Ngoài ra, tại sao tôi lại cố tình để lại khoảng trắng trong ví dụ HTML ;-)

Một khả năng khác để sử dụng chuyển đổi HTML được Meules chú ý đến [bên dưới] là:

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

Sử dụng:

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

(hoặc thứ gì đó giống thế này)


2
Giải pháp tuyệt vời! Bạn có thể thay đổi textđể htmlvà chuyển đổi lớp học để sử dụng chức năng này như một đọc thêm / đọc chức năng ít :)
Meules

Chắc chắn có thể! Trong các ứng dụng web và các trường hợp mà bạn không cần phải lo lắng về việc văn bản được tìm thấy bởi các công cụ tìm kiếm, đây là một giải pháp tuyệt vời. Chỉ cần lưu ý rằng nếu nội dung trong phần "đọc thêm" thực sự có thể giúp trang web xếp hạng trong công cụ tìm kiếm do nội dung của nó, thì đây có thể không phải là lựa chọn tốt nhất.
JxAxMxIxN

37

Xin lỗi vấn đề là tôi! không đồng bộ nhưng điều này là do tôi có văn bản HTML không đúng cách. Trong lần nhấp đầu tiên, tôi muốn div mờ dần và văn bản có nội dung "Show Text".

Sẽ kiểm tra kỹ hơn lần sau trước khi tôi hỏi!

Mã của tôi bây giờ là:

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

Cảm ơn một lần nữa vì sự giúp đỡ!


17
Độc giả, hãy cẩn thận! Hàm quá tải này toggleđã bị loại bỏ trong jQuery 1.9, bạn sẽ không thể sử dụng nó trừ khi khôi phục lại chức năng này . Nhưng có lẽ sẽ tốt hơn nếu bạn chuyển sang các câu trả lời khác.
người dùng

25

Cải thiện và đơn giản hóa câu trả lời của @ 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;
    }
});

Sử dụng như là:

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

1
@webkitfanz thay đổi văn bản ở những nơi như thế .text (a) thành html , đơn giản. Xem -> $ .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");

Phần mở rộng cho JQuery chỉ thực hiện chuyển đổi văn bản.

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


1
Điều này rất dễ thực hiện. Lúc đầu, tôi không chắc nó sẽ thực hiện thủ thuật vì hành động nhấp chuột của tôi cũng kích hoạt slideToggle, nhưng nó đã thực hiện thủ thuật mà không có vấn đề gì. Nó tuyệt vời cho việc sử dụng "hiển thị Văn bản" / "Ẩn Văn bản". Cảm ơn!
acarito

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

Làm. Câu trả lời hay nhất imo, đã làm nó trong 2 dòng.

7

Tại sao bạn không xếp chúng lại ::

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

5
Việc triển khai chuyển đổi này đã bị xóa khỏi Jquery v1.9, hiện nó chuyển đổi chế độ hiển thị. Xem ở đây
solipsicle

6

Sử dụng html () để chuyển đổi nội dung HTML. Tương tự với mã của fflyer05 :

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

Sử dụng:

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

Fiddle: http://jsfiddle.net/DmppM/


4

Tôi đã viết tiện ích mở rộng nhỏ của riêng mình cho toggleText. Nó có thể có ích.

Fiddle: https://jsfiddle.net/b5u14L5o/

jQuery Extension:

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

Sử dụng:

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

Dùng cái này

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

Đây là cách bạn kiện nó

Bạn thậm chí có thể sử dụng html miễn là nó được mã hóa html đúng cách


2

Sửa đổi câu trả lời của tôi từ câu hỏi khác của bạn , tôi sẽ làm điều này:

$(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 sẽ giúp tôi một chút công việc về cách thức hoạt động của nó nhưng cảm ơn sự giúp đỡ, tôi sẽ thử nó!
mtwallet

BTW Bây giờ tôi đã liên kết với jQuery 1.4 và chia nhỏ thư viện Công cụ cô lập chỉ những phần tôi cần. Tôi nghĩ rằng xung đột là với phần Nhúng Flash của thư viện.
mtwallet

Trong trường hợp bạn không biết, otđược định nghĩa trong toán tử bậc ba ( en.wikipedia.org/wiki/Ternary_operation ) .... và rất tiếc, tôi đã quên thêm varvào phía trước - Tôi sẽ chỉnh sửa ngay bây giờ
Mottie

1

Trong hầu hết các trường hợp, bạn sẽ có hành vi phức tạp hơn gắn với sự kiện nhấp chuột của mình. Ví dụ: một liên kết chuyển đổi khả năng hiển thị của một số phần tử, trong trường hợp đó, bạn muốn hoán đổi văn bản liên kết từ "Hiển thị chi tiết" thành "Ẩn chi tiết" ngoài hành vi khác. Trong trường hợp đó, đây sẽ là một giải pháp ưu tiên:

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

Bạn có thể sử dụng nó theo cách này:

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

Tuyệt vời, định nghĩa toggleText thiếu dấu '}'
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");

điều này có nghĩa là được thêm vào 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

Có lẽ tôi đang đơn giản hóa vấn đề, nhưng đây là những gì tôi sử dụng.

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

1

Chức năng cải tiến của 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>

sử dụng:

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

1

Bạn cũng có thể toggleText bằng cách sử dụng toggleClass () như một ý nghĩ ..

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

Và sau đó sử dụng

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

0

đây không phải là cách rất sạch sẽ và thông minh nhưng rất dễ hiểu và dễ sử dụng somtimes - giống như kiểu boolean lẻ và chẵn - như:

  var moreOrLess = 2;

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

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

});

0

Tại sao không theo dõi trạng thái của thông qua một lớp mà không có quy tắc CSS trên chính neo có thể nhấp

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

Đây là một phần suy nghĩ bằng cách sử dụng phương thức toggleClass () của jQuery.

Giả sử bạn có một phần tử có id = "play-pause" và bạn muốn chuyển văn bản giữa "play" và "pause".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.