2009-05-22 11 views
17

Bir html sayfasındaki bir dizenin piksel genişliğini hesaplayan hızlı bir işlev yazmak için jquery'yi kullanmaya çalışıyorum, sonra da ideal bir piksel genişliğine ulaşana kadar dizgiyi keser ...Piksel genişliği temel alınarak jQuery ile metin kırpma

o (metin kesecek değil) çalışmıyor Ancak ... İşte

olan kod ben:

İşte
function constrain(text, original, ideal_width){ 

    var temp_item = ('<span class="temp_item" style="display:none;">'+ text +'</span>'); 
    $(temp_item).appendTo('body'); 
    var item_width = $('span.temp_item').width(); 
    var ideal = parseInt(ideal_width); 
    var smaller_text = text; 

    while (item_width > ideal) { 
     smaller_text = smaller_text.substr(0, (smaller_text-1)); 
     $('.temp_item').html(text); 
     item_width = $('span.temp_item').width(); 
    } 

    var final_length = smaller_text.length; 

    if (final_length != original) { 
     return (smaller_text + '&hellip;'); 
    } else { 
     return text; 
    } 
} 

ben sayfasından arıyorum açıklanmıştır:

$('.service_link span:odd').each(function(){ 
    var item_text = $(this).text(); 
    var original_length = item_text.length; 
    var constrained = constrain(item_text, original_length,175); 
    $(this).html(constrained); 
}); 

Neyi yanlış yaptığım hakkında bir fikrin var mı? Bunu daha hızlı yapmak için bir yol varsa (yani baloncuğu), bu da harika olurdu.

Teşekkürler! Bu satırda

cevap

3

:

smaller_text = smaller_text.substr(0, (smaller_text-1));

sorunu çözmek

smaller_text = smaller_text.substr(0, (smaller_text.length-1));

mu istemiş olabilir?

0

Teşekkürler, çalışıyorum - ama sadece ilk maddede çalışıyor ve durur, bu değişkenleri bildirdiğim şekilde mi yapıyor?

function constrain(text, original, ideal_width){ 

    var temp_item = ('<span class="temp_item" style="display:none;">'+ text +'</span>'); 
    $(temp_item).appendTo('body'); 
    var item_width = $('span.temp_item').width(); 
    var ideal = parseInt(ideal_width); 
    var smaller_text = text; 

    while (item_width > ideal) { 
     smaller_text = smaller_text.substr(0, (smaller_text.length-1)); 
     $('.temp_item').html(smaller_text); 
     item_width = $('span.temp_item').width(); 
    } 

    var final_length = smaller_text.length; 

    if (final_length != original) { 
     return (smaller_text + '&hellip;'); 
    } else { 
     return text; 
    } 
} 
+0

Hiçbir şey açıkçası göremiyorum sonraki öğelerde başarısız olmasına neden olan beyanlarla yanlış. Seçicinizin birden çok öğeye uygulandığından emin misiniz? (Ayrıca, lütfen bunu hak ettiğini düşünüyorsanız bir çözüm olarak bir çözüm olarak işaretlemeyi unutmayın =)) –

+0

Safari'de hızlı çalışıyor, ancak Firefox'ta çok uzun sürüyor ... while ifadesini daha fazla yapmak için herhangi bir yol verimli? – novon

+0

BTW - Aşağıdakileri taşıyarak çalışıyorum: var temp_item = (''); $ (temp_item) .appendTo ('body'); İşlev dışına ... ama firefox ve yavaş tarayıcılarda hız sorunu hala devam ediyor! Şu ana kadarki yardım için teşekkürler: – novon

0

fonksiyonu kontrol edilecek metin alır piksel olarak ideal_width ve css için sınıf ismi:

burada geçerli kod var. İdeal_width, metin genişliğinden daha azsa, sarılır ve hellip ekler, aksi halde, değiştirilmemiş metni döndürür. Basit ve çalışır! :-)

function constrain(text, ideal_width, className){ 

    var temp_item = ('<span class="'+className+'_hide" style="display:none;">'+ text +'</span>'); 
    $(temp_item).appendTo('body'); 
    var item_width = $('span.'+className+'_hide').width(); 
    var ideal = parseInt(ideal_width); 
    var smaller_text = text; 

    if (item_width>ideal_width){ 
     while (item_width > ideal) { 
      smaller_text = smaller_text.substr(0, (smaller_text.length-1)); 
      $('.'+className+'_hide').html(smaller_text); 
      item_width = $('span.'+className+'_hide').width(); 
     } 
     smaller_text = smaller_text + '&hellip;' 
    } 
    $('span.'+className+'_hide').remove(); 
    return smaller_text; 
} 
0

Metne sahipseniz ve istediğiniz boyutu biliyorsanız, neden sadece substr?

Ben

$('#history-1').text($('#history-1').text().trim().substr(0,32) + "...") 
+1

Courier gibi sabit genişlikte bir font kullanmıyorsanız, 'n' karakterlerinin' x' piksel genişliğinde olacağını garanti edemezsiniz. (Örneğin, bir m, l'den daha geniş.) Ve gerçekten, sabit genişlikte bir yazı tipi kullanmaya çalışıyor olsanız bile, platformlar arasındaki farklardan dolayı her karakterin piksel genişliğini * garanti edemezsiniz. tarayıcı ayarları vb. – josh3736

34

yerine birlikte komut dosyası ile bu hack ile benzer bir şey yaptı, neden sadece içine bu dize koyarak konum elemanın genişliğini belirtmek için CSS kullanabilirsiniz? Tarayıcıya bir elips ile kırpması gerektiğini bildirmek için text-overflow'u kullanabilirsiniz.

.truncated { display:inline-block; max-width:100px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; } 

text-overflow

312.3+ (Safari 1.3 +/Krom) ve Opera 9+ (sürüm < 10.7 -o-text-overflow beyanı gerekir) bir CSS3 beyanı olduğunu, ancak WebKit, IE 6+ desteklenir.

Not: Bu was unimplemented in Firefox, 7.0'a kadar ve Firefox kullanıcılarının under 4% hala eski sürümlerini kullanıyor (çoğunlukla 3.6). Metniniz daha eski sürümlerde kesilmeye devam edecek, sadece elips oluşmayacak.Eğer kullanıcı bu küçük grubu hakkında endişeleriniz varsa, sen hiçbir şey yapmaz, hangi this jQuery plugin kullanabilirsiniz IE/WebKit/Opera/Firefox ≥ 7, fakat Firefox text-overflow taklit edecek ≤ 6.

+2

Le perfect. Teşekkürler – Jason

+5

Metin taşması: elipslerin boşluk kullanmadığı sürece çalışmadığını unutmayın: nowrap. Yani, kutunun içinde metnin sarılmasını istediğinizde bunu kullanamazsınız. –

+1

Bu çok sinir bozucu - sadece metin taşmasını tek bir satırda kontrol edebilirsiniz? – deed02392

İlgili konular