Підказка інтерфейсу користувача Jquery не підтримує HTML-вміст


86

Сьогодні я оновив усі свої плагіни jQuery за допомогою jQuery 1.9.1. І я почав використовувати підказку jQueryUI з jquery.ui.1.10.2. Все було добре. Але коли я використав теги HTML у вмісті (в titleатрибуті елемента, до якого я застосовував підказку), я помітив, що HTML не підтримується.

Це скріншот моєї підказки:

введіть тут опис зображення

Як змусити HTML-вміст працювати за допомогою підказки jQueryUI в 1.10.2?


1
Це щось, що просто зламалося з моменту вашого оновлення? Здається, мені це добре працює в jQuery 1.9.1, jQuery UI 1.9.2 jsfiddle.net/2n3DL/1
метадепт

Це гарна ідея. Чи можу я задати ще одне запитання, якщо ви дозволите мені? Гаразд, у мене є піктограма підказки, і у неї є клас із назвою "підказка", наприклад: <img src = "images / info.png" class = "tooltip" title = "Якийсь <b> чудовий </b> HTML текст підказки! "> Як я можу використовувати таке? З найкращими побажаннями.

дивіться оновлену скрипту метадептів з jquery ui 1.10.2 тут та jquery 1.9.1. Це все ще працює.
SachinGutte

@phobos: Ні, це не так. У <b></b>підказці є теги.
Ендрю Вітакер

1
Наведіть курсор на "Деякі введення" (Підказка, яка безпосередньо повертає вміст HTML, чудово працює). Я знаю, що запитання до ОП є неясним, але я припускаю, що він або вона використовує HTML в titleатрибуті, що не підтримується станом на 1.10.
Ендрю Вітакер

Відповіді:


186

Редагувати : Оскільки це виявилося популярною відповіддю, я додаю застереження, яке @crush згадано в коментарі нижче. Якщо ви використовуєте цю роботу, пам’ятайте, що ви відкриваєте себе для вразливості XSS . Використовуйте це рішення лише в тому випадку, якщо ви знаєте, що робите, і можете бути впевнені в цьому у вмісті HTML в атрибуті.


Найпростіший спосіб зробити це - надати функцію contentпараметру, який замінює поведінку за замовчуванням:

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

Приклад: http://jsfiddle.net/Aa5nK/12/

Іншим варіантом було б замінити віджет підказки своїм, який змінює contentпараметр:

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

Тепер кожного разу, коли ви телефонуєте .tooltip, вміст HTML буде повертатися.

Приклад: http://jsfiddle.net/Aa5nK/14/


4
Єдина проблема з цим полягає в тому, що він обходить саму причину того, що jQuery почав уникати HTML в атрибуті title для початку.
розчавити

4
@eidylon Putting HTML within the title attribute is not valid HTML and we are now escaping it to prevent XSS vulnerabilities. У відповіді Ендрю заголовок все одно повинен містити HTML, який є недійсним.
розчавити

Ви можете отримати текстову частину вмісту в атрибуті title, а потім побудувати оточуючі біти HTML у зворотному виклику вмісту, щоб обійти це (до тих пір, поки ви знали, що це буде за час
ініціації

18

Замість цього:

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

використовуйте це для кращої роботи

$(selector).tooltip({
    content: function () {
        return this.getAttribute("title");
    },
});

так, краща продуктивність, бо у мене є лише кілька елементів із підказками
datdinhquoc

Працює ідеально
Гельфа

14

Я вирішив це за допомогою спеціального тегу даних, оскільки в будь-якому випадку потрібен атрибут title.

$("[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");
    }
});

Подібно до цього він відповідає html, і підказки відображаються лише для потрібних тегів.


5

Ви також можете досягти цього повністю без jQueryUI, використовуючи стилі CSS. Дивіться фрагмент нижче:

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>

Перший інтервал - для відображуваного тексту, другий інтервал - для прихованого тексту, який відображається при наведенні на нього курсора.


4

Щоб розширити відповідь @Andrew Whitaker вище, ви можете перетворити підказку на html-сутності в тегу заголовка, щоб уникнути розміщення необробленого html безпосередньо у своїх атрибутах:

$('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>

Найчастіше підказка в будь-якому випадку зберігається у змінній php, тому вам знадобиться лише:

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

2

Щоб уникнути розміщення тегів HTML в атрибуті title, іншим рішенням є використання розмітки. Наприклад, ви можете використовувати [br] для представлення розриву рядка, а потім виконати просту заміну у функції вмісту.

В атрибуті заголовка:

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

У вашій функції вмісту :

content: function () {
    return $(this).attr('title').replace(/\[br\]/g,"<br />");
}

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);
                 }
             }
         });
     });

дякую за повідомлення та рішення вище.

Я трохи оновив код. Сподіваюся, це може вам допомогти.

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


1

Поки ми використовуємо jQuery (> v1.8), ми можемо проаналізувати вхідний рядок з $ .parseHTML ().

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

Ми проаналізуємо атрибут вхідного рядка на неприємні речі, а потім перетворимо його назад у jQuery-читабельний HTML. Принада цього полягає в тому, що до того моменту, коли він потрапляє в парсер, рядки вже об’єднуються, тому не має значення, чи намагається хтось розділити тег сценарію на окремі рядки. Якщо ви застрягли в підказках jQuery, це, здається, є надійним рішенням.


1

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

Поміщення HTML в атрибут title не є допустимим HTML, і зараз ми уникаємо його, щоб запобігти вразливості XSS (див. № 8861 ).

Якщо вам потрібен HTML у підказках, скористайтеся параметром вмісту - http://api.jqueryui.com/tooltip/#option-content .

Спробуйте використати javascript для встановлення підказок html, див. Нижче

$( ".selector" ).tooltip({
   content: "Here is your HTML"
});

1

Ви можете змінити вихідний код 'jquery-ui.js', знайти цю функцію за замовчуванням для отримання вмісту атрибута заголовка цільового елемента.

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();
    },

змінити його на

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();
    },

таким чином, коли ви хочете відображати підказки html, просто додайте атрибут ignoreHtml = 'false' до вашого цільового елемента html; подобається це <td title="<b>display content</b><br/>other" ignoreHtml='false'>display content</td>


1

іншим рішенням буде захоплення тексту всередині titleтегу, а потім використання .html()методу jQuery для побудови вмісту підказки.

$(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);
      }
    }
  });
});

Приклад: http://jsfiddle.net/hamzeen/0qwxfgjo/


1

Жодне з наведених вище рішень не працювало для мене. Це працює для мене:

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

0

Розмітка HTML

Керування підказкою з класом ".why", а область вмісту підказки з класом ".customTolltip"

$(function () {
                $('.why').attr('title', function () {
                    return $(this).next('.customTolltip').remove().html();
                });
                $(document).tooltip();
            });

0

Заміна \nабо екранованого екрана <br/>робить трюк, зберігаючи решту HTML-коду екранованим:

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

-1

додати html = true до параметрів підказки

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

Оновіть,
це не стосується властивості підказки jQuery ui - це правда в підказці інтерфейсу bootstrap ui - погано!


1
Вибачте, це у мене не спрацювало. Також в офіційній документації немає згадки про параметр "html".
Wireblue

1
Це для підказки bootstrap 2.3, а не підказки jquery-ui
Maciej Pyszyński

немає підказки "html" для підказки
AmirHossein
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.