J'ai un datalist comme ci-dessous -
<input id="name" list="allNames" />
<datalist id="allNames">
<option value="Adnan1"/>
<option value="Faizan2"/>
</datalist>
Ce que je veux, c'est quand un élément est tapé complètement (par exemple dire dans la zone de saisie lorsque l'utilisateur tape complètement "Adnan1") ou sélectionné dans la liste, alors je veux un événement. J'ai essayé quelques approches mais les deux ne m'aident pas jusqu'à présent. Les approches sont -
$("#name").change(function(){
console.log("change");
}
problème avec ceci est que l'événement n'est déclenché que lorsque l'entrée est floue, c'est-à-dire quand je clique quelque part sur l'écran.
J'ai aussi essayé
$("#name").bind('change', function () {
console.log('changed');
});
mais le rappel est déclenché à chaque fois que je tape. J'ai en fait besoin de faire un appel AJAX lorsque l'élément est complètement sélectionné. Soit par saisie ou en sélectionnant dans la liste déroulante.
La première approche est mauvaise pour le point de vue de l'utilisateur car il doit faire un clic supplémentaire et la seconde a un inconvénient car pour chaque lettre un événement sera déclenché.
Tout ce que je veux, c'est un événement lorsque l'utilisateur a fait une sélection ou tapé une phrase complète. existe-t-il un moyen d'y parvenir? tout événement qui me manque et qui peut résoudre mon problème.
Sur navigateurs modernes , vous pouvez utiliser l'événement input
, par exemple:
$("#name").on('input', function () {
var val = this.value;
if($('#allNames option').filter(function(){
return this.value.toUpperCase() === val.toUpperCase();
}).length) {
//send ajax request
alert(this.value);
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<input id="name" list="allNames" />
<datalist id="allNames">
<option value="Adnan1" />
<option value="Faizan2" />
</datalist>
PS: comme l'événement input
a un meilleur support que l'élément datalist , il n'y a en effet aucune raison de ne pas l'utiliser si vous utilisez déjà l'élément datalist
.
Vous pouvez utiliser l'événement input
pour obtenir ces fonctionnalités, comme ci-dessous:
$(document).ready(function() {
$('#name').on('input', function() {
var userText = $(this).val();
$("#allNames").find("option").each(function() {
if ($(this).val() == userText) {
alert("Make Ajax call here.");
}
})
})
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="name" list="allNames" />
<datalist id="allNames">
<option value="Adnan1" />
<option value="Faizan2" />
</datalist>
Solution simple
document.getElementById('name').addEventListener('input', function () {
console.log('changed');
});
Vérifiez si this fonctionne pour vous:
var dataList=[];
$("#allNames").find("option").each(function(){dataList.Push($(this).val())})
console.log(dataList);
$("#name").on("keyup focus blur change",function(){
if(dataList.indexOf($(this).val())!=-1)
console.log("change");
})
J'ai poussé les options de la liste de données dans le tableau, et lors de la modification de la touche, du flou ou du focus de l'événement, je vérifie si la valeur d'entrée existe dans mon tableau de données.