Ширина автозаполнения пользовательского интерфейса jQuery не установлена правильно

58

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

Посмотрите на этот пример, чтобы увидеть его сами: http://jsbin.com/ojoxa4

Я попытался установить ширину списка сразу после его создания, например:

$('.ui-autocomplete:last').css('width',
                               $('#currentControlID').width()
                              );

Это ничего не делает.

Я также попытался установить ширину, используя стили на странице:

ui-autocomplete { width: 500px; }

Это работает, удивительно, однако это будет означать, что все автозаполнения на странице должны быть одинаковой ширины, что не идеально.

Есть ли способ установить ширину каждого меню отдельно? Или лучше, может ли кто-нибудь объяснить, почему ширина не работает правильно для меня?

  • 0
    Ответ @hmoyat ниже должен быть принятым ответом.
Теги:
autocomplete
jquery-ui-autocomplete

17 ответов

51
Лучший ответ

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

Сначала я добавил <div> так:

<div id="menu-container" style="position:absolute; width: 500px;"></div>

Абсолютное позиционирование позволяет мне помещать <div> сразу после ввода без прерывания потока документа.

Затем, когда я вызываю автозаполнение, я указываю аргумент appendTo в параметрах, заставляя меню добавляться к моему <div> и, таким образом, наследует его ширину:

$('#myInput').autocomplete({ source: {...}, appendTo: '#menu-container'});

Это устраняет проблему. Тем не менее, мне все равно будет интересно узнать, почему это необходимо, а не правильно работает плагин.

  • 3
    У меня точно такая же проблема. Глядя на примеры на сайте пользовательского интерфейса Jquery и пытаясь их воспроизвести, я не вижу, что я делаю по-другому. Это я или "новый" официальный автозаполнение хуже старого Йорна?
  • 0
    Это отлично работает, кроме как на IE9.
Показать ещё 4 комментария
83

Я использую это drop-in solution:

jQuery.ui.autocomplete.prototype._resizeMenu = function () {
  var ul = this.menu.element;
  ul.outerWidth(this.element.outerWidth());
}

В основном это @madcapnmckay решение, но не нужно менять исходный источник.

  • 2
    Пятно на ответ. +1
  • 2
    это должно быть общепринятым решением - так как это самый простой и самый ненавязчивый
Показать ещё 3 комментария
35

В коде автозаполнения я прокопал, и виновник - это немного ярче

_resizeMenu: function() {
    var ul = this.menu.element;
    ul.outerWidth( Math.max(
        ul.width( "" ).outerWidth(),
        this.element.outerWidth()
    ) );
},

Я не уверен, что предполагается ul.width( "), но ui.width(" "). outWidth() всегда возвращает ширину тела, потому что это то, к чему добавляется ul. Следовательно, ширина никогда не устанавливается на ширину элементов....

В любом случае. Чтобы исправить просто добавьте это в свой код

$element.data("autocomplete")._resizeMenu = function () {
        var ul = this.menu.element;
        ul.outerWidth(this.element.outerWidth());
}

Это ошибка?

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

  • 1
    Похоже, это так. bugs.jqueryui.com/ticket/7303
  • 0
    Кто-то закрыл это ... не знаю почему. Я все еще получаю эту проблему в последнем пользовательском интерфейсе JQuery.
Показать ещё 3 комментария
19

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

  • 12
    Чтобы уточнить для других: .ui-autocomplete {position: absolute; }
  • 0
    не работает для меня
Показать ещё 3 комментария
16

Установите css в открытое событие!

$('#id').autocomplete({
    minLength: 3,
    source: function(request, response) {
        $.ajax({
                    url: "myurl",
                    dataType: "json",
                    type: 'POST',
                    data: {
                        'q': request.term,

                        'maxRows': 15
                    },
                    success: function(data) {

                        response($.map(data, function(item) {
                            return {
                                label: item.name,
                            }
                        })),
                    }
                })
            },
            select: function(event, ui) {
                $("#id").val(ui.item.label);
            },
            focus: function ( event, ui ){
                $form.find('#id').val(ui.item.label);
                return false;
            },
            open: function(){
                **$('.ui-autocomplete').css('width', '300px');**
            }
        })
  • 0
    Я сделал это, я фактически поместил результаты в div и установил позицию. Он работает в других браузерах, кроме IE7 и IE9. Это почему? Вот как я это appendTo: "#results", open: function(){ var position = $("#results").position(), left = position.left, top = position.top; $("#results > ul").css({left: (left + 15) + "px", top: (top + 30) + "px", width: (206) + "px" }); },
  • 0
    Возможно, вам также придется сбросить max-width .
15

Я столкнулся с этой проблемой, но понял, что просто забыл включить ссылку на таблицу стилей jquery.ui.autocomplete.css. Вы включили эту таблицу стилей в свою макет/главную страницу?

  • 0
    Это было проблемой для меня - и я подозреваю, что это было для большинства людей. Вы все думаете, что JQ UI так сломан по умолчанию? ;)
  • 3
    Или добавьте следующее в свой CSS, поскольку это все, что находится внутри этого файла: .ui-autocomplete { position: absolute; top: 0; left: 0; cursor: default; }
Показать ещё 1 комментарий
14

Я знаю, что на это уже давно ответили, но я думаю, что есть лучшее решение

$(".autocomplete").autocomplete({
    ...
    open: function() {
        $("ul.ui-menu").width( $(this).innerWidth() );
        ...
    }
    ...
});

Это сработало для меня.

  • 1
    Очень хорошее решение! Спасибо!
  • 0
    Хорошее решение, к сведению, он принимает входные аргументы, поэтому прочитайте руководство перед использованием - например, если вы пишете функцию, когда NOT ONE автозаполнение на одной странице.
3

$("#autocompleteID").autocomplete({
source: "http://myhost/magento/js/jquery/ui/php/ville.php",
minLength: 1,
open: function(event, ui)
{
   $("#autocompleteID").autocomplete ("widget").css("width","300px");  
} 
});
1

Ну, Эндер. Я не знаю, может ли мое решение помочь вам или нет, но с Jqueryui remote-with-cache.html он работал. Я просто добавил свойство size в текстовое поле.

См. код ниже:

<div class="demo">
    <div class="ui-widget">
        <label for="birds">Birds: </label>
        <input id="birds" size="30"/>
    </div>
</div>
0

Я столкнулся с той же проблемой и разрешил ее, используя этот кусок кода, хотя это немного хитовый и пробный тип, но он работает, я не мог установить ширину, поэтому решил установить max-width.

  $('.ui-autocomplete').css('margin-left','25%') //center align
  $('.ui-autocomplete').css('max-width','38%') //hit and trial
  $('.ui-autocomplete').css('min-width','38%') //hit and trial

Посмотрите, что лучше всего подходит для вас. Надеюсь, это поможет.

0

Если вы хотите использовать css, попробуйте следующее:

.ui-widget-content.ui-autocomplete{ width: 350px; }

Он будет работать на каждом входе автозаполнения.

0

У меня это в моем файле css, поэтому автозаполнение принимает width стиля span:

 span input.ui-autocomplete-input {
     width: 100%;
 }
  • 0
    Обратите внимание, что вы публикуете недостаточно информации о вашей реализации. Автор имеет свой собственный HTML, и ваш стиль не соответствует его требованиям.
0

Мое решение состояло в том, чтобы добавить автозаполнение в div с id, и они устанавливают CSS для этой конкретной ul:

JQuery/JavaScript:

$("input[name='search-text]").autocomplete({
    appendTo: "#item-search-autocomplete",
    source: ....
});

CSS

#item-search-autocomplete .ui-autocomplete {
    width: 315px;
}

Работает как шарм.

0

Если вы не можете установить ширину динамически, и ничего не работает, попробуйте включить этот

http://code.google.com/p/jquery-ui/source/browse/trunk/themes/base/jquery.ui.autocomplete.css?spec=svn3882&r=3882

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

Он работал у меня, пробовав все остальное

  • 2
    Значимой частью файла jquery.ui.autocomplete.css, с которым вы связаны, является позиция: абсолютная, на которую @ andrius-chamentauskas указал выше. Следующее исправило это для меня: .ui-autocomplete {position: absolute; }
0

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

$('.ui-autocomplete-input#MyId').css('width', '100px');

после завершения вызова $('#MyId').autocomplete(...);. Таким образом, вы не связываете порядок своих текстовых полей автозаполнения в своей DOM с вашим script.

0

Если вы используете официальный jQuery ui autocomplete (я на 1.8.16) и хотели бы определить ширину вручную, вы можете сделать это.

Если вы используете мини-версию (если нет, то найдите вручную, сопоставляя _resizeMenu), найдите...

_resizeMenu:function(){var a=this.menu.element;a.outerWidth(Math.max(a.width("").outerWidth(),this.element.outerWidth()))}

... и замените его (добавьте this.options.width || до Math.max)...

_resizeMenu:function(){var a=this.menu.element;a.outerWidth(this.options.width||Math.max(a.width("").outerWidth(),this.element.outerWidth()))}

... теперь вы можете включить значение ширины в функцию .autocomplete({width: 200}), и jQuery будет ее соблюдать. Если нет, по умолчанию будет вычисляться.

-1

Существует опция ширины для автозаполнения. Я использую его для 1.3.2.

$('#mytextbox').autocomplete(url, {  
        width: 280,
        selectFirst: false,
        matchSubset: false,
        minChars: 1,
        extraParams:{myextraparam:myextraparam},
        max: 100
    });
  • 3
    Вы должны использовать другой плагин автозаполнения. Пользовательский интерфейс jQuery не имеет такой опции: jqueryui.com/demos/autocomplete/#options
  • 1
    На самом деле, я использую jquery 1.3.2 с jquery.autocomplete.min.js 1.0.2 . Если вы посмотрите в jquery.autocomplete.min.js для ширины, вы увидите эту строку: if(options.width>0)element.css("width",options.width); Это устанавливает ширину автозаполнения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню