В hiddenCb
функция-прототип называется hide
, а не hidden
, как в вашем коде, поэтому $.fn.popover.Constructor.prototype.hidden
должно быть $.fn.popover.Constructor.prototype.hide
.
Эти функции-прототипы методов из popover
, а не событий . Есть метод .popover('hide')
, но нет метода hidden
. Ваш код работает, потому что popover
вызывает методы show
и hide
, а не вызывает события.
Код , который вы нашли , на самом деле является хаком перехватывает / изменяет методы по умолчанию show
и hide
для запуска ваших функций вместе с кодом по умолчанию popover
, что не так идеально, если вы хотите обрабатывать эти события.
Чтобы это работало в вашем коде измените метод hidden
на hide
:
$(document).ready(function() {
var showCb = $.fn.popover.Constructor.prototype.show;
$.fn.popover.Constructor.prototype.show = function () {
showCb.call(this);
if (this.options.showCb) {
this.options.showCb();
}
}
var hiddenCb = $.fn.popover.Constructor.prototype.hide;
$.fn.popover.Constructor.prototype.hide = function () {
hiddenCb.call(this);
if (this.options.hiddenCb) {
this.options.hiddenCb();
}
}
$("[data-toggle=popover]").popover({
showCb: function() {
alert('showCb');
},
hiddenCb: function() {
alert('hiddenCb');
}
});
})
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<div class="container">
<h3>Popover Example</h3>
<a href="#" data-toggle="popover" title="Popover Header" data-content="Some content inside the popover">Toggle popover</a>
</div>
Однако, если вы хотите правильно обрабатывать события show.bs.popover
, shown.bs.popover
, hide.bs.popover
и hidden.bs.popover
, вам следует сделать это с помощью on
и намного более простой код, подобный этому:
$(document).ready(function() {
$("[data-toggle=popover]")
.popover()
.on('shown.bs.popover', function() {
alert('showCb!');
})
.on('hidden.bs.popover', function () {
alert('hiddenCb!');
});
});
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<div class="container">
<h3>Popover Example</h3>
<a href="#" data-toggle="popover" title="Popover Header" data-content="Some content inside the popover">Toggle popover</a>
</div>
ОБНОВЛЕНИЕ
Для jQBTK вы просто используете click
trigger
, а затем использовать события. Это вызовет каждое показанное / скрытое событие только один раз:
$('input').keyboard({
trigger: 'click',
})
.on('shown.bs.popover', function() {
console.log('shownCb!');
})
.on('hidden.bs.popover', function () {
console.log('hiddenCb!');
});
Проверьте это рабочее jsFiffle .