L'infobulle de l'interface utilisateur de Jquery ne prend pas en charge le contenu HTML

86

Aujourd'hui, j'ai mis à jour tous mes plug-ins jQuery avec jQuery 1.9.1. Et j'ai commencé à utiliser l'info-bulle jQueryUI avec jquery.ui.1.10.2. Tout était bon. Mais lorsque j'ai utilisé des balises HTML dans le contenu (dans l' titleattribut de l'élément auquel j'appliquais l'info-bulle), j'ai remarqué que HTML n'est pas pris en charge.

Voici une capture d'écran de mon info-bulle:

entrez la description de l'image ici

Comment puis-je faire fonctionner le contenu HTML avec l'info-bulle jQueryUI dans 1.10.2?

Andrew Whitaker
la source
1
Est-ce quelque chose qui vient de casser depuis la mise à niveau? Cela semble bien fonctionner pour moi dans jQuery 1.9.1, jQuery UI 1.9.2 jsfiddle.net/2n3DL/1
metadept
C'est une bonne idée. Puis-je poser une autre question si vous me le permettez. Ok, j'ai une icône d'info-bulle et une classe nommée "tooltip" comme ceci: <img src = "images / info.png" class = "tooltip" title = "Certains <b> super </b> HTML tooltip text! "> Comment puis-je utiliser comme ça? Meilleures salutations.
voir metadepts violon mis à jour avec jquery ui 1.10.2 ici et jquery 1.9.1. Ça fonctionne encore.
SachinGutte
@phobos: Non, ce n'est pas le cas. Il y a des <b></b>balises directement dans l'info-bulle.
Andrew Whitaker
1
Survolez "Quelques entrées" (l'info-bulle renvoyant directement le contenu HTML fonctionne correctement). Je sais que la question du PO n'est pas claire, mais je suppose qu'il utilise du HTML dans l' titleattribut, qui n'est pas pris en charge à partir de la version 1.10.
Andrew Whitaker

Réponses:

186

Edit : Comme cela s'est avéré être une réponse populaire, j'ajoute la clause de non- responsabilité mentionnée par @crush dans un commentaire ci-dessous. Si vous utilisez cette solution, sachez que vous vous ouvrez à une vulnérabilité XSS . N'utilisez cette solution que si vous savez ce que vous faites et pouvez être certain du contenu HTML de l'attribut.


Le moyen le plus simple de le faire est de fournir une fonction à l' contentoption qui remplace le comportement par défaut:

$(function () {
      $(document).tooltip({
          content: function () {
              return $(this).prop('title');
          }
      });
  });

Exemple: http://jsfiddle.net/Aa5nK/12/

Une autre option serait de remplacer le widget d'info-bulle par le vôtre qui modifie l' contentoption:

$.widget("ui.tooltip", $.ui.tooltip, {
    options: {
        content: function () {
            return $(this).prop('title');
        }
    }
});

Désormais, chaque fois que vous appelez .tooltip, le contenu HTML sera renvoyé.

Exemple: http://jsfiddle.net/Aa5nK/14/

Andrew Whitaker
la source
4
Le seul problème avec ceci est que cela contourne la raison même pour laquelle jQuery a commencé à échapper du HTML dans l'attribut title pour commencer.
écraser le
4
@eidylon Putting HTML within the title attribute is not valid HTML and we are now escaping it to prevent XSS vulnerabilities. Dans la réponse d'Andrew, le titre doit toujours contenir du HTML, qui n'est pas valide.
écraser
Vous pourriez avoir la partie texte du contenu dans l'attribut title, puis créer les bits de HTML environnants dans votre rappel de contenu pour contourner ce
problème
18

Au lieu de cela:

$(document).tooltip({
    content: function () {
        return $(this).prop('title');
    }
});

utilisez ceci pour de meilleures performances

$(selector).tooltip({
    content: function () {
        return this.getAttribute("title");
    },
});
Profesor08
la source
ouais, meilleures performances, parce que je n'ai que quelques éléments avec des info
datdinhquoc
Fonctionne parfaitement
Helpha
14

Je l'ai résolu avec une balise de données personnalisée, car un attribut de titre est de toute façon requis.

$("[data-tooltip]").each(function(i, e) {
    var tag = $(e);
    if (tag.is("[title]") === false) {
        tag.attr("title", "");
    }
});

$(document).tooltip({
    items: "[data-tooltip]",
    content: function () {
        return $(this).attr("data-tooltip");
    }
});

Comme ça, il est conforme au HTML et les info-bulles ne sont affichées que pour les balises voulues.

Chris
la source
5

Vous pouvez également y parvenir complètement sans jQueryUI en utilisant des styles CSS. Voir l'extrait ci-dessous:

div#Tooltip_Text_container {
  max-width: 25em;
  height: auto;
  display: inline;
  position: relative;
}

div#Tooltip_Text_container a {
  text-decoration: none;
  color: black;
  cursor: default;
  font-weight: normal;
}

div#Tooltip_Text_container a span.tooltips {
  visibility: hidden;
  opacity: 0;
  transition: visibility 0s linear 0.2s, opacity 0.2s linear;
  position: absolute;
  left: 10px;
  top: 18px;
  width: 30em;
  border: 1px solid #404040;
  padding: 0.2em 0.5em;
  cursor: default;
  line-height: 140%;
  font-size: 12px;
  font-family: 'Segoe UI';
  -moz-border-radius: 3px;
  -webkit-border-radius: 3px;
  border-radius: 3px;
  -moz-box-shadow: 7px 7px 5px -5px #666;
  -webkit-box-shadow: 7px 7px 5px -5px #666;
  box-shadow: 7px 7px 5px -5px #666;
  background: #E4E5F0  repeat-x;
}

div#Tooltip_Text_container:hover a span.tooltips {
  visibility: visible;
  opacity: 1;
  transition-delay: 0.2s;
}

div#Tooltip_Text_container img {
  left: -10px;
}

div#Tooltip_Text_container:hover a span.tooltips {
  visibility: visible;
  opacity: 1;
  transition-delay: 0.2s;
}
<div id="Tooltip_Text_container">
  <span><b>Tooltip headline</b></span>
  <a href="#">
    <span class="tooltips">
        <b>This is&nbsp;</b> a tooltip<br/>
        <b>This is&nbsp;</b> another tooltip<br/>
    </span>
  </a>
  <br/>Move the mousepointer to the tooltip headline above. 
</div>

Le premier intervalle est pour le texte affiché, le second intervalle pour le texte masqué, qui est affiché lorsque vous passez la souris dessus.

Mat
la source
4

Pour développer la réponse de @Andrew Whitaker ci-dessus, vous pouvez convertir votre info-bulle en entités html dans la balise de titre afin d'éviter de mettre du html brut directement dans vos attributs:

$('div').tooltip({
    content: function () {
        return $(this).prop('title');
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="http://code.jquery.com/ui/1.9.2/jquery-ui.js"></script>
<div class="tooltip" title="&lt;div&gt;check out these kool &lt;i&gt;italics&lt;/i&gt; and this &lt;span style=&quot;color:red&quot;&gt;red text&lt;/span&gt;&lt;/div&gt;">Hover Here</div>

Plus souvent qu'autrement, l'info-bulle est stockée dans une variable php de toute façon, vous n'avez donc besoin que de:

<div title="<?php echo htmlentities($tooltip); ?>">Hover Here</div>
Billynoah
la source
2

Pour éviter de placer des balises HTML dans l'attribut title, une autre solution consiste à utiliser le démarquage. Par exemple, vous pouvez utiliser [br] pour représenter un saut de ligne, puis effectuer un simple remplacement dans la fonction de contenu.

Dans l'attribut title:

"Sample Line 1[br][br]Sample Line 2"

Dans votre fonction de contenu :

content: function () {
    return $(this).attr('title').replace(/\[br\]/g,"<br />");
}
Flareman2020
la source
1
$(function () {
         $.widget("ui.tooltip", $.ui.tooltip, {
             options: {
                 content: function () {
                     return $(this).prop('title');
                 }
             }
         });

         $('[rel=tooltip]').tooltip({
             position: {
                 my: "center bottom-20",
                 at: "center top",
                 using: function (position, feedback) {
                     $(this).css(position);
                     $("<div>")
                         .addClass("arrow")
                         .addClass(feedback.vertical)
                         .addClass(feedback.horizontal)
                         .appendTo(this);
                 }
             }
         });
     });

merci pour le message et la solution ci-dessus.

J'ai mis à jour un peu le code. J'espère que cela pourrait vous aider.

http://jsfiddle.net/pragneshkaria/Qv6L2/49/

Pragnesh Karia
la source
1

Tant que nous utilisons jQuery (> v1.8), nous pouvons analyser la chaîne entrante avec $ .parseHTML ().

$('.tooltip').tooltip({
    content: function () {
        var tooltipContent = $('<div />').html( $.parseHTML( $(this).attr('title') ) );
        return tooltipContent;
    },
}); 

Nous analyserons l'attribut de la chaîne entrante pour les choses désagréables, puis le reconvertirons en HTML lisible par jQuery. La beauté de ceci est qu'au moment où il frappe l'analyseur, les chaînes sont déjà concaténées, donc peu importe si quelqu'un essaie de diviser la balise de script en chaînes distinctes. Si vous êtes bloqué en utilisant les info-bulles de jQuery, cela semble être une solution solide.

ghettosoak
la source
1

Sur http://bugs.jqueryui.com/ticket/9019

Mettre du HTML dans l'attribut title n'est pas du HTML valide et nous l'échappons maintenant pour éviter les vulnérabilités XSS (voir # 8861 ).

Si vous avez besoin de HTML dans vos info-bulles, utilisez l'option de contenu - http://api.jqueryui.com/tooltip/#option-content .

Essayez d'utiliser javascript pour définir des infobulles html, voir ci-dessous

$( ".selector" ).tooltip({
   content: "Here is your HTML"
});
Hắc Huyền Minh
la source
1

Vous pouvez modifier le code source 'jquery-ui.js', trouver cette fonction par défaut pour récupérer le contenu de l'attribut title de l'élément cible.

var tooltip = $.widget( "ui.tooltip", {
version: "1.11.4",
options: {
    content: function() {
        // support: IE<9, Opera in jQuery <1.7
        // .text() can't accept undefined, so coerce to a string
        var title = $( this ).attr( "title" ) || "";
        // Escape title, since we're going from an attribute to raw HTML
        return $( "<a>" ).text( title ).html();
    },

changez-le en

var tooltip = $.widget( "ui.tooltip", {
version: "1.11.4",
options: {
    content: function() {
        // support: IE<9, Opera in jQuery <1.7
        // .text() can't accept undefined, so coerce to a string
        if($(this).attr('ignoreHtml')==='false'){
            return $(this).prop("title");
        }
        var title = $( this ).attr( "title" ) || "";
        // Escape title, since we're going from an attribute to raw HTML
        return $( "<a>" ).text( title ).html();
    },

ainsi chaque fois que vous voulez afficher des astuces html, ajoutez simplement un attribut ignoreHtml = 'false' sur votre élément html cible; comme ça <td title="<b>display content</b><br/>other" ignoreHtml='false'>display content</td>

Joker
la source
1

une autre solution sera de saisir le texte à l'intérieur de la titlebalise, puis d'utiliser la .html()méthode de jQuery pour construire le contenu de l'info-bulle.

$(function() {
  $(document).tooltip({
    position: {
      using: function(position, feedback) {
        $(this).css(position);
        var txt = $(this).text();
        $(this).html(txt);
        $("<div>")
          .addClass("arrow")
          .addClass(feedback.vertical)
          .addClass(feedback.horizontal)
          .appendTo(this);
      }
    }
  });
});

Exemple: http://jsfiddle.net/hamzeen/0qwxfgjo/

Hamzeen Hameem
la source
1

Aucune des solutions ci-dessus n'a fonctionné pour moi. Celui-ci fonctionne pour moi:

$(document).ready(function()
{
    $('body').tooltip({
        selector: '[data-toggle="tooltip"]',
        html: true
     });
});
Avión
la source
0

Balisage HTML

Contrôle de l'info-bulle avec la classe ".why" et Zone de contenu de l'info-bulle avec la classe ".customTolltip"

$(function () {
                $('.why').attr('title', function () {
                    return $(this).next('.customTolltip').remove().html();
                });
                $(document).tooltip();
            });
Super modèle
la source
0

Remplacer le \nou l'échappé <br/>fait l'affaire tout en gardant le reste du HTML échappé:

$(document).tooltip({
    content: function() {
        var title = $(this).attr("title") || "";
        return $("<a>").text(title).html().replace(/&lt;br *\/?&gt;/, "<br/>");
    },
});
totalement nothesenat
la source
-1

ajouter html = true aux options de l'info-bulle

$({selector}).tooltip({html: true});

La mise à jour
n'est pas pertinente pour la propriété de l'infobulle de l'interface utilisateur jQuery - c'est vrai dans l'infobulle de l'interface utilisateur de démarrage - c'est dommage!

user2258511
la source
1
Désolé, cela n'a pas fonctionné pour moi. Il n'y a pas non plus de mention d'une option "html" dans la documentation officielle.
Wireblue
1
Ceci est pour l'info-bulle bootstrap 2.3 et non l'info-bulle jquery-ui
Maciej Pyszyński
il n'y a pas de prop "html" pour l'info
AmirHossein