2009-07-29 7 views
1

J'utilise le plugin jquery autocomplete, et j'essaie de déclencher la saisie semi-automatique manuellement en fonction de certaines clés entrées par l'utilisateur. J'essaie de lier l'autocomplétion à l'entrée à la volée afin que la saisie semi-automatique puisse commencer à rechercher des correspondances une fois qu'un utilisateur entre une certaine touche pour déclencher "J'entre maintenant les données à rechercher", ce qui pourrait être au milieu du champ, pas nécessairement au début.jquery keypress event pour déclencher la saisie semi-automatique uniquement sur des codes-clés spécifiques

Je lie un événement de pression sur une entrée. Lorsque l'utilisateur entre une certaine clé, comme "=", je veux afficher tous les éléments dans le tableau. Lorsque l'utilisateur entre alors une lettre, les options correspondant au tableau pour ce caractère sont automatiquement complétées. Cela essaie plus ou moins d'imiter ce qui se passe dans Excel, quand un utilisateur frappe la touche égale et voit les fonctions disponibles, sauf que la touche "=" ne doit pas être le premier élément de l'entrée, elle doit automatiquement être complétée " = "est pressé et déconnecté ce courant alternatif chaque fois qu'une option est sélectionnée.

var array1 = ['one','two','three']; 

$.input1.bind('keypress', function(event) { 
    var keyCode; 
    if (event.keyCode > 0) { 
    keyCode = event.keyCode; 
    } else if (typeof(event.charCode) != "undefined") { 
    keyCode = event.charCode; 
    } 

    if (String.fromCharCode(keyCode) == '=') { 
    $.input1.unbind('keypress'); 

    $.input1.autocomplete(array1); 

    $.input1.blur(); 
    $.input1.focus(); 
    e = $.Event('keydown'); 
    e.which = keyCode; 
    $.input1.trigger(e); 
    } 

}); 

Même si je reçois la saisie semi-automatique pour déclencher, si l'utilisateur a entré quoi que ce soit avant que le texte qui pourrait correspondre, il ne correspondraient pas à cause du texte précédent. Ainsi, si l'utilisateur entre "abd =", la saisie semi-automatique obtient "abb =" comme paramètre q et pas seulement "=".

Toute aide est vraiment appréciée, im tellement coincé !!

Répondre

4

Ce dont vous avez vraiment besoin, c'est de pouvoir filtrer la valeur du champ avant que le plug-in autocomplete ne fasse la recherche. En regardant le plugin, il ne semble pas que cela soit intégré. MAIS cela ne nous empêche pas de l'ajouter.

ouvrir le code de plug-in et trouver la fonction lastWord(), regardez la ligne 261. Ensuite, ajoutez cela à cette fonction:

if (options.formatValue){ 
    value = options.formatValue(value); 
} 

Ainsi, la fonction lastWord devrait ressembler à:

function lastWord(value) { 
    if (options.formatValue){ 
     value = options.formatValue(value); 
    } 
    if (!options.multiple) 
     return value; 
    var words = trimWords(value); 
    return words[words.length - 1]; 
} 

Puis dans votre code jquery vous pouvez faire quelque chose comme ceci:

$(document).ready(function(){ 
    var array1 = ['one','two','three']; 
    $('#test').autocomplete(array1,{ 
       formatValue: function(value){ 
        if (value.search('=') == -1) return ''; 
        return value.substring(value.search('=')+1); 
       } 
    }); 
}); 

cela vous permettra de filtrez et formatez la valeur du champ avant la recherche. Puisque vous voulez seulement faire la recherche si la valeur a le caractère "=" dedans vous la recherchez et si elle n'est pas trouvée vous renvoyez une chaîne vide. Si vous l'avez trouvé, supprimez-le et tout ce qu'il contient avant de retourner ce que l'utilisateur tape après.

+0

hey petersendidit, Merci beaucoup pour la réponse. Après avoir tâté pendant 2 jours, j'ai pensé qu'il devait y avoir une sorte de personnalisation du plugin lui-même. Mes exigences sont devenues un peu plus compliquées. Une fonction a des paramètres, et chaque paramètre est autocompleted à d'autres tableaux. Donc une fonction appelée "functionX" aurait une forme de "function()" qui apparaîtrait avec le "=" ou une forme de "[param]". Lorsque l'utilisateur appuie sur la touche "[", la saisie semi-automatique passe à la recherche sur le tableau de ce paramètre.Donc, si l'utilisateur tapait "abc [", il regarderait alors l'autre. –

+0

Donc chaque fonction a 2 formes, 1 forme est comme functionName() qui tout se montrerait si l'utilisateur tape "=", et l'autre forme qui est juste un enclos enclosure et un enclosureEnd char. Ainsi, lorsque l'utilisateur clique sur la touche "[" dans mon exemple, aucun résultat ne doit revenir, mais sur la clé suivante, l'utilisateur doit voir les résultats du paramètre de saisie semi-automatique des paramètres de la fonction. Cela a-t-il un sens? Je peux vous envoyer un cas d'utilisation détaillé si je pouvais le rendre plus clair ... Encore une fois, merci beaucoup pour l'aide! –

1

Vous pouvez modifier vos autocomplete.js en ajoutant la deuxième ligne de code

... 
    .bind("keydown.autocomplete", function(event) { 
+ self.options.keydownEvent=event; 
    if (self.options.disabled) {... 

Ensuite, vous référer à keydownEvent dans votre fonction Sorce comme celui-ci

source:function(){ 
var event=this.options.keydownEvent; 
... //Handling the event 

Rappelez-vous que l'événement var a une quel champ. Par exemple si event.which 13 alors la touche Enter a été pressée. J'espère que cela aide.

Questions connexes