Можно ли установить ширину выпадающего списка автозаполнения jQuery? - PullRequest
29 голосов
/ 22 апреля 2010

Я использую это управление автозаполнением в поле со списком jQuery UI из коробки с веб-сайта jQuery UI:

Моя проблема в том, что у меня есть несколько комбинированных списков на странице, и я хочу, чтобы они имели разную ширину для каждого из них.

Я могу изменить ширину для ВСЕХ из них, добавив этот CSS:

 .ui-autocomplete-input
 {
     width: 300px;
 }

но я не могу найти способ изменить ширину только на одном из них.

Ответы [ 13 ]

34 голосов
/ 24 апреля 2010

Простой

$('.ui-autocomplete-input').css('width','300px')

работает (я пробовал на связанной странице с Firebug ) изменить первый на странице.

Вы можете сделать что-то вроде:

$($('.ui-autocomplete-input')[N]).css('width','300px') #N is the nth box on the page

Чтобы изменить N-ую.

Чтобы найти конкретную характеристику, вы можете сделать это разными способами.

Найдите его по первой «опции» (в данном примере «asp»):

$('.ui-autocomplete-input').map(function(){if ($(this).parent().children()[1].options[0].text == 'asp'){ $(this).css('width','300px'); return false;} })

Найдите его по «ярлыку»:

$('.ui-autocomplete-input').map(function(){if ($($(this).parent().children()[0]).text() == "Your preferred programming language: "){ $(this).css('width','300px'); return false;}})

и т.д ...

Я обновлю, если у вас есть представление о том, как вы хотите найти свой комбинированный список.

РЕДАКТИРОВАТЬ ДЛЯ КОММЕНТАРИИ

оо, это еще проще. Исходя из примера источника, на который вы ссылаетесь, HTML уже заключен в div:

<div class="ui-widget" id="uniqueID">
    <label>Your preferred programming language: </label>
    <select>
        <option value="a">asp</option>
        <option value="c">c</option>
        <option value="cpp">c++</option>
        <option value="cf">coldfusion</option>
        <option value="g">groovy</option>
        <option value="h">haskell</option>
        <option value="j">java</option>
        <option value="js">javascript</option>
        <option value="p1">perl</option>
        <option value="p2">php</option>
        <option value="p3">python</option>
        <option value="r">ruby</option>
        <option value="s">scala</option>
    </select>
</div>

Тогда я бы дал этому div уникальный идентификатор:

$('#uniqueID > input.ui-autocomplete-input').css('width', '300px')

Это выбирает дочерние элементы вашего div, которые являются входами с классом "ui-autocomplete-input".

5 голосов
/ 22 февраля 2012

Я использую следующее, которое в основном является одной из доступных функций инициализации виджета и может быть тем, что вы ищете тоже. Я добавил всего две простые строки, чтобы добиться этого

$(function(){
$.widget( "ui.combobox", {
    _create: function() {
        var self = this,
        select = this.element.hide(),
        selected = select.children( ":selected" ),
        value = selected.val() ? selected.text() : "";
        var getwid = this.element.width(); // <<<<<<<<<<<< HERE
        var input = this.input = blah blah
        .insertAfter( select )
        .val( value )
        .autocomplete({
            delay: 0,
            minLength: 0,
            source: function( request, response ) {
                blah blah
            },
            blah blah
        })
        //?? .addClass( "ui-widget ui-widget-content ui-corner-left" );
        input.width(getwid); // <<<<<<<<<<<< AND HERE
        input.data( "autocomplete" )._renderItem = function( ul, item ) {
            blah blah

Обратите внимание на строки var getwid и т. Д. И input.width (getwid);

Это я разработал, чтобы скопировать ширину выделенных объектов и применить ее к полям со списком, поскольку они ( автозаполнение списков ) создаются для наложения входных данных выбора.

Надеюсь, это поможет. С уважением.

PS: я считаю, что если вы действительно хотите применить фиксированную ширину, не ссылаясь на базовый список выбора, тогда проигнорируйте первую добавленную мной строку и измените вторую, чтобы сравнить предопределенный массив с идентификатором this.

5 голосов
/ 20 января 2012

JavaScript

var $myinput = $('#myinput').autocomplete({source: ['ABC', 'BCD', 'CDE']})
$myinput.data('autocomplete').menu.element.addClass('myautocomplete');

CSS

.myautocomplete{width:300px!important;}

Вы не можете установить width напрямую, потому что он будет перезаписан. Но вы можете установить min-width напрямую.

var $myinput = $('#myinput').autocomplete({source: ['ABC', 'BCD', 'CDE']})
$myinput.data('autocomplete').menu.element.css('min-width', '300px');
5 голосов
/ 27 апреля 2010

Не беспокойтесь о JavaScript. Вы можете легко сделать это в CSS, как вы изначально пытались сделать. Все, что вам нужно сделать, это добавить уникальный селектор для каждого. Например:

HTML будет выглядеть так

<div class="title">
    <label for="title">Title: </label>
    <input id="title">
</div>
<div class="tags">
    <label for="tags">Tags: </label>
    <input id="tags">
</div>

CSS будет выглядеть так

.ui-autocomplete-input
{ 
    width: 120px;
}
.title .ui-autocomplete-input
{ 
    width: 200px;
}
.tags .ui-autocomplete-input
{ 
    width: 600px;
}
5 голосов
/ 25 апреля 2010

Обратите внимание, что я использую код в http://jqueryui.com/demos/autocomplete/#combobox.

В методе _create добавьте эту строку:

    _create: function() {
        var self = this;
        var eleCSS = this.element[0].className; //This line

Тогда немного прокрутите, найдите это:

    .addClass("ui-widget ui-widget-content ui-corner-left");

И изменить это на:

    .addClass("ui-widget ui-widget-content ui-corner-left "+ eleCSS);

HTML

<select class="combo-1 autocomplete">
    <option value="a">asp</option>
    <option value="c">c</option>
    <option value="cpp">c++</option>
    <option value="cf">coldfusion</option>
    <option value="g">groovy</option>
    <option value="h">haskell</option>
    <option value="j">java</option>
</select>

Теперь вы можете применить CSS к combo-1:

<script>
    $(function() {
        $('.autocomplete').combobox();
        $('.combo-1').css('width', '50px');
    });
</script>
3 голосов
/ 10 ноября 2010

Я думаю, что самый простой способ сделать это - захватить событие открытия и затем установить ширину там:

$("#autocompleteInput").bind("autocompleteopen", function(event, ui) {
  var width = 300;
  $(".ui-autocomplete.ui-menu").width(300);
});

Поскольку одновременно может быть активным только одно меню автозаполнения, можно просто изменить ширину класса меню.

1 голос
/ 22 января 2015
$.widget( "custom.myAutoComplete", $.ui.autocomplete, {
    options: {
        resultClass: "leanSolutions",
    },

    _create: function()
    {
        this._super();
    },`

    _renderMenu: function(ul, items)
    {
        var that = this;
        ul.addClass(that.options.resultClass);

        $.each( items, function( index, item ) {
            that._renderItemData( ul, item );
        });
    }
});

Теперь вы можете сделать это:

$('.myAutoCompleteBox').myAutoComplete(
 data: ...
 etc: ...
 resultClass: 'myAutoCompleteBoxResultList'
);

И тогда вы можете оформить его

.myAutoCompleteBoxResultList{   
    width: 8000px;
}
1 голос
/ 24 апреля 2010

Вы всегда можете установить фактическое правило CSS в вашем документе, чтобы соответствовать классу,

.ui-autocomplete-input
{ 
    width: 300px;
}

если вы заранее знаете, какова должна быть ширина.

0 голосов
/ 20 октября 2017

Установите максимальную ширину вместо ширины, потому что ширина переопределяется плагином в любое время.

.ui-autocomplete-input
{ 
    max-width: 300px;/* you can set by percentage too */
}
0 голосов
/ 26 апреля 2016
$input.data('ui-autocomplete')._resizeMenu = function () {
    var ul = this.menu.element;
    ul.outerWidth(this.element.outerWidth()); 
 }

Если вы делаете внутри своего виджета, вы можете сделать что-то вроде

        // Fix width of the menu
        this.input = <your dom element where you bind autocomplete>;
        this.input.data("ui-autocomplete")._resizeMenu = function () {
            var ul = this.menu.element;
            ul.outerWidth(this.element.outerWidth())
        }
...