2012-09-18 159 views
3

中定義的某個點開始。我有一個包含一個div的所有文字,如:Collapsable div,但是從變量

<div class="text-container"> 
<p> 
Though we welcome the idea of a smaller connector, we're miffed that Apple couldn't just adopt the semi-industry standard of Micro-USB. That would make things easier for smartphone users across the globe. Yet, even so, the smaller connector may be a smart move for the future. The 30-pin connector has been around since 2003, long before the iPhone even existed: frankly, it's a dust magnet. A smaller connector helps shave extra space to achieve a smaller phone with perhaps a bigger battery. The new connector cable will mainly be used for syncing and charging by most people who own an Apple TV or Bluetooth/AirPlay accessories. 
</p> 
</div> 

而且我想創造這樣的事情:

<div class="text-container"> 
<p> 
Though we welcome the idea of a smaller connector...<a href="some-javascript-to-show-more">[show more]</a> 
</p> 
</div> 

我想我應該得到的div的所有內容,然後找到首先例如50個字符並放置一個鏈接,並將所有其他文本放入一些將被隱藏的div中,並在點擊該鏈接後顯示其他內容。

它應該是類似於切換的,如果它展開,則將文本從[show more]更改爲[show less],反之亦然。

任何建議如何使用普通的javascript和jquery本身並且沒有其他jQuery插件來實現這一點?

+0

你已經回答了你的問題:「我想我應該得到的div的所有內容,然後找到的第一個如50個字符,並把有聯繫和所有其他文本放在一些將被隱藏的div中,點擊鏈接後,其他的東西就會顯示出來。「 – ankur

+0

是的,但我不是很好的JavaScript和jQuery,我可以自己解決它。我需要一點點幫助,如何解決這個問題。我相信未來也會有其他人從中受益。 – Derfder

回答

2

這裏是另一種解決方案。

它不會簡單地切斷中間的單詞,但會檢查結尾,標點符號和長詞。

$(".text-container p").each(function() { 
    var val = $.trim(this.innerHTML), 
     parsed = val.split(/\s+/), 
     cut = parsed; 

    // for each word 
    for (var i = 0, k = 0; i < parsed.length; i++) { 
     k += parsed[i].length + 1; 

     if (k - 1 > 50) { 
      cut = parsed.slice(0, i); 
      break; 
     } 
    } 

    // if one long word 
    if (cut.length == 0) { 
     cut.push(parsed[0].substring(0, 50)); 
    } 

    val = cut.join(" "); 

    // if the text is long enough to cut 
    if (cut.length != parsed.length) { 
     this.innerHTML = val.replace(/[.,;?!]$/, "") 
      + "<span>...</span> "; 

     $("<span />") 
      .css("display", "none") 
      .html(parsed.slice(cut.length).join(" ") + " ") 
      .appendTo(this); 

     $("<a />", { 
      href : "#", 
      text : "[show more]" 
     }).on("click", function(e) { 
      var sh = this.innerHTML == "[show more]"; 
      $(this).prev("span").toggle(sh).prev("span").toggle(!sh); 
      this.innerHTML = sh ? "[show less]" : "[show more]"; 
      e.preventDefault(); 
     }).appendTo(this); 
    } else { 
     this.innerHTML = val; 
    } 
}); 

DEMO:http://jsfiddle.net/xRuch/

+0

哇,謝謝這個解決方案很棒;) – Derfder

+0

@Derfder很高興,它證明了花費的時間:) – VisioN

0

在現代瀏覽器,你可以使用CSS屬性text-overflow:ellipsis;

http://jsfiddle.net/Y8skB/1/

我用CSS在我的例子來展開文本,但你也可以使用jQuery,如果你想有一個show more鏈接做到這一點。

+0

非常感謝,但是我不能依靠現代瀏覽器,因爲用戶也使用舊瀏覽器。所以,JavaScript是唯一的解決方案。 – Derfder

+0

@Derfder我剛剛檢查,似乎像瀏覽器支持並不是那麼糟糕:http://caniuse.com/text-overflow,但也許我可以後來當我有一段時間的JavaScript解決方案:) – Andy

+1

+1我總是喜歡純粹的CSS ... –

1

構建一個快速demo

jQuery的

$(function(){ 
    var $el = $(".text-container").find("p"); 
    var str = $el.text(); 
    var str1 = str.substr(0,50), str2= str.substr(51); 
    $el.html(str1+" <span class='showMore'><a href='#'>Show more...</a></span><span class='moreText'>"+str2+"</span><span class='showLess'><a href='#'>Show Less</a></span>"); 

    $(".showMore").on("click", function(){ 
     $(this).next(".moreText").show(); 
     $(this).next(".moreText").next(".showLess").show(); 
     $(this).hide(); 
    }); 

    $(".showLess").on("click", function(){ 
     $(this).prev(".moreText").hide(); 
     $(this).prev(".moreText").prev(".showMore").show(); 
     $(this).hide(); 
    }) 

}); 

CSS

.moreText, .showLess { display:none}; 
+0

謝謝,它看起來很有希望。我會嘗試並給你一個反饋。 – Derfder