0

以下のjQueryコードを使用して、Webページの余分なテキストを表示/非表示にしています

jQuery.fn.shorten = function(settings) {
  var config = {
    showChars : 100,
    ellipsesText : "...",
    moreText : "more",
    lessText : "less"
  };

  if (settings) {
    $.extend(config, settings);
  }

  $('.morelink').live('click', function() {
    var $this = $(this);
    if ($this.hasClass('less')) {
      $this.removeClass('less');
      $this.html(config.moreText);
    } else {
      $this.addClass('less');
      $this.html(config.lessText);
    }
    $this.parent().prev().toggle();
    $this.prev().toggle();
    return false;
  });

  return this.each(function() {
    var $this = $(this);

    var content = $this.html();
    if (content.length > config.showChars) {
      var c = content.substr(0, config.showChars);
      var h = content.substr(config.showChars , content.length - config.showChars);
      var html = c + '<span class="moreellipses">' + config.ellipsesText + '&nbsp;</span><span   class="morecontent"><span>' + h + '</span>&nbsp;&nbsp;<a href="javascript://nop/" class="morelink">' +  config.moreText + '</a></span>';
      $this.html(html);
      $(".morecontent span").hide();
    }
  });
};

以下のhtmlに適用しようとしています:

    <div id="idcncinfobox" class="cncinfobox">             
        <div class="basic_cnc_info_layout">
            <span class="cncDesc more">asdjlkaj  lakjd alkjs dajskldj uiojlksjdf kljsdf jirj klcj sdklfj skldjf rijfkls dj fjsdklfjr iej kldjf sh fbasnmb fa slkjdf dfjkjri wsll l ljdklfjkljsd jskldfj jsdklfj jskldjf jklsdjfklsdj irjklsjdfir lskdjfir jklsjdfkl jsir jklsjdklfjrijklsjdklf</span>
            <dl>                        
                <dt>Aliases</dt><dt1>:</dt1><dd itemprop="actor" class="cncAliases more">fasdfsdfssdlkfjskldjf klsjlkdfjklsdj jsdklfj sjdkljf sjkldfdjkl ksdjl; fsdj f;sdkljf sdkl;fj sdkjkfjsdkljfklj jsdkl;fjklsdjfkljdkjfkljdklsjfkldjsklf</dd>
            </dl>                        
        </div>   
    </div>

以下のjsコードを使用してjQuery関数を呼び出しています:

    $(document).ready(function() {
        $(".cncDesc").shorten({
             "showChars" : 50,
            "moreText"  : "See More",
            "lessText"  : "Less"
        });
        $(".cncAliases").shorten({
             "showChars" : 20,
            "moreText"  : "See More",
            "lessText"  : "Less"
        });
    });

ご覧のとおり、同じページの 2 つの要素で表示/非表示の効果を取得しようとしています。そして、何らかの理由でそれが機能していません。1 つの要素だけに適用すると、正常に動作します。デバッグを試みたところ、2 つの要素に適用すると、「クリック」機能が 2 回実行され、結果として効果が取り消されることがわかりました。

ここでフィドルを作成しましたhttp://jsfiddle.net/RzB7E/4/

4

2 に答える 2

3

この行を変更するだけでよいと思います

$('.morelink').live('click', function() {

$(this).find('.morelink').live('click', function() {

ここでわかるように: http://jsfiddle.net/RzB7E/7/

クラスを介してクリック イベントにバインドすると、そのクラスのすべての要素のすべてのクリックもバインドます。上記の変更は、クリックを適用する特定のものを指定します。.morelink

于 2012-12-21T06:17:07.117 に答える
2

@Sberryの回答に同意しますが、提案として、これを使用してください

$(this).find('.morelink').on('click', function() {

jQuery v.1.7以降以降、この.live()メソッドは明らかに非推奨になっています。詳細はこちら

于 2012-12-21T06:22:13.297 に答える