@ -250,12 +250,12 @@
_getLeftAlignPosition : function ( combo , popup , extraWidth , container ) {
_getLeftAlignPosition : function ( combo , popup , extraWidth , container ) {
var comboRect = combo . element [ 0 ] . getBoundingClientRect ( ) ,
var comboRect = combo . element [ 0 ] . getBoundingClientRect ( ) ,
popupRect = popup . element . bounds ( ) ,
popupRect = popup . element [ 0 ] . getBoundingClientRect ( ) ,
viewportRect = document . documentElement . getBoundingClientRect ( ) ,
viewportRect = document . documentElement . getBoundingClientRect ( ) ,
containerRect = container ? container . getBoundingClientRect ( ) : { left : 0 } ;
containerRect = container ? container . getBoundingClientRect ( ) : { left : 0 } ;
var left = comboRect . left - containerRect . left + extraWidth ;
var left = comboRect . left - containerRect . left + extraWidth ;
if ( left + popupRect . width - containerRect . left > viewportRect . width ) {
if ( comboRect . left + popupRect . width > viewportRect . width ) {
left = viewportRect . width - popupRect . width - containerRect . left ;
left = viewportRect . width - popupRect . width - containerRect . left ;
}
}
return left ;
return left ;
@ -265,12 +265,13 @@
var left = this . _getLeftAlignPosition ( combo , popup , extraWidth , container ) ;
var left = this . _getLeftAlignPosition ( combo , popup , extraWidth , container ) ;
var dir = "" ;
var dir = "" ;
// 如果放不下,优先使用RightAlign, 如果RightAlign也放不下, 再使用left=0
// 如果放不下,优先使用RightAlign, 如果RightAlign也放不下, 再使用left=0
if ( left < 0 ) {
var containerRect = container ? container . getBoundingClientRect ( ) : { left : 0 } ;
if ( left + containerRect . left < 0 ) {
left = this . _getRightAlignPosition ( combo , popup , extraWidth ) ;
left = this . _getRightAlignPosition ( combo , popup , extraWidth ) ;
dir = "left" ;
dir = "left" ;
}
}
if ( left < 0 ) {
if ( left + containerRect . left < 0 ) {
left = 0 ;
left = 0 - containerRect . left ;
}
}
return {
return {
left : left ,
left : left ,
@ -678,8 +679,8 @@
getComboPosition : function ( combo , popup , extraWidth , extraHeight , needAdaptHeight , directions , offsetStyle , positionRelativeElement ) {
getComboPosition : function ( combo , popup , extraWidth , extraHeight , needAdaptHeight , directions , offsetStyle , positionRelativeElement ) {
extraWidth || ( extraWidth = 0 ) ;
extraWidth || ( extraWidth = 0 ) ;
extraHeight || ( extraHeight = 0 ) ;
extraHeight || ( extraHeight = 0 ) ;
var bodyHeight = BI . Widget . _renderEngine . createElement ( "body" ) . bounds ( ) . height - extraHeight ;
var viewportBounds = document . documentElement . getBoundingClientRect ( ) ;
var maxHeight = Math . min ( popup . attr ( "maxHeight" ) || bodyHeight , bodyH eight) ;
var maxHeight = Math . min ( popup . attr ( "maxHeight" ) || viewportBounds . height , viewportBounds . h eight) ;
popup . resetHeight && popup . resetHeight ( maxHeight ) ;
popup . resetHeight && popup . resetHeight ( maxHeight ) ;
var position = BI . DOM . getComboPositionByDirections ( combo , popup , extraWidth , extraHeight , needAdaptHeight , directions || [ "bottom" , "top" , "right" , "left" ] , positionRelativeElement ) ;
var position = BI . DOM . getComboPositionByDirections ( combo , popup , extraWidth , extraHeight , needAdaptHeight , directions || [ "bottom" , "top" , "right" , "left" ] , positionRelativeElement ) ;
switch ( offsetStyle ) {
switch ( offsetStyle ) {
@ -703,7 +704,7 @@
break ;
break ;
}
}
if ( needAdaptHeight === true ) {
if ( needAdaptHeight === true ) {
popup . resetHeight && popup . resetHeight ( Math . min ( bodyH eight - position . top + ( positionRelativeElement ? positionRelativeElement . getBoundingClientRect ( ) . top : 0 ) , maxHeight ) ) ;
popup . resetHeight && popup . resetHeight ( Math . min ( viewportBounds . h eight - position . top + ( positionRelativeElement ? positionRelativeElement . getBoundingClientRect ( ) . top : 0 ) , maxHeight ) ) ;
}
}
return position ;
return position ;
} ,
} ,