哇,終於長調試運行會議結束後和測試各種方法我認識到這個問題的心不是Ajax請求,但該事件處理程序本身:
.on(hideEvent, this.targetId, this, function(e) {
var _self = e.data;
if(_self.isVisible()) {
_self.hide();
}
});
正如你所看到的,小部件只是隱藏,如果它之前可見。如果你移動你的鼠標進行得太快,現在有兩種情況:
仍然會在這種情況下,事件被丟棄,面板保持可見。當動畫排隊時,只需刪除if語句即可解決問題。我這樣做是通過更換整個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();
}
});
};
負載執行這個代碼和問題應消失。
當您更換js代碼不過,你可以用這個機會來實現相當不錯的功能。通過在事件處理程序使用超時一個可以輕鬆實現一點點延遲不只是提高了可用性(沒有更多的成千上萬的彈出窗口的出現),而且還降低了網絡流量:
$(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();
});
Ofcourse,你可以使用全局變量來控制延誤時間。如果您想要更靈活的方法,則必須覆蓋OverlayPanelRender
中的encodeScript
方法以傳輸其他屬性。您可以通過_self.cfg.delay
訪問它。但請注意,您必須替換組件型號OverlayPanel
,並提供額外的屬性。
你確實很幸運能夠獲得內容。雖然即時通訊遇到完全相同的問題,但我的內容也完全沒有。即使是一個簡單的h:outputText,沒有引用實際的行模型(你用var指定的那個模型)也不會顯示。令人遺憾的是,來自primefaces的開發人員甚至沒有考慮過一個非常常見的企業問題(IMO認爲p:overlayPanel或p:tooltip沒有被設計用於表格)。 – Paranaix 2012-08-14 13:58:06
你用螢火蟲測試過工作流程嗎?檢查JS錯誤,同時檢查來自服務器的ajax響應的內容。 – 2012-08-14 14:12:31
是的,發送ajax請求。它真的很奇怪;雖然我沒有使用3.3,但最新的3.4快照。這可能是一個新的錯誤。 – Paranaix 2012-08-14 14:27:23