backbone.js 如何销毁引导弹出的所有示例?

zbwhf8kr  于 2022-11-10  发布在  其他
关注(0)|答案(7)|浏览(180)

我有一个使用Backbone的单页应用程序,每当我越过某个东西,然后点击“后退”按钮,Popover就会永远停留。
我希望在加载新示例时销毁弹出窗口的所有示例。

hfsqlsce

hfsqlsce1#

找到通过数据API创建的弹出窗口并不难,大卫Mulder和Amir Popovich的其他答案中已经介绍过了。您只需:

$("[data-toggle='popover']").popover('hide');

或者,如果需要或愿意,也可以使用destroy
挑战在于如何处理这些动态创建的弹出窗口。

使用弹出框标记元素

我会实现类似的东西。我会覆盖默认的popover方法,并且我会尽可能早地执行这个覆盖,这样所有需要弹出窗口的东西都会使用我的覆盖。它所做的只是用一个类来标记使用弹出窗口的元素。引导程序本身不会标记它们:

// Override popover so as to mark everything that uses a popover.
var old_popover = $.fn.popover;
function my_popover() {
  this.addClass('marked-as-having-a-popover');
  return old_popover.apply(this, arguments);
}
$.fn.popover = my_popover;

然后,为了在卸载之前清除所有内容,我将在检测卸载的代码中放入以下内容:

$(".marked-as-having-a-popover").popover('hide');

或者,如果测试表明destroy更适合您的用例,则可以使用destroy而不是hide
现在,如果覆盖发生得足够早,并且您没有加载多个jQueries的页面,那么上面的方法 * 将 * 起作用。(是的,这是可能的。)我在我的一个应用程序中使用了类似的方法来处理工具提示,所以我知道这个原理是合理的。在我的应用程序中,所有的工具提示都是由我的代码创建的,所以没有遗漏某些内容的风险。

寻找所有具有蹦现符号的元素,即使是未标记的元素

如果您处于可以创建弹出窗口而无需标记的情况下(我称之为“escapee”),然后您需要查询整个DOM,找出哪些元素有弹出框。(也就是说,没有任何data-属性)。此外,所有类型的元素都可以得到弹出框,因此您不能可靠地假设只有button元素会弹出。找到需要处理的所有内容的唯一可靠方法是查看DOM中的每个元素并检查它是否有弹出窗口:

// Obviously this is quite expensive but in a situation where there *can* be escapees
// then you have to check all elements to see if they have a popover.
$("*").each(function () {
    // Bootstrap sets a data field with key `bs.popover` on elements that have a popover.
    // Note that there is no corresponding**HTML attribute**on the elements so we cannot
    // perform a search by attribute.
    var popover = $.data(this, "bs.popover");
    if (popover)
        $(this).popover('hide');
});

同样,可以使用destroy而不是hide

概念验证

下面是一个fiddle,它说明了整个过程:

  • “添加动态弹出窗口”模拟在覆盖生效时添加弹出窗口的代码。
  • “Add an Escapee”模拟将添加弹出窗口并设法使用原始引导程序代码的代码。
  • “清除已标记”仅清除已标记的弹出框。
  • “全部清除”会清除每个已标记或未标记的弹出窗口。
dxxyhpgq

dxxyhpgq2#

请尝试以下操作:
在这个例子中,您可以使用一个弹出框来打开一个文件。
引用URL:https://getbootstrap.com/docs/4.1/components/popovers/

hmae6n7t

hmae6n7t3#

它非常简单,你只需要调用一个函数popover(),参数为“destroy”,它将销毁所有由$(“[data-toggle=popover]”).popover()创建的弹出窗口;
您可以查看文档以了解popover()的更多选项和参数。
我建议你用特定的类名来销毁弹出窗口,而不是使用下面的代码。

$("[data-toggle='popover']").popover('destroy');

上面的代码将破坏页面中的所有弹出窗口。因此,请使用类选择器。

$(".YourClassName").popover('destroy');
zfycwa2u

zfycwa2u4#

如果您有问题并且需要删除所有确定:

$('.popover').remove();

会有帮助(弹出窗口自动添加这个类,即使是动态创建的对象)。它会破坏所有的弹出窗口DOM对象,包括回调等。但这是一个粗略的方法。通常我不喜欢所有的弹出窗口类(干净的方式),并确保我做了一个艰苦的清理后。对我来说工作很好!

$('.popover').popover('dispose');
$('.popover').remove();

如果您想删除除一个以外的所有内容,请使用filter()和:not-Selector

$('.popover').filter(':not(#yourID)').popover('dispose');
$('.popover').filter(':not(#yourID)').remove();

弹出窗口还添加一个带有随机数的id


# popoverxxxxx where xxxxx is a five digit number.

这有时有助于比较弹出物。当然,这也可以用来识别弹出物。

4smxwvx5

4smxwvx55#

类似于下面这样的通用代码(假设您使用的是数据绑定)应该可以做到这一点:

$('[data-toggle="popover"]').popover('hide')

或者更极端的说法

$('[data-toggle="popover"]').popover('destroy')

尽管我怀疑这通常是有意义的。仍然要解决你遇到的特定bug,你应该创建一个最小的测试用例,这样bug本身就可以被解决。
哦,如果你特别想检查打开的弹出窗口,你可以使用.data("bs.popover").$tip.parent().length(这是一个有点黑客),例如:

$('[data-toggle="popover"]:eq(0)').data("bs.popover").$tip.parent().length == 1
2ekbmq32

2ekbmq326#

您可以使用以下命令hide所有弹出窗口:

$("[data-toggle='popover']").popover('hide');

您可以使用以下命令destroy所有弹出窗口:

$("[data-toggle='popover']").popover('destroy');

hidedestory之间的区别在于,当你hide一个弹出时,你不需要***********React它,但当你销毁它时,你****************************************************************************************************************************
请查看我的JSFIDDLE,然后:

  • 单击所有弹出窗口,然后单击hide。单击hide后,您可以再次单击弹出窗口。
  • 单击所有弹出框,然后单击destroy。单击destroy后,尝试再次单击弹出框,发现不会发生任何事情,因为它们已被破坏

为了使它们重新发挥作用,您需要单击React,然后尝试。

kupeojn6

kupeojn67#

弹出窗口必须手动初始化,这样你就能准确地知道你必须销毁什么,因为你已经初始化了它。你应该用同一个选择器调用销毁函数。或者我遗漏了什么?

相关问题