Jsf <;p:粘性>;不';不要在窗口调整大小时调整大小

Jsf <;p:粘性>;不';不要在窗口调整大小时调整大小,jsf,primefaces,sticky,window-resize,Jsf,Primefaces,Sticky,Window Resize,我正在用菜单。我的问题是,调整窗口大小时,它不会调整大小 当窗口调整大小时,如何使也调整大小?好的,正如我在上面的评论中所说,问题是Primefaces在初始化时只计算一次目标的宽度。在那之后,它是一个不变的固定数字 所以我们要做的是重新初始化组件。我已经在网上试过了 下面的客户端Javascript几乎可以做到这一点: foo = PF('widget_j_idt93'); foo.init(foo.cfg); (此处“widget_j_idt93”是Primefaces组件的widgetV

我正在用菜单。我的问题是,调整窗口大小时,它不会调整大小


当窗口调整大小时,如何使
也调整大小?

好的,正如我在上面的评论中所说,问题是Primefaces在初始化时只计算一次目标的宽度。在那之后,它是一个不变的固定数字

所以我们要做的是重新初始化组件。我已经在网上试过了

下面的客户端Javascript几乎可以做到这一点:

foo = PF('widget_j_idt93');
foo.init(foo.cfg);
(此处“widget_j_idt93”是Primefaces组件的
widgetVar
。根据需要替换您自己的。)

缺少的是Primefaces(非常正确)认为小部件已经初始化。为了取消初始化小部件,我们可以首先删除所有元素样式:

$("#tb").attr("style","")
(其中“#tb”是目标的选择器,即您的菜单。)

因此,如果您创建一个函数,首先删除样式,然后重置小部件,那么它应该可以工作

编辑:我想出来了。在清空和初始化之前必须进行还原,然后必须显式运行sticky或not调用所以这应该是解决方案:

fixSticky = function() {
    var bla=PF('widget_j_idt93');
    bla.restore();
    bla.target.attr("style","");
    bla.init(bla.cfg);
    if($(window).scrollTop() > bla.initialState.top) {bla.fix();} else {bla.restore();}
}

只要在调整页面大小时运行此函数(修改为您自己的widgetVar,或者可能带有参数)。

关键在于Primefaces在初始化时(即加载页面时)计算目标元素的宽度。之后是一个固定的数字。我正在检查是否可以从客户端重新初始化这个特定的小部件,然后您可以将其连接到页面的调整大小事件。