HTML - comment puis-je afficher les info-bulle UNIQUEMENT lorsque le bouton de sélection est activé
J'ai eu une période avec des données dynamiques dans ma page qui contiennent des points de suspension. Sens:
<span style='text-overflow: ellipsis; overflow : hidden; white-space: nowrap;
width: 71;'>${myData}</span>
et je tiens à ajouter à cet élément d'info-bulle avec le même contenu (titre='${myData}'), mais je veux qu'il s'affiche uniquement lorsque le contenu est longue et les points de suspension apparaissent sur l'écran.
Est-Il possible de le faire?
une direction - lorsque le navigateur (c'est à dire dans mon cas) dessiner des points de suspension - t-il jeter un événement à ce sujet?
- Gardez à l'esprit que
text-overflow:ellipsis;
ne fonctionne pas dans Firefox-voir cette question de plus: stackoverflow.com/questions/4927257/... - J'ai juste eu à faire quelque chose de similaire. Vérifier si
element.offsetWidth < element.scrollWidth
comme par cette réponse semble fonctionner pour autant. - les points de suspension de détection: stackoverflow.com/questions/7738117/...
- Note pour la postérité:
text-overflow:ellipsis;
travaille maintenant dans Firefox; il a été ajouté dans Firefox 7 (publié en septembre 2011).
Vous devez vous connecter pour publier un commentaire.
Voici une manière qu'il l'aide de l'ellipse de réglage, et ajoute la
title
attribut sur demande (avec jQuery) sur Martin Smith commentaire:"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/onIci est un pur CSS solution. Pas besoin de jQuery.
Il ne sera pas afficher une info-bulle, au lieu de cela, il va étendre le contenu de sa longueur sur passage de la souris.
Fonctionne très bien si vous avez du contenu qui sera remplacé. Ensuite, vous n'avez pas à exécuter une fonction jQuery chaque fois.
uosɐſ la réponse est fondamentalement correcte, mais vous ne voulez probablement pas à le faire dans le mouseenter événement. Qui va causer à 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 est en train de changer, il n'y a pas de raison de le faire.
Il serait préférable de simplement appeler ce code immédiatement après l'élément est ajouté au DOM:
Ou, si vous ne savez pas quand exactement il est ajouté, puis d'appeler ce code une fois que la page a fini de se charger.
si vous avez plus d'un seul élément que vous avez besoin de le faire avec, alors vous pouvez donner tous la même classe (comme "mightOverflow"), et utiliser ce code pour mettre à jour tous les:
$(".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 peut-être même le vérifier!$this.attr('title')
sera exécuté chaque fois que vous passez la souris sur l'élément.Voici mon plugin jQuery:
Utilisation:
Edit:
J'ai fait un résumé de ce plugin.
https://gist.github.com/UziTech/d45102cdffb1039d4415
Nous avons besoin pour détecter si l'ellipse est vraiment appliqué, puis pour afficher une info-bulle pour révéler le texte intégral. Il ne suffit pas seulement de comparer les "
this.offsetWidth < this.scrollWidth
" lorsque l'élément de près de la tenue de son contenu, mais seulement manque un ou deux pixels en largeur, en particulier pour le texte de la pleine largeur de Chinois/Japonais/coréen caractères.Voici un exemple: http://jsfiddle.net/28r5D/5/
J'ai trouvé un moyen d'améliorer les points de suspension de détection:
this.offsetWidth < this.scrollWidth
" tout d'abord, continuer à l'étape #2 en cas d'échec.Voici mon amélioration: http://jsfiddle.net/28r5D/6/
J'ai créé un plugin jQuery qui utilise Bootstrap de l'info-bulle au lieu du navigateur de l'accumulation dans l'info-bulle. Veuillez noter que cela n'a pas été testé avec les anciens navigateur.
JSFiddle: https://jsfiddle.net/0bhsoavy/4/
Voici deux autres pur CSS solutions:
CSS:
HTML:
CSS:
HTML:
C'est ce que j'ai fait. Plus d'info-bulle scripts vous obliger à exécuter une fonction qui stocke les info-bulles. C'est un jQuery exemple:
Si vous ne voulez pas vérifier les points de suspension css, vous pouvez simplifier comme:
J'ai le "quand" autour de lui, de sorte que la "setupTooltip de la fonction" ne pas exécuter jusqu'à ce que tous les titres ont été mis à jour. Remplacer le "setupTooltip", avec votre info-bulle de la fonction et de l' * avec les éléments que vous souhaitez vérifier. * va aller à travers eux tous si vous le laissez.
Tout simplement si vous souhaitez simplement mettre à jour les attributs de titre avec les navigateurs info-bulle, vous pouvez simplifier comme:
Ou sans vérifier les points de suspension:
Si vous souhaitez faire uniquement à l'aide de javascript, je voudrais faire le suivant. Donner la durée d'un attribut id (de sorte qu'il peut facilement être récupéré à partir de la DOM) et de les placer tout le contenu dans un attribut nommé "contenu":
Puis, dans votre javascript, vous pouvez effectuer les opérations suivantes après l'élément a été inséré dans le DOM.
Bien sûr, si vous êtes à l'aide de javascript à insérer la plage dans les 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 contenu de l'attribut sur la durée.
Il y a plus de solutions élégantes que cela, si vous souhaitez utiliser jQuery.
$("#myDataId").attr("title", function() { var innerText = $(this).text(); var content = $(this).attr("content"); if (innerText.length <= content.length) { return content; } return null; });
J'ai la classe CSS, qui détermine l'endroit où mettre des points de suspension. Sur cette base, je ne les suivants (élément peut être différent, j'écris, où l'ellipse est utilisé, il se peut bien sûr avoir un sélecteur de classe):
this
était unanchor
j'ai donc utiliséthis.text()
au lieu deval()
Aucune des solutions ci-dessus a fonctionné pour moi, mais j'ai trouvé une excellente solution. La plus grande erreur que les gens font est d'avoir tous les 3 propriétés CSS déclaré sur l'élément sur pageload. Vous devez ajouter ces styles+info-bulle dynamiquement SI et SEULEMENT SI la durée que vous voulez d'une ellipse est plus large que son parent.
Vous pourriez peut-être entourent la durée avec une autre plage, puis il suffit de tester si la largeur de l'original/interne de l'échelle est plus grande que celle de la création ou de l'extérieur d'envergure. Notez que je dis éventuellement -- c'est à peu près basée sur ma situation où j'ai eu un
span
à l'intérieur d'untd
donc je ne sais pas vraiment que si il va travailler avec unspan
à l'intérieur d'unspan
.Ici est bien mon code pour les autres qui pourraient se trouver dans une situation similaire à la mienne; je suis un copier/coller sans modification, même si elle est dans une Angulaires contexte, je ne pense pas que qui nuirait à la lisibilité et à la notion essentielle. J'ai codé comme une méthode de service, parce que j'avais besoin de l'appliquer à plus d'un endroit. Le sélecteur j'ai été en passant a été un sélecteur de classe qui va correspondre à plusieurs instances.
Voici la Vanille, JavaScript solution:
JS:
CSS:
HTML:
C'était ma solution, fonctionne comme un charme!