【问题标题】:Bootstrap 3 popover callback on hidden event not working隐藏事件上的 Bootstrap 3 popover 回调不起作用
【发布时间】:2020-02-08 11:25:27
【问题描述】:

this example 之后,我尝试实现一个隐藏的回调函数,但是虽然show 回调工作得很好,但没有办法让hidden 回调工作。有人可以解释为什么会这样吗?

我创建了this fiddle 来复制问题。

$(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.hidden;
  $.fn.popover.Constructor.prototype.hidden = 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>

更新

我创建了一个新的 jsFiddle 来展示 Christos 的第二个 sn-p 应用于 Bootstrap 的 jQBTK 插件。这个插件利用 Bootstrap 的 Popovers 来创建一个虚拟键盘。 问题:事件绑定到动态创建的对象,因此它们会触发多次。如何优化?

【问题讨论】:

  • 如果我更新的答案有效,你试过了吗?
  • @ChristosLytras 部分...我昨天晚上开始测试,在我的页面中点击触发器似乎不起作用,与配置的其他点击事件一定有冲突...所以我刚刚管理使其与手动触发器一起使用。

标签: javascript twitter-bootstrap-3 callback bootstrap-popover


【解决方案1】:

hiddenCb,原型函数被命名为hide,而不是你在代码中的hidden,所以$.fn.popover.Constructor.prototype.hidden必须是$.fn.popover.Constructor.prototype.hide

这些原型函数是popovermethods,而不是events。有方法.popover('hide'),但没有方法hidden。您的代码正在运行,因为 popover 调用方法 showhide 而不是触发事件。

code you found 实际上是一个hack,它挂钩/更改默认showhide 方法以触发您的函数以及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.popovershown.bs.popoverhide.bs.popoverhidden.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

【讨论】:

  • 感谢您的帮助。我仍然有麻烦。我已经用另一个 jsFiddle 更新了这个问题,显示了你的第二个 sn-p 应用于 jQBTK Bootstrap 的插件。你能看一下吗?
  • @Mark 你在你的问题中没有提到任何关于jQBTK,你的问题是"Bootstrap 3 popover callback on hidden event not working" 我想我回答了为什么您的代码不起作用。所以要回答你的第二个问题,为什么 jQBTK 不起作用,这是因为它没有将任何事件绑定到 popover,你必须更改它的代码或使用你找到的第一种方法使用$.fn.popover.Constructor.prototype.show$.fn.popover.Constructor.prototype.hide。现在使用 hide 而不是 hidden 对您来说不是这样吗?
  • 我没有提到它,因为我试图简化情况。在第一个小提琴中,我使用的是普通的 popover 插件并且已经在那里试验了问题,所以我问了关于 popover 的问题,而不是关于 jQBTK 的问题。顺便说一句,您建议使用的第一个代码与我在问题更新中报告的问题相同:回调被堆叠并多次调用(我打开的弹出框越多,调用的回调越多......dismitting popover 不会关闭回调)。
  • 当你遇到问题时,你必须用简化的代码描述整个问题,而不是打破/提及它的一部分你认为罪魁祸首。您更新后的请求“如何优化?”不清楚您在问什么您的问题是什么什么你想达到的目标
  • 在我看来,一切都在那里,我不知道如何解释:我正在寻找一种方法来捕捉弹出窗口上的隐藏回调,我的问题是(使用你的建议)回调一次被堆叠和调用几次,我想实现我的要求。我不是英语本地人,但如果有不清楚的具体点,请告诉我它是什么,我会尝试更好地解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2014-12-28
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
相关资源
最近更新 更多