Я создаю несколько типов jQuery UI Tooltips. Один тип:
- Открыть при нажатии на элемент (например, значок?)
- Должно позволять пользователю нажимать внутри подсказки, чтобы текст можно было выбирать / копировать или взаимодействовать с ним.
- Должен закрываться, когда пользователь щелкает в любом месте, кроме как внутри подсказки.
Я почти там, за исключением закрытия чаевых. В моем проекте есть специальное событие clickoutisde
, которое можно привязать к любому элементу (см. Fiddle).
В приведенном ниже коде он привязан к элементу, вызывающему всплывающую подсказку - в данном случае к значку. Так что подсказка закроется, если вы нажмете где-нибудь, кроме значка.
У меня вопрос: можно ли как-то переместить это событие из значка в саму подсказку (класс .ui-icon
), чтобы подсказка закрывалась, если щелкнуть где-нибудь, кроме внутренней части подсказки?
Или мне нужен другой способ? Спасибо!
//
// EXAMPLE: Click to Open + Click Outside to Close
// Works on any element with the `.has-tip-pop` class + `title` attribute
// @requires ui-clickoutside.js
//
$( function() {
$('.has-tip-pop')
// Stop tip's default close.
.bind("mouseleave", function (event) {
event.stopImmediatePropagation();
})
// Initialize tip.
.tooltip({
// Start as `disabled` so we can `enable` with `click`.
disabled: true,
// A `ui-bg-` style provided by this theme.
tooltipClass: "ui-bg-black-black",
// Tip above h-centered
position: { my: "center bottom", at: "center top-10", },
})
// Open the tooltip.
.on('click', function () {
$(this).tooltip('enable').tooltip('open');
})
// Click outside ORIGINAL element to close.
// How to bind this to `.ui-tooltip`?
.bind( "clickoutside", function(){
$(this).tooltip('disable');
})
// Handle bug #10689 Memory Leak
.each(function(idx, element) {
var ele = $(element);
ele.tooltip({
"close": function(evt, ui) {
ele.data("ui-tooltip").liveRegion.children(":not(:last)").remove();
}
});
});
} ); // function
jsFiddle
ПОЯСНЕНИЯ
Я новичок в JS - я все еще изучаю абстракции и семантику. Пожалуйста, будьте максимально откровенны с отзывами:)
Этот тип всплывающей подсказки предназначен для своевременной помощи - пользователь нажимает кнопку? значок или аналогичный элемент и видит либо:
- Текст, который они могут выбрать / скопировать - в настоящее время в атрибуте
title
элемента.
- Текст + дополнительная информация, по которой они могут щелкнуть - в настоящее время в содержании tooltip.js
Утечка памяти - это известная проблема - она возникает во всплывающей подсказке по умолчанию, и мой пример содержит лучшее рабочее предложение для ее устранения.
Событие clickoutside
принадлежит Бену Алману - оно задокументировано здесь и заметно в моей скрипке.
СПЕЦИАЛЬНЫЕ ВОПРОСЫ
Является ли концептуально неправильным использование виджета «Подсказка» для поведения, которое я описал выше?
Когда я начал это путешествие, я так не думал - есть много людей и плагинов, делающих подобные вещи, я просто не мог найти пример, который я мог бы расшифровать, или который получил меня полностью там. Но если это не лучший подход, что бы вы предложили вместо этого?
Я использую событие clickoutside
для закрытия диалогов и тому подобного - я этого не понимаю, но оно простое в использовании и работает. Но является ли это лучшим способом приблизиться к закрывающимся подсказкам, когда пользователь щелкает где-нибудь, кроме самой подсказки?
Если clickoutside
подходит, и я правильно понимаю, тогда его необходимо привязать к оболочке .ui-tooltip
- логика такова: «Если вы щелкнете где-нибудь за пределами всплывающей подсказки, она закроется».
Это должно выглядеть примерно так: $('.ui-tooltip').bind(...)
, но для текущей всплывающей подсказки, а не для всех всплывающих подсказок, потому что у нас есть другой тип, который использует поведение мыши по умолчанию.
Я могу видеть в коде, который обрабатывает утечку памяти, которую вы можете получить в .ui-tooltip
div текущей подсказки, но не знаете, как применить это здесь?