Latency issue with Primefaces overlayPanel - loads to lazy

后端 未结 4 1899
天涯浪人
天涯浪人 2021-01-04 22:51

I am using Primefaces 3.2 with jsf 2 and glassfish 3.1.2.

I have a p:dataTable of users containing avatars of the user. Whenever the user moves the mouse over the av

4条回答
  •  死守一世寂寞
    2021-01-04 23:32

    At the same time I thank you for this brilliant solution I take the opportunity to update it for Primefaces 5.2. In our application the code broke after that upgrade.

    Follows the updated code for Primefaces 5.2:

        PrimeFaces.widget.OverlayPanel.prototype.bindTargetEvents =  function() {
        var $this = this;
        //mark target and descandants of target as a trigger for a primefaces overlay
        this.target.data('primefaces-overlay-target', this.id).find('*').data('primefaces-overlay-target', this.id);
    
        //show and hide events for target
        if(this.cfg.showEvent === this.cfg.hideEvent) {
            var event = this.cfg.showEvent;
    
            this.target.on(event, function(e) {
                $this.toggle();
            });
        }
        else {
            var showEvent = this.cfg.showEvent + '.ui-overlaypanel',
            hideEvent = this.cfg.hideEvent + '.ui-overlaypanel';
    
            this.target
                .off(showEvent + ' ' + hideEvent)
                .on(showEvent, function(e) {
                    clearTimeout($this.timer);
    
                    $this.timer = setTimeout(function() {
                        $('.ui-overlaypanel').hide(); 
                        $this.hidden = false;
                        $this.show();
                    }, 500);
                })
                .on(hideEvent, function(e) {
    
                    clearTimeout($this.timer); 
    
                    $this.timer = setTimeout(function() {
                        // don't hide if hovering overlay
                        if(! $this.jq.is(":hover")) {
                            $this.hide();
                        }
                    }, 100);
                });
        }
    
        $this.target.off('keydown.ui-overlaypanel keyup.ui-overlaypanel').on('keydown.ui-overlaypanel', function(e) {
            var keyCode = $.ui.keyCode, key = e.which;
    
            if(key === keyCode.ENTER||key === keyCode.NUMPAD_ENTER) {
                e.preventDefault();
            }
        })
        .on('keyup.ui-overlaypanel', function(e) {
            var keyCode = $.ui.keyCode, key = e.which;
    
            if(key === keyCode.ENTER||key === keyCode.NUMPAD_ENTER) {
                $this.toggle();
                e.preventDefault();
            }
        });
    };
    

    I also added an extra feature which allows the user to move the mouse over the overlay without hiding it. It should hide when you move the mouse out of it then which I accomplished through:

    
    
    function onShowOverlayPanel(ovr) {
        ovr.jq.on("mouseleave", function(e) {
            ovr.jq.hide();
        });
    }
    

    Hope you enjoy!

提交回复
热议问题