Changeset 5496 in subversion


Ignore:
Timestamp:
Nov 27, 2011 10:11:20 AM (19 months ago)
Author:
alec
Message:
  • Fix fit_string_to_size() renders browser and ui unresponsive (#1488207): 1) improve its performance by half, 2) don't call it on UI init, it's called after getunread action 3) don't call it for big number of folders (limit is 100 for IE and 500 for others)
Location:
trunk/roundcubemail
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/roundcubemail/CHANGELOG

    r5495 r5496  
    22=========================== 
    33 
     4- Fix fit_string_to_size() renders browser and ui unresponsive (#1488207) 
    45- Fix handling of invalid characters in request (#1488124) 
    56- Fix merging some configuration options in update.sh script (#1485864) 
  • trunk/roundcubemail/skins/default/functions.js

    r5493 r5496  
    571571      rcmail.addEventListener('responseaftercheck-recent', rcube_render_mailboxlist); 
    572572      rcmail.addEventListener('aftercollapse-folder', rcube_render_mailboxlist); 
    573       rcube_render_mailboxlist(); 
    574573    } 
    575574 
     
    593592function rcube_render_mailboxlist() 
    594593{ 
    595   if (bw.ie6)  // doesn't work well on IE6 
     594  var list = $('#mailboxlist > li a, #mailboxlist ul:visible > li a'); 
     595 
     596  // it's too slow with really big number of folders, especially on IE 
     597  if (list.length > 500 * (bw.ie ? 0.2 : 1)) 
    596598    return; 
    597599 
    598   $('#mailboxlist > li a, #mailboxlist ul:visible > li a').each(function(){ 
    599     var elem = $(this); 
    600     var text = elem.data('text'); 
     600  list.each(function(){ 
     601    var elem = $(this), 
     602      text = elem.data('text'); 
     603 
    601604    if (!text) { 
    602605      text = elem.text().replace(/\s+\(.+$/, ''); 
     
    616619function fit_string_to_size(str, elem, len) 
    617620{ 
    618     var result = str; 
    619     var ellip = '...'; 
    620     var span = $('<b>').css({ visibility:'hidden', padding:'0px' }).appendTo(elem).get(0); 
    621  
    622     // on first run, check if string fits into the length already. 
    623     span.innerHTML = result; 
    624     if (span.offsetWidth > len) { 
    625         var cut = Math.max(1, Math.floor(str.length * ((span.offsetWidth - len) / span.offsetWidth) / 2)), 
    626           mid = Math.floor(str.length / 2); 
    627         var offLeft = mid, offRight = mid; 
    628         while (true) { 
    629             offLeft = mid - cut; 
    630             offRight = mid + cut; 
    631             span.innerHTML = str.substring(0,offLeft) + ellip + str.substring(offRight); 
    632  
    633             // break loop if string fits size 
    634             if (span.offsetWidth <= len || offLeft < 3) 
    635               break; 
    636  
    637             cut++; 
    638         } 
    639  
    640         // build resulting string 
    641         result = str.substring(0,offLeft) + ellip + str.substring(offRight); 
    642     } 
    643      
    644     span.parentNode.removeChild(span); 
    645     return result; 
     621  var w, span, result = str, ellip = '...'; 
     622 
     623  if (!rcmail.env.tmp_span) { 
     624    // it should be appended to elem to use the same css style 
     625    // but for performance reasons we'll append it to body (once) 
     626    span = $('<b>').css({visibility: 'hidden', padding: '0px'}) 
     627      .appendTo($('body', document)).get(0); 
     628    rcmail.env.tmp_span = span; 
     629  } 
     630  else { 
     631    span = rcmail.env.tmp_span; 
     632  } 
     633  span.innerHTML = result; 
     634 
     635  // on first run, check if string fits into the length already. 
     636  w = span.offsetWidth; 
     637  if (w > len) { 
     638    var cut = Math.max(1, Math.floor(str.length * ((w - len) / w) / 2)), 
     639      mid = Math.floor(str.length / 2), 
     640      offLeft = mid, 
     641      offRight = mid; 
     642 
     643    while (true) { 
     644      offLeft = mid - cut; 
     645      offRight = mid + cut; 
     646      span.innerHTML = str.substring(0,offLeft) + ellip + str.substring(offRight); 
     647 
     648      // break loop if string fits size 
     649      if (offLeft < 3 || span.offsetWidth) 
     650        break; 
     651 
     652      cut++; 
     653    } 
     654 
     655    // build resulting string 
     656    result = str.substring(0,offLeft) + ellip + str.substring(offRight); 
     657  } 
     658 
     659  return result; 
    646660} 
    647661 
Note: See TracChangeset for help on using the changeset viewer.