J'ai une étendue avec des données dynamiques dans ma page, avec ellipsis
style.
.my-class
{
text-overflow: ellipsis;
overflow: hidden;
white-space: nowrap;
width: 71px;
}
<span id="myId" class="my-class"></span>
document.getElementById('myId').innerText = "...";
Je voudrais ajouter à cette info-bulle d'élément avec le même contenu, mais je veux qu'elle n'apparaisse que lorsque le contenu est long et que les points de suspension apparaissent à l'écran.
Y a-t-il un moyen de le faire?
Le navigateur lance-t-il un événement lorsqu'il ellipsis
est activé?
* Navigateur: Internet Explorer
text-overflow:ellipsis;
cela ne fonctionne pas du tout dans Firefox - voir cette question pour plus: stackoverflow.com/questions/4927257/…element.offsetWidth < element.scrollWidth
selon cette réponse semble fonctionner jusqu'à présent.text-overflow:ellipsis;
fonctionne maintenant dans Firefox; il a été ajouté dans Firefox 7 (sorti en septembre 2011).Réponses:
Voici une façon de le faire en utilisant le paramètre des points de suspension intégrés et en ajoutant l'
title
attribut à la demande (avec jQuery) en s'appuyant sur le commentaire de Martin Smith:la source
"As of jQuery 1.7, the .on() method is the preferred method for attaching event handlers to a document"
pour plus d'informations, voir api.jquery.com/bind et api.jquery.com/onVoici une solution CSS pure. Pas besoin de jQuery. Il n'affichera pas d'infobulle, mais étendra simplement le contenu sur toute sa longueur au survol de la souris.
Fonctionne très bien si vous avez du contenu qui est remplacé. Ensuite, vous n'avez pas besoin d'exécuter une fonction jQuery à chaque fois.
la source
La réponse de uosɐſ est fondamentalement correcte, mais vous ne voulez probablement pas le faire dans l'événement mouseenter. Cela va le faire faire le calcul pour déterminer s'il est nécessaire, chaque fois que vous passez la souris sur l'élément. À moins que la taille de l'élément ne change, il n'y a aucune raison de le faire.
Il serait préférable d'appeler ce code immédiatement après l'ajout de l'élément au DOM:
Ou, si vous ne savez pas exactement quand il est ajouté, appelez ce code une fois le chargement de la page terminé.
si vous avez plus d'un seul élément avec lequel vous devez le faire, vous pouvez leur donner la même classe (comme "mightOverflow") et utiliser ce code pour les mettre à jour tous:
la source
$(".mightOverflow").each(function() { if( $(this).offsetWidth < $(this).scrollWidth && !$(this).attr('title')){ $(this).attr('title', $(this).text()); $(this).css('border-bottom', '1px dotted #A8A8A8'); } });
this.offsetWidth < this.scrollWidth
et éventuellement même la vérification!$this.attr('title')
sera effectuée chaque fois que vous passez la souris sur l'élément.Voici deux autres solutions CSS pures:
la source
Voici mon plugin jQuery:
Usage:
Éditer:
J'ai fait un aperçu de ce plugin. https://gist.github.com/UziTech/d45102cdffb1039d4415
la source
Nous devons détecter si les points de suspension sont réellement appliqués, puis afficher une info-bulle pour révéler le texte intégral. Il ne suffit pas de comparer "
this.offsetWidth < this.scrollWidth
" lorsque l'élément contient presque son contenu, mais il ne manque qu'un ou deux pixels de plus en largeur, en particulier pour le texte de caractères chinois / japonais / coréens pleine largeur.Voici un exemple: http://jsfiddle.net/28r5D/5/
J'ai trouvé un moyen d'améliorer la détection des points de suspension:
this.offsetWidth < this.scrollWidth
", continuez l'étape 2 en cas d'échec.Voici mon amélioration: http://jsfiddle.net/28r5D/6/
la source
J'ai créé un plugin jQuery qui utilise l'info-bulle de Bootstrap au lieu de l'info-bulle intégrée du navigateur. Veuillez noter que cela n'a pas été testé avec un navigateur plus ancien.
JSFiddle: https://jsfiddle.net/0bhsoavy/4/
la source
C'est ce que j'ai fait. La plupart des scripts d'infobulles nécessitent que vous exécutiez une fonction qui stocke les info-bulles. Ceci est un exemple jQuery:
Si vous ne vouliez pas vérifier les ellipses css, vous pouvez simplifier comme:
J'ai le "quand" autour de lui, de sorte que la fonction "setupTooltip" ne s'exécute pas tant que tous les titres n'ont pas été mis à jour. Remplacez le "setupTooltip", par votre fonction d'info-bulle et le * par les éléments que vous souhaitez vérifier. * passera par tous si vous le laissez.
Si vous souhaitez simplement mettre à jour les attributs de titre avec l'info-bulle des navigateurs, vous pouvez simplifier comme:
Ou sans vérification des points de suspension:
la source
Si vous souhaitez le faire uniquement en utilisant javascript, je ferais ce qui suit. Donnez à l'intervalle un attribut id (afin qu'il puisse être facilement récupéré à partir du DOM) et placez tout le contenu dans un attribut nommé «contenu»:
Ensuite, dans votre javascript, vous pouvez effectuer les opérations suivantes après que l'élément a été inséré dans le DOM.
Bien sûr, si vous utilisez javascript pour insérer la plage dans le DOM, vous pouvez simplement conserver le contenu dans une variable avant de l'insérer. De cette façon, vous n'avez pas besoin d'un attribut de contenu sur la durée.
Il existe des solutions plus élégantes que cela si vous souhaitez utiliser jQuery.
la source
$("#myDataId").attr("title", function() { var innerText = $(this).text(); var content = $(this).attr("content"); if (innerText.length <= content.length) { return content; } return null; });
J'ai une classe CSS, qui détermine où placer les points de suspension. Sur cette base, je fais ce qui suit (l'ensemble d'éléments pourrait être différent, j'écris ceux-ci, où les points de suspension sont utilisés, bien sûr, il pourrait s'agir d'un sélecteur de classe distinct):
la source
this
était unanchor
donc j'ai utilisé à lathis.text()
place deval()
Voici une solution JavaScript Vanilla:
la source
Ce fut ma solution, fonctionne comme un charme!
la source
Aucune des solutions ci-dessus n'a fonctionné pour moi, mais j'ai trouvé une excellente solution. La plus grande erreur que les gens font est d'avoir les 3 propriétés CSS déclarées sur l'élément lors du chargement de page. Vous devez ajouter ces styles + info-bulle dynamiquement SI et UNIQUEMENT SI la plage sur laquelle vous voulez une ellipse est plus large que son parent.
la source
Vous pouvez éventuellement entourer la travée d'une autre travée, puis simplement tester si la largeur de la travée d'origine / intérieure est supérieure à celle de la nouvelle travée / extérieure. Notez que je dis peut-être - c'est à peu près basé sur ma situation où j'avais un
span
intérieur d'untd
donc je ne sais pas vraiment si cela fonctionnera avec unspan
intérieur d'unspan
.Voici cependant mon code pour les autres qui peuvent se retrouver dans une position similaire à la mienne; Je le copie / colle sans modification même si c'est dans un contexte angulaire, je ne pense pas que cela nuit à la lisibilité et au concept essentiel. Je l'ai codé comme méthode de service parce que je devais l'appliquer à plus d'un endroit. Le sélecteur que j'ai transmis est un sélecteur de classe qui correspondra à plusieurs instances.
la source