3

我正在使用jQuery UI 选择菜单,偶尔会遇到一些问题。

它位于我的用户页面的左上角。使用“下拉/地址”类型,有时(似乎是随机的),下拉菜单打开而不是向下,除了第一个选项之外,您无法选择其中的任何选项,因为它都在屏幕“上方”。

有人知道那里有一个设置/选项来强制它打开吗?谢谢!

更新.... 11/23/11 1:11pm EST 这是调用的一些代码:

$(function(){
            $('select#selectionA').selectmenu({
                style:'dropdown', 
                menuWidth: 220,
                positionOptions: {
                    collision: 'none'
                },
                format: addressFormatting
            });
        });
4

2 回答 2

7

该插件使用jQuery UI 库的Position实用程序。如果您查看插件源代码positionOptions中的默认选项,则函数中使用了一个属性_refreshPosition()

options: {
    transferClasses: true,
    typeAhead: 1000,
    style: 'dropdown',
    positionOptions: {
        my: "left top",
        at: "left bottom",
        offset: null
    },
    width: null,
    menuWidth: null,
    handleWidth: 26,
    maxHeight: null,
    icons: null,
    format: null,
    bgImage: function() {},
    wrapperElement: "<div />"
}

_refreshPosition: function() {
    var o = this.options;

    // if its a pop-up we need to calculate the position of the selected li
    if ( o.style == "popup" && !o.positionOptions.offset ) {
        var selected = this._selectedOptionLi();
        var _offset = "0 " + ( this.list.offset().top  - selected.offset().top - ( this.newelement.outerHeight() + selected.outerHeight() ) / 2);
    }
    // update zIndex if jQuery UI is able to process
    this.listWrap
        .zIndex( this.element.zIndex() + 1 )
        .position({
            // set options for position plugin
            of: o.positionOptions.of || this.newelement,
            my: o.positionOptions.my,
            at: o.positionOptions.at,
            offset: o.positionOptions.offset || _offset,
            collision: o.positionOptions.collision || 'flip'
        });
}

'flip'如果没有为collisionposition 实用程序的选项提供任何选项,您可以看到它使用默认值。根据 jQuery UI 文档:

翻转:到另一侧并再次运行碰撞检测以查看它是否适合。如果它不适合任何一个位置,则应该使用 center 选项作为后备。
fit:因此元素保持在所需的方向,但重新定位以使其适合。
none:不做碰撞检测。

所以我想你可以在初始化插件时传递一个选项来定义none碰撞选项:

$('select').selectmenu({
    positionOptions: {
        collision: 'none'
    }
});

还没有测试,这只是看代码。


编辑以下评论

我注意到 github 上可用的 javascript 版本和插件网站上使用的版本不一样。我不知道你用的是哪一个,但是网站上用的那个positionOptions实际上是没有选项的,所以调用的时候指定是没有效果的selectmenu()
似乎无法直接链接到网站上的 javascript,所以这里有一些代码来说明:

defaults: {
    transferClasses: true,
    style: 'popup', 
    width: null, 
    menuWidth: null, 
    handleWidth: 26, 
    maxHeight: null,
    icons: null, 
    format: null
}

_refreshPosition: function(){   
    //set left value
    this.list.css('left', this.newelement.offset().left);

    //set top value
    var menuTop = this.newelement.offset().top;
    var scrolledAmt = this.list[0].scrollTop;
    this.list.find('li:lt('+this._selectedIndex()+')').each(function(){
        scrolledAmt -= $(this).outerHeight();
    });

    if(this.newelement.is('.'+this.widgetBaseClass+'-popup')){
        menuTop+=scrolledAmt; 
        this.list.css('top', menuTop); 
    }   
    else { 
        menuTop += this.newelement.height();
        this.list.css('top', menuTop); 
    }
}

正如我第一次使用来自github的版本所描述的那样,我能够使其工作。在我看来,这是一个更新/完整的版本。此外,它是几天前更新的。

我创建了一个带有两个选择的小测试页面。我已经改变了下拉菜单的位置以显示在上面。
第一个没有指定碰撞选项,因此使用了'flip'并且下拉菜单显示在下面,因为上面没有足够的空间。
第二个指定了“无”,即使没有足够的空间,下拉菜单也会显示在上面。

我已将小型测试项目放在我的Dropbox上。

于 2011-11-21T10:05:50.597 回答
1

我是 Selectmenu 插件的维护者。目前共有三个版本,更多信息请查看wiki:https ://github.com/fnagel/jquery-ui/wiki/Selectmenu

我假设你正在使用我的叉子。碰撞问题可能与此修复有关https://github.com/fnagel/jquery-ui/pull/255,请尝试最新版本。

要强制滚动条使用选项 maxHeight。

于 2012-09-04T10:32:18.680 回答