// 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;
// 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');
});
7条答案
按热度按时间hfsqlsce1#
找到通过数据API创建的弹出窗口并不难,大卫Mulder和Amir Popovich的其他答案中已经介绍过了。您只需:
或者,如果需要或愿意,也可以使用
destroy
。挑战在于如何处理这些动态创建的弹出窗口。
使用弹出框标记元素
我会实现类似的东西。我会覆盖默认的
popover
方法,并且我会尽可能早地执行这个覆盖,这样所有需要弹出窗口的东西都会使用我的覆盖。它所做的只是用一个类来标记使用弹出窗口的元素。引导程序本身不会标记它们:然后,为了在卸载之前清除所有内容,我将在检测卸载的代码中放入以下内容:
或者,如果测试表明
destroy
更适合您的用例,则可以使用destroy
而不是hide
。现在,如果覆盖发生得足够早,并且您没有加载多个jQueries的页面,那么上面的方法 * 将 * 起作用。(是的,这是可能的。)我在我的一个应用程序中使用了类似的方法来处理工具提示,所以我知道这个原理是合理的。在我的应用程序中,所有的工具提示都是由我的代码创建的,所以没有遗漏某些内容的风险。
寻找所有具有蹦现符号的元素,即使是未标记的元素
如果您处于可以创建弹出窗口而无需标记的情况下(我称之为“escapee”),然后您需要查询整个DOM,找出哪些元素有弹出框。(也就是说,没有任何
data-
属性)。此外,所有类型的元素都可以得到弹出框,因此您不能可靠地假设只有button
元素会弹出。找到需要处理的所有内容的唯一可靠方法是查看DOM中的每个元素并检查它是否有弹出窗口:同样,可以使用
destroy
而不是hide
。概念验证
下面是一个fiddle,它说明了整个过程:
dxxyhpgq2#
请尝试以下操作:
在这个例子中,您可以使用一个弹出框来打开一个文件。
引用URL:https://getbootstrap.com/docs/4.1/components/popovers/
hmae6n7t3#
它非常简单,你只需要调用一个函数popover(),参数为“destroy”,它将销毁所有由$(“[data-toggle=popover]”).popover()创建的弹出窗口;
您可以查看文档以了解popover()的更多选项和参数。
我建议你用特定的类名来销毁弹出窗口,而不是使用下面的代码。
上面的代码将破坏页面中的所有弹出窗口。因此,请使用类选择器。
zfycwa2u4#
如果您有问题并且需要删除所有确定:
会有帮助(弹出窗口自动添加这个类,即使是动态创建的对象)。它会破坏所有的弹出窗口DOM对象,包括回调等。但这是一个粗略的方法。通常我不喜欢所有的弹出窗口类(干净的方式),并确保我做了一个艰苦的清理后。对我来说工作很好!
如果您想删除除一个以外的所有内容,请使用filter()和:not-Selector
弹出窗口还添加一个带有随机数的id
这有时有助于比较弹出物。当然,这也可以用来识别弹出物。
4smxwvx55#
类似于下面这样的通用代码(假设您使用的是数据绑定)应该可以做到这一点:
或者更极端的说法
尽管我怀疑这通常是有意义的。仍然要解决你遇到的特定bug,你应该创建一个最小的测试用例,这样bug本身就可以被解决。
哦,如果你特别想检查打开的弹出窗口,你可以使用
.data("bs.popover").$tip.parent().length
(这是一个有点黑客),例如:2ekbmq326#
您可以使用以下命令
hide
所有弹出窗口:您可以使用以下命令
destroy
所有弹出窗口:hide
和destory
之间的区别在于,当你hide
一个弹出时,你不需要***********React它,但当你销毁它时,你****************************************************************************************************************************请查看我的
JSFIDDLE
,然后:hide
。单击hide
后,您可以再次单击弹出窗口。destroy
。单击destroy
后,尝试再次单击弹出框,发现不会发生任何事情,因为它们已被破坏。为了使它们重新发挥作用,您需要单击React,然后尝试。
kupeojn67#
弹出窗口必须手动初始化,这样你就能准确地知道你必须销毁什么,因为你已经初始化了它。你应该用同一个选择器调用销毁函数。或者我遗漏了什么?