2009-05-27 12 views
3

Je suis en train de créer une fonction jQuery qui prendra une chaîne et une largeur fixe en entrée, puis à travers une méthode de recherche binaire (pour l'efficacité) « rétrécir » ce morceau de texte il est donc plus que la largeur fixe.Comment puis-je créer une fonction jQuery qui réduit une chaîne à l'aide d'une méthode de recherche binaire?

C'est ce que j'ai jusqu'à présent:

function constrain(text, ideal_width){ 
    var temp = $('.temp_item'); 
    temp.html(text); 
    var item_width = temp.width(); 
    var ideal = parseInt(ideal_width); 

    var text_len_lower = 0; 
    var smaller_text = text; 
    var text_len_higher = text.length; 

    while (true) { 
     if (item_width > ideal) { 

      // make smaller to the mean of "lower" and this 
      text_len_higher = smaller_text.length; 
      smaller_text = text.substr(0, ((text_len_higher + text_len_lower)/2)); 

     } else { 

      if (smaller_text.length >= text_len_higher) break; 

      // make larger to the mean of "higher" and this 
      text_len_lower = smaller_text.length; 
      smaller_text = text.substr(0, ((smaller_text.length + text_len_higher)/2)); 

     } 

     temp.html(smaller_text); 
     item_width = temp.width(); 
    } 

    var new_text = smaller_text + '…' 
    return new_text; 
} 

Malheureusement, cela provoque un « script lent » qui ne se termine jamais dans mon navigateur. Firebug pointe sur la ligne 1131 de jquery.js (version 1.3.2), qui est l'utilitaire jQuery "unique". Je n'utilise pas "unique" partout cependant.

Qu'est-ce que je fais mal ici?

+2

Mec, Rich B, ce que l'enfer est avec les modifications étranges? L'édition n'est pas destinée à changer "J'ai" en "J'ai" et autres joyeusetés. – ceejayoz

+0

@cee: Et rouler en arrière n'est pas destiné à résoudre les problèmes que vous pourriez avoir avec moi. Si vous voyez un montage abusif, par tous les moyens le signaler aux mods. Sinon, occupez-vous de vos propres affaires. – GEOCHET

+1

@ceejayoz - L'édition de Rich en a fait une question. C'est une bonne chose. Je lui donnerais +1 si je le pouvais. –

Répondre

2

Pouvez-vous brancher un débogueur javascript et vérifier où il se bloque? Utilisez Firebug avec Firefox ou MSVS avec IE. S'il souffle si fort que le débogueur meurt, passez en revue la fonction et voyez jusqu'où ça va.

mise à jour basée sur les derniers commentaires: Je pense que vous devez parcourir votre code et voir jusqu'où il obtient. Je serais méfiant de quelques choses:

  1. Peut-être que la largeur de l'objet n'a pas encore été recalculés (ou est devenu invalide) après avoir défini le nouveau texte intérieur. Il se peut que la largeur mise à jour ne soit disponible que plus tard, lorsque l'interface utilisateur effectue un réajustement. Cette boucle en théorie devrait toujours se terminer, mais c'est possible (surtout si le navigateur ne recalcule pas la largeur correctement) la boucle pourrait continuer indéfiniment.

  2. Il se peut que vous divisiez une balise HTML lorsque vous divisiez le texte interne, entraînant l'insertion de code HTML incorrect dans votre code, ce qui peut entraîner la casse de la mise en page.

+0

Firebug est dit il y a une erreur dans jquery.min.js, dont je suis sûr est pas le coupable ici. – Simon

+0

Essayez le débogage avec la jquery non-minifiée. Vous devriez être en mesure d'obtenir plus d'informations sur où l'erreur est de cette façon. –

+0

Merci Matthew.J'ai juste essayé ceci et il semble bloquer à la ligne 1131 de jquery.js (version 1.3.2), qui est le tableau de retour de l'utilité "unique" de jQuery autant que je peux dire. Je n'utilise pas "unique" n'importe où. Je suis confus – Simon

0

Vous essayez de mettre en œuvre quelque chose qui est déjà là:

la propriété text-overflow:ellipsis de CSS. Malheureusement, il n'est encore supporté que par IE, mais un plugin jQuery apporte la fonctionnalité à Firefox. Google pour "text-overflow: ellipsis firefox" car je ne suis pas encore autorisé à publier des liens.

+0

voici un lien que j'ai trouvé via la suggestion de Franz http://devongovett.wordpress.com/2009/04/06/text-overflow-ellipsis-for-firefox-via-jquery/ –

+0

Wow - c'est génial! La solution CSS est (bien sûr) beaucoup plus rapide, et fonctionne aussi dans Safari 4 (je n'ai pas essayé avec Safari 3). Merci beaucoup! – Simon

Questions connexes