2010-12-29 7 views
66

Ich habe überall gesucht, aber ich kann keine Hilfe zu finden scheinen ...Bind jQuery UI zur automatischen Vervollständigung mit .live()

ich einige Textfelder haben, die dynamisch über JS erstellt werden, so muss ich Binden Sie alle ihre Klassen an eine Autovervollständigung. Daher muss ich die neue .live() -Option verwenden.

Als Beispiel alle Einzelteile mit einer Klasse von .foo zu binden, jetzt und Zukunft geschaffen:

$('.foo').live('click', function(){ 
    alert('clicked'); 
}); 

Es dauert (und verhält sich) die gleiche wie .bind(). Allerdings möchte ich eine Autovervollständigung binden ...

Das funktioniert nicht:

$('.foo').live('autocomplete', function(event, ui){ 
    source: 'url.php' // (surpressed other arguments) 
}); 

Wie kann ich .live() zur automatischen Vervollständigung binden?

UPDATE

Figured es mit Framer aus:

$(function(){ 
    $('.search').live('keyup.autocomplete', function(){ 
    $(this).autocomplete({ 
     source : 'url.php' 
    }); 
    }); 
}); 
+2

+1 für Lösung Posting – ehftwelve

+7

als Update, 'Live()' ist veraltet, jetzt ' on() 'verwendet wird, dies zu tun, wie:' $ (document) .auf ("keyup.autocomplete", '.autocomplete', function() {$ (this .autocomplete) ({...});}) '... – devdRew

+0

Gibt es eine Möglichkeit, dieses Verhalten zu erreichen, ohne die Autocomplete-Methode für jedes hinzugefügte Element aufzurufen, sondern stattdessen die Autocomplete-Methode einmal und nur einmal aufzurufen? –

Antwort

18

Wenn Sie mit der jquery.ui.autocomplete.js diese

.bind("keydown.autocomplete") or .live("keydown.autocomplete") 

wenn nicht stattdessen versuchen, verwenden Sie die jquery.ui.autocomplete.js und sehen, ob es

arbeiten werde Wenn das nicht zutrifft, weiß ich nicht, wie um Ihnen zu helfen bro

+2

Ich benutze ui.autocomplete, und Sie verbindlich funktioniert :). Ich kann eine Warnung auslösen ... aber das macht es nicht wirklich zu einer automatischen Vervollständigung ... Wenn ich versuche, was ich in meiner Antwort aktualisiert habe, bekomme ich Syntaxfehler ... – sethvargo

+0

hmm .. Syntaxfehler? –

+2

Das ergibt für mich keinen Sinn. Die automatische Vervollständigung wurde dem neuen Element noch nicht hinzugefügt, sodass Sie keine Bindung an die von ihm generierten Ereignisse herstellen können. Die richtige Antwort ist die unten von Dan. – mynameistechno

1

die automatische Vervollständigung kein Ereignis ist eher eine Funktion, die für eine Textbox zur automatischen Vervollständigung Funktionalität ermöglicht.

Also, wenn Sie die js ändern können, die die Textfelder dynamisch erstellt, um das Textbox-Element als ein jquery-Objekt zu umbrechen und Autocomplete für dieses Objekt aufzurufen.

3

Sie können nicht. .live() unterstützt nur tatsächliche JavaScript-Ereignisse und kein benutzerdefiniertes Ereignis. Dies ist eine grundlegende Einschränkung der Funktionsweise von .live().

9

einfach hinzufügen, können Sie das .livequery Plugin für diesen Einsatz:

$('.foo').livequery(function() { 

    // This will fire for each matched element. 
    // It will also fire for any new elements added to the DOM. 
    $(this).autocomplete(options); 
}); 
+0

Dies ist das beste und jemals coolste Plugin, das ich je gefunden habe! Dies funktioniert auch mit Datepicker, nehme ich an! Ich war für diese Suche, da ich mit jquery arbeiten ... ich nur einmal abstimmen kann .... mein schlechtes ... – workdreamer

+0

Sehr Empfehlen Plugin, das wird entfernen Sie Ihre Kopfschmerzen – GusDeCooL

1

Ich habe gerade bemerkt, dass Sie Ihren Beitrag mit dieser Antwort bearbeitet haben. Es war für mich offensichtlich, also poste ich es unten für andere. Vielen Dank.

$(function() 
{ 
    $('.search').live('keyup.autocomplete', function() 
    { 
    $(this).autocomplete({ source : 'url.php' }); 
    }); 
}); 
+0

Damit wird .search Elemente in ein Autovervollständigungs Element nach eine Taste wird gedrückt. Autovervollständigung sollte BEVOR eine Taste gedrückt wird, funktionieren und sie sollte nur einmal statt nach jedem Tastenereignis initialisiert werden. –

70

jQuery UI automatische Vervollständigung Funktion fügt automatisch die Klasse "ui-Auto-Vervollständigen-Eingang" auf das Element. Ich würde empfehlen, das Element im Fokus ohne die Klasse "ui-autocomplete-input" live zu binden, um eine erneute Bindung bei jedem Keydown-Ereignis innerhalb dieses Elements zu verhindern.

$(".foo:not(.ui-autocomplete-input)").live("focus", function (event) { 
    $(this).autocomplete(options); 
}); 

bearbeiten

Meine Antwort ist jetzt veraltet, da jQuery 1.7, siehe Nathan Strutz Kommentar für die Verwendung mit der neuen .on() Syntax.

+1

Dies ist die richtige Antwort. Binding auf Key-up scheint nicht für den allerersten Tastendruck zu binden. Sehr kluges Denken. Vielen Dank. –

+1

Danke. Ich fand "Fokus" ist besser als "Keydown". – Cynial

+0

Danke, ausgezeichnet – kaklon

5

.Live() funktioniert nicht mit Fokus. auch keyup.autocmplete macht keinen Sinn. Stattdessen haben das, was ich versucht und Arbeits ist diese

$(document).ready(function(){ 
$('.search').live('keyup' , function() 
    { 
    $(this).autocomplete({ source : 'url.php' }); 
    }); 
}) 

Das perfekt funktioniert gut.

2

können Sie versuchen, mit diesem:

$('.foo').live('focus.autocomplete', function() { 
    $(this).autocomplete({...}); 
}); 
1

Dies funktioniert für mich:

$(function() 
{ 
    $('.item_product').live('focus.autocomplete', function() 
    { 

    $(this).autocomplete("/source.php/", { 
     width: 550, 
     matchContains: true, 
     mustMatch: false, 
     selectFirst: false, 
    }); 

    }); 
}); 
2

Nach der Lektüre und Prüfung alle anderen Antworten der ich es für die aktuelle Version von JQuery aktualisiert haben und machte ein paar zwickt.

Das Problem mit der Verwendung von Keydown als das Ereignis, das .autocomplete() aufruft, ist, dass es für diesen ersten geschriebenen Buchstaben Autocomplete fehlschlägt. Fokussieren ist die bessere Wahl.

Eine andere Sache, die ich bemerkt habe ist, dass alle angegebenen Lösungen führen in .autocomplete() mehrfach aufgerufen werden. Wenn Sie der Seite dynamisch ein Element hinzufügen, das nicht mehr entfernt wird, sollte das Ereignis nur einmal ausgelöst werden. Auch wenn der Artikel wieder entfernt werden und das hinzugefügt ist, sollte das Ereignis entfernt werden und dann hinzugefügt jedes Mal wieder das Element entfernt oder hinzugefügt, so dass wieder auf dem Feld konzentriert unnötig wird nicht .autocomplete() jedes Mal anrufen.

Mein letzter Code ist wie folgt:

$(document).on('focus.autocomplete', '#myAutocomplete', function(e){ 
    $(this).autocomplete(autocompleteOptions); 
    $(document).off('focus.autocomplete', '#myAutocomplete'); 
}); 
+0

Dies ist die beste Antwort, die ich gesehen habe, aber immer noch nicht das, was ich gesucht habe. Ich dachte, der Sinn der 'on'-Methode sei, dass du dich an das nächste Elternteil bindest, von dem du weißt, dass es NICHT ersetzt wird, du wirst also nur einmal binden. Hier binden Sie sich einmal an eine Funktion, die die Autovervollständigung jedes Mal bindet, wenn neue Elemente hinzugefügt werden. Verpasst das nicht den Punkt ein bisschen? I.e. Die Autocomplete-Bindung wird jedes Mal ausgeführt, wenn neue Eingabeelemente statt nur einmal hinzugefügt werden. –

+1

Sie haben Recht über 'on()', aber Autocomplete ist kein Ereignis. Jedes Mal, wenn das Element ersetzt wird, muss die Autocomplete-Funktion für dieses Element erneut aufgerufen werden. Sie können es so implementieren, dass das Aufrufen von Autocomplete zum Ersetzen des Elements gehört, oder Sie können einen Ereignis-Listener einrichten, der automatisch Autocomplete aufruft, wenn Sie sich auf ein Element mit der Klasse "Autocomplete" konzentrieren. Die eine oder andere automatische Vervollständigung muss jedes Mal aufgerufen werden, wenn das Element ersetzt wird. Ich bin offen für die Lösungen anderer Leute und hoffe, dass das jQuery-Team diesen Nachteil in einer zukünftigen Version beheben wird. –

8

zum automatischen Vervollständigung Funktion zu erhalten, wenn dynamisch für das on() Ereignis verwendet in jQuery> 1.7, mit der Syntax Nathan Strutz in seinem Kommentar bietet geladen:

$(document).on('focus', '.my-field:not(.ui-autocomplete-input)', function (e) { 
    $(this).autocomplete(options) 
}); 

wo .my-field ist ein Selektor für die automatische Vervollständigung Eingabeelement.

0

Sie können nur die Autovervollständigung innerhalb Eingang Live-Event setzen, wie folgt aus:

$('#input-element').live('input', function(){ 
 
    
 
$("#input-element").autocomplete(options); 
 

 
});

Verwandte Themen