隐藏所有 primefaces blockui 元素

Hide all primefaces blockui elements

我有很多 .xhtml 视图。其中很多都有blockui元素,例如:

    <p:blockUI block="tab" widgetVar="subscriberSelectBlocker">
    </p:blockUI>

有时每个视图有超过 1 个。 为了隐藏上面的 blockUI,我在相应的 bean SubscriberFilterBean.java:

中有一个方法
public void hideSubscriberSelectBlockUi() {
    RequestContext.getCurrentInstance().execute("subscriberSelectBlocker.hide()");
}

现在的问题是我需要一次隐藏所有现有的blockuis。 我可以像上面那样单独隐藏它们,但这意味着我将基本上重复相同的代码超过 15 次,并且执行所有这些方法的方法将是巨大的。

有没有办法隐藏标签的所有元素? 像

public void hideSubscriberSelectBlockUi() {
    RequestContext.getCurrentInstance().execute("p:blockui.hide()");
}

当您在 PrimeFaces 元素中指定 widgetVar 时,JavaScript 小部件对象被实例化并分配给 window 范围内具有指定名称的全局变量。这意味着可以找到并操纵此对象。

我建议通过 blockui id 找到它们。 Widget 对象包含它的id,因此在获取所有全局对象和页面中所有blockui id 后,我们可以确定哪些全局对象是blockui widgets。可以使用 jQuery class 选择器从页面获取 Blockui id,因为它们都有共同的 css 样式:.ui-blockui.

这里是 JavaScript 显示页面上所有 blockui 组件的示例代码:

var keys = Object.getOwnPropertyNames( window );
var blocks = $('.ui-blockui');
var blockIds = [];
blocks.each (function (index,value) {
    blockIds[index] = value.id;
});
$.each(keys, function (index, value) {
    var obj = window[ value ];
    if (obj != null) {
        gObj = window[ value ];
        if(gObj.blocker != undefined) {
            if ($.inArray(gObj.blocker.attr('id'), blockIds) != -1) {
                gObj.show();
            }
        }
     }
});