Wow, wreszcie po sesji długo debuging i testując różne podejścia i uznaje się, że problem isnt wniosek ajax ale sam obsługi zdarzeń:
.on(hideEvent, this.targetId, this, function(e) {
var _self = e.data;
if(_self.isVisible()) {
_self.hide();
}
});
Jak widać, Widżet jest po prostu ukryty, jeśli jest widoczny wcześniej. Jeśli poruszając myszą się zbyt szybko, teraz dwie rzeczy mogą się zdarzyć:
- widżet widoczny we wszystkich
- animacji isnt trwa nadal
W tym przypadku zdarzenie jest odrzucane i panel pozostaje widoczny. Ponieważ animacje są w kolejce, po prostu trzeba usunąć instrukcję if, aby naprawić problem. Zrobiłem to, wymieniając całą metodę bindEvents
:
PrimeFaces.widget.OverlayPanel.prototype.bindEvents = function() {
//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;
$(document).off(event, this.targetId).on(event, this.targetId, this, function(e) {
e.data.toggle();
});
}
else {
var showEvent = this.cfg.showEvent + '.ui-overlay',
hideEvent = this.cfg.hideEvent + '.ui-overlay';
$(document).off(showEvent + ' ' + hideEvent, this.targetId).on(showEvent, this.targetId, this, function(e) {
var _self = e.data;
if(!_self.isVisible()) {
_self.show();
}
})
.on(hideEvent, this.targetId, this, function(e) {
var _self = e.data;
_self.hide();
});
}
//enter key support for mousedown event
this.bindKeyEvents();
var _self = this;
//hide overlay when mousedown is at outside of overlay
$(document.body).bind('mousedown.ui-overlay', function (e) {
if(_self.jq.hasClass('ui-overlay-hidden')) {
return;
}
//do nothing on target mousedown
var target = $(e.target);
if(_self.target.is(target)||_self.target.has(target).length > 0) {
return;
}
//hide overlay if mousedown is on outside
var offset = _self.jq.offset();
if(e.pageX < offset.left ||
e.pageX > offset.left + _self.jq.outerWidth() ||
e.pageY < offset.top ||
e.pageY > offset.top + _self.jq.outerHeight()) {
_self.hide();
}
});
//Hide overlay on resize
var resizeNS = 'resize.' + this.id;
$(window).unbind(resizeNS).bind(resizeNS, function() {
if(_self.jq.hasClass('ui-overlay-visible')) {
_self.hide();
}
});
};
wykonanie tego kodu na obciążenia i problem powinien zniknąć.
jak wasz zastępując kod js niemniej, można skorzystać z tej oppurtunity wdrożyć całkiem miły funkcji. Poprzez zastosowanie limity czasu w obsługi zdarzeń można łatwo wdrożyć trochę opóźnienia nie tylko poprawia użyteczność (nie więcej tysięcy pop-upów pojawić), ale także ograniczenie ruchu sieciowego:
$(document).off(showEvent + ' ' + hideEvent, this.targetId).on(showEvent, this.targetId, this, function(e) {
var _self = e.data;
_self.timer = setTimeout(function(){
if(!_self.isVisible()) {
_self.show();
}
}, 300);
})
.on(hideEvent, this.targetId, this, function(e) {
var _self = e.data;
clearTimeout(_self.timer);
_self.hide();
});
Oczywiście można użyć zmiennej globalnej kontrolować opóźnienie czas.Jeśli chcesz bardziej elastycznego podejścia, musisz nadpisać metodę encodeScript
w OverlayPanelRender
, aby przesłać dodatkową właściwość. Możesz uzyskać do niego dostęp za pomocą _self.cfg.delay
. Zauważ jednak, że będziesz musiał zastąpić model komponentu OverlayPanel
również dostarczając mu dodatkowego atrybutu.
Masz szczęście, że faktycznie dostaniesz treści. Podczas gdy mam do czynienia z dokładnie tym samym problemem, moje treści również są całkowicie pomijane. Nawet prosty h: outputText bez odwołań do rzeczywistego modelu wiersza (ten, który określasz za pomocą var) nie jest wyświetlany. Smutne jest to, że deweloperzy z wcześniejszych wersji nie uważali nawet za bardzo powszechny problem przedsiębiorstwa (IMO nie wygląda na to, że p: overlayPanel lub p: tooltip zostały zaprojektowane do użycia w tabelach). – Paranaix
Czy przetestowałeś przepływ pracy za pomocą firebuga? Sprawdź błędy JS, a także sprawdź zawartość odpowiedzi ajax z serwera. –
Tak, wysyłane jest żądanie ajax. To naprawdę dziwne; chociaż nie używam 3.3, ale najnowszej wersji 3.4. To może być nowy błąd. – Paranaix