Breite der automatischen Vervollständigung der jQuery-Benutzeroberfläche nicht richtig eingestellt

Lesezeit: 6 Minuten

Ich habe ein jQuery-UI-Autocomplete-Feld implementiert, und anstatt die Breite des Textfelds zu sein, werden die Dropdown-Optionen erweitert, um die verbleibende Breite der Seite auszufüllen.

Schauen Sie sich dieses Beispiel an, um sich selbst davon zu überzeugen: http://jsbin.com/ojoxa4

Ich habe versucht, die Breite der Liste unmittelbar nach dem Erstellen wie folgt festzulegen:

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

Dies scheint nichts zu tun.

Ich habe auch versucht, die Breite mithilfe von Stilen auf der Seite festzulegen:

ui-autocomplete { width: 500px; }

Das funktioniert erstaunlicherweise, aber es würde bedeuten, dass alle Autovervollständigungen auf einer Seite die gleiche Breite haben müssten, was nicht ideal ist.

Gibt es eine Möglichkeit, die Breite jedes Menüs einzeln festzulegen? Oder besser, kann mir jemand erklären, warum die Breiten bei mir nicht richtig funktionieren?

  • Die Antwort von @hmoyat weiter unten sollte die akzeptierte Antwort sein.

    – Kosta Kontos

    11. April 2018 um 10:20 Uhr

Benutzer-Avatar
Arnaud Leymet

ich benutze das Drop-in-Lösung:

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

Das ist im Grunde die Lösung von @madcapnmckay, aber das muss die ursprüngliche Quelle nicht ändern.

  • Dies sollte die akzeptierte Lösung sein – da es am einfachsten und unaufdringlichsten ist

    – nach oben

    24. Juli 2015 um 20:11 Uhr

  • Ich denke, es ist die beste Antwort, weil es für alle jquery Autocomplete-Deklarationen gilt, und es ist klar!

    – Cristiam Mercado

    3. Dezember 2015 um 14:38 Uhr

  • keine Ahnung, was genau dieser Code tut – aber er passt die Autocomplete-Breite “magisch” an die Breite des betreffenden Eingabefelds an; genau so, wie es ursprünglich funktionieren sollte, aber unter vielen Umständen nicht funktioniert.

    – niedrige_mieten

    19. Juli 2016 um 7:23 Uhr

  • Hey, danke für diese Antwort. Können Sie etwas mehr Einblick in die genaue Funktionsweise des Codes geben, damit ich herausfinden kann, was die optimale Platzierung dafür ist? Überschreibt es die _resizeMenu Funktion? Ich habe es in ein Skript eingefügt, das einmal auf jeder Seite meiner Webanwendung ausgeführt wird. Haben Sie Vorschläge für eine bessere Platzierung? Vielen Dank.

    – sieuv

    30. März 2017 um 10:15 Uhr

  • element.autocomplete('instance')._resizeMenu ist besser, da Sie nur die Instanz überschreiben können. Anstatt für andere automatische Vervollständigungen auf derselben Seite zu überschreiben.

    – Lomax

    30. November 2020 um 15:51 Uhr

Es stellt sich heraus, dass das Problem darin besteht, dass das Menü erweitert wird, um die Breite seines übergeordneten Elements auszufüllen, das standardmäßig der Hauptteil ist. Dies kann korrigiert werden, indem man ihm ein enthaltendes Element mit der richtigen Breite gibt.

Zuerst fügte ich a hinzu <div> so:

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

Die absolute Positionierung ermöglicht mir die Platzierung <div> unmittelbar nach der Eingabe, ohne den Belegfluss zu unterbrechen.

Wenn ich dann die automatische Vervollständigung aufrufe, gebe ich an an appendTo Argument in den Optionen, wodurch das Menü an my angehängt wird <div>und erben somit seine Breite:

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

Dies behebt das Problem. Es würde mich jedoch immer noch interessieren, warum dies erforderlich ist, anstatt dass das Plug-In ordnungsgemäß funktioniert.

  • Ich habe genau das gleiche Problem. Wenn ich mir die Beispiele auf der Jquery-UI-Site ansehe und versuche, sie zu replizieren, kann ich nicht sehen, was ich anders mache. Liegt es an mir oder ist die “neue” offizielle Autovervollständigung schlechter als Jorns alte?

    – madcapnmckay

    9. Mai 2011 um 1:49 Uhr


  • Ich würde empfehlen, die Option appendTo zu verwenden, auch wenn die Breite kein Problem darstellt. Dadurch können Sie das Widget mit verschiedenen Stilen und Optionen wiederverwenden und nicht alle am unteren Rand Ihres Dokuments schweben lassen.

    – Daniel DelCore

    15. Dezember 2015 um 4:24 Uhr

  • Tut mir leid, ich habe das abgelehnt, Arnauds Antwort ist einfach so viel besser.

    – David Grenier

    29. Februar 2016 um 21:25 Uhr

  • @DavidGrenier Ich glaube nicht, dass Sie eine Antwort ablehnen, weil eine andere Antwort besser ist und fair ist. Es sei denn, Sie haben einen bestimmten Grund, warum diese Antwort nicht nützlich ist. Ich denke, es ist besser, Ihre Präferenz für die andere Frage zu zeigen, indem Sie sie abstimmen, aber ich bin sicher, dass Sie das bereits getan haben 🙂 stackoverflow.com/help/privileges/vote-down

    – Biruk Abebe

    18. Dezember 2017 um 22:15 Uhr


  • Dies ist die beste Lösung

    – Gaurav Chavan

    11. Februar 2020 um 12:32 Uhr

Benutzer-Avatar
obomaye

Ich weiß, dass dies schon lange beantwortet wurde, aber ich denke, es gibt eine bessere Lösung

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

Es funktionierte gut für mich.

  • Sehr schöne Lösung! Vielen Dank!

    – Liron

    22. Dezember 2015 um 20:36 Uhr

  • Schöne Lösung, zur Beachtung, es akzeptiert Eingabeargumente, also lesen Sie das Handbuch vor der Verwendung – zum Beispiel, wenn Sie die Funktion schreiben, wenn NICHT EINE automatische Vervollständigung auf einer Seite steht.

    – Benutzer1954544

    20. Februar 2016 um 20:11 Uhr

  • Dies sollte das Standardverhalten sein

    – BugliL

    26. August 2021 um 9:36 Uhr

Benutzer-Avatar
madcapnmckay

Ich habe mich im Autocomplete-Code umgesehen und der Schuldige ist dieser kleine Mistkerl

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

Ich bin mir nicht sicher, was ul.width(“”) tun soll, aber ui.width(“”).outWidth() gibt immer die Breite des Körpers zurück, weil das ul daran angehängt wird. Daher wird die Breite nie auf die Elementbreite gesetzt….

Wie auch immer. Um dies zu beheben, fügen Sie dies einfach zu Ihrem Code hinzu

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

Ist das ein Fehler?

EDIT: Falls jemand einen reduzierten Testfall für den Fehler sehen möchte hier es ist.

Ich weiß, dass dies vor langer Zeit beantwortet wurde, aber ich bin auf dasselbe Problem gestoßen. Meine Lösung bestand darin, position:absolute hinzuzufügen

  • Zur Verdeutlichung für andere: .ui-autocomplete { position: absolute; }

    – ynkr

    3. August 2012 um 19:23 Uhr

  • Das hat bei mir total funktioniert. Buchstäblich in a gehackt !important und bingo bango, glücklicher chef. #dontVoteTrump #actuallyMakeAmericaGreatAgain

    – Der Dembinski

    27. Juli 2016 um 22:10 Uhr

  • Diese Antwort sollte viel mehr Stimmen haben. Einige andere Antworten scheinen mir ziemlich hackige Lösungen zu sein.

    – Brise

    5. Februar 2020 um 10:29 Uhr

  • Dies ist die beste Antwort.

    – Vibhor Dube

    31. Mai um 14:13 Uhr

Benutzer-Avatar
Erz4444

Legen Sie das CSS im offenen Ereignis fest!

$('#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'); // HERE
            }
        })

  • Zur Verdeutlichung für andere: .ui-autocomplete { position: absolute; }

    – ynkr

    3. August 2012 um 19:23 Uhr

  • Das hat bei mir total funktioniert. Buchstäblich in a gehackt !important und bingo bango, glücklicher chef. #dontVoteTrump #actuallyMakeAmericaGreatAgain

    – Der Dembinski

    27. Juli 2016 um 22:10 Uhr

  • Diese Antwort sollte viel mehr Stimmen haben. Einige andere Antworten scheinen mir ziemlich hackige Lösungen zu sein.

    – Brise

    5. Februar 2020 um 10:29 Uhr

  • Dies ist die beste Antwort.

    – Vibhor Dube

    31. Mai um 14:13 Uhr

Benutzer-Avatar
Nik Olsen

Ich bin auch auf dieses Problem gestoßen, habe aber festgestellt, dass ich einfach vergessen habe, einen Verweis auf das Stylesheet jquery.ui.autocomplete.css einzufügen. Haben Sie dieses Stylesheet in Ihr Layout/Ihre Musterseite aufgenommen?

  • Das war das Problem für mich – und ich vermute, es war für die meisten Menschen auch. Glaubt ihr alle, dass jQ UI standardmäßig so kaputt ist? 😉

    – veraltet

    13. November 2013 um 15:41 Uhr

  • Oder fügen Sie Ihrem CSS Folgendes hinzu, da dies alles in dieser Datei enthalten ist: .ui-autocomplete { position: absolute; top: 0; left: 0; cursor: default; }

    – Christoph Fink

    19. April 2014 um 17:07 Uhr


  • Einige haben es vielleicht vergessen, aber einige sind tatsächlich auf den Fehler / das Problem gestoßen, der in anderen Antworten erklärt wurde

    – userfuser

    4. Juni 2015 um 14:53 Uhr

1304130cookie-checkBreite der automatischen Vervollständigung der jQuery-Benutzeroberfläche nicht richtig eingestellt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy